Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用select()和大量文件描述符的外部代码 我有一个用C++编写的服务器程序,它在Linux上运行,并使用TCP实现基于推送的消息服务。由于推送方式,我计划的同时连接可能有很多,大约100万个,需要保持更长的时间。大多数情况下,这些连接都处于空闲状态,偶尔会有心跳,传输通常会在许多连接上同时发生_C++_Linux_Sockets_Select_Epoll - Fatal编程技术网

使用select()和大量文件描述符的外部代码 我有一个用C++编写的服务器程序,它在Linux上运行,并使用TCP实现基于推送的消息服务。由于推送方式,我计划的同时连接可能有很多,大约100万个,需要保持更长的时间。大多数情况下,这些连接都处于空闲状态,偶尔会有心跳,传输通常会在许多连接上同时发生

使用select()和大量文件描述符的外部代码 我有一个用C++编写的服务器程序,它在Linux上运行,并使用TCP实现基于推送的消息服务。由于推送方式,我计划的同时连接可能有很多,大约100万个,需要保持更长的时间。大多数情况下,这些连接都处于空闲状态,偶尔会有心跳,传输通常会在许多连接上同时发生,c++,linux,sockets,select,epoll,C++,Linux,Sockets,Select,Epoll,为了使事情顺利进行,我正在使用epoll对大量套接字进行多路复用,通过修改RLIMIT_NOFILE,它实际上对大量套接字非常有效 我的问题是,我还在同一个程序中使用其他类型的连接,最明显的是FastCGI使用FastCGI SDK中的libfcgi来接受HTTP请求,HTTP请求使用select作为其内部文件描述符。当这些文件描述符变得大于1024 FD_SETSIZE时,这会导致问题,如果程序的epoll部分使用了1024以下的大部分FD编号,则必然会发生这种情况 我想知道最好的处理方法是什

为了使事情顺利进行,我正在使用epoll对大量套接字进行多路复用,通过修改RLIMIT_NOFILE,它实际上对大量套接字非常有效

我的问题是,我还在同一个程序中使用其他类型的连接,最明显的是FastCGI使用FastCGI SDK中的libfcgi来接受HTTP请求,HTTP请求使用select作为其内部文件描述符。当这些文件描述符变得大于1024 FD_SETSIZE时,这会导致问题,如果程序的epoll部分使用了1024以下的大部分FD编号,则必然会发生这种情况

我想知道最好的处理方法是什么

我是否需要修改所有使用select和use poll的外部代码

是否有办法强制我的基于epoll的代码(特别是accept调用)只使用1024以上的文件描述符,以便下面的描述符保留给基于选择的代码


我知道可能会以某种方式增加FD_SETSIZE的价值,但我认为这会严重影响性能,因为select的工作方式,我认为这是一种黑客行为,而不是真正的解决方案。

我建议将这些东西转移到他们自己的流程中,以便他们获得自己的文件描述符。我建议您使用一个协议,在单个TCP连接上多路传输大量TCP连接。您的服务器将与多路复用器而不是单个客户端进行通信。多路复用器可以在同一台机器或不同的机器上运行,它可以处理数以万计的客户端连接,并且只与服务器建立一个连接

这样做的一大优点是,您的服务器不必处理大量TCP连接状态。它不必处理诸如丢包、重传、重复包、恶意SYN、慢速链接等互联网垃圾。它不必为每个客户机都提供发送缓冲区,只需与能够为客户机提供缓冲的快速、干净的多路复用器通信即可


如果这项工作太多或由于某种原因无法完成,可以使用dup2将文件描述符重新编号为编号更高的描述符。不过,我强烈建议使用多路复用器—您试图处理的连接数量太多,无法从单个进程中处理。

服务器已经被指定为多个实例运行,客户端可以随机或根据负载选择一个可用服务器。添加另一层多路复用可能是可能的,但需要对代码进行更大的更改,因此我现在不想采用这种方法。dup2听起来很有希望。现在,我只需要找出如何确保传递给dup2的新FD没有在其他地方使用,因为我不希望dup2关闭随机FD。您试图处理的连接数量太多,无法通过单个进程完成。真的是这样吗?它们大部分时间都是空闲的,当传输某个数据时,实际上对所有或一组数据都是相同的数据。我猜TCP重新传输可能会成为我测试的许多客户端的问题,这些客户端大多是在同一台物理机器上的服务器和客户端,客户端运行在不同的虚拟机上,但是如果服务器在大多数时间都要花几秒钟来回答所有请求,这对于我的用例来说已经足够快了。@Alemariunsexus在启动时,也许可以通过打开/dev/null打开尽可能多的文件描述符,以满足配置的限制。关闭1024以下的。现在您有了一个要复制的文件描述符池。使用完文件描述符后,不要关闭它们,而是将其中一个备用文件描述符复制到它们上。好主意,这会起作用。但我刚刚发现了fcntl的F_DUPFD标志,它似乎与dup2基本相同,但使用最小fd数而不是固定的fd数,因此它会自动选择一个有效的fd数。