gpt4 book ai didi

c++ - 在 select 上处理 FD_SETSIZE

转载 作者:太空宇宙 更新时间:2023-11-04 04:00:28 27 4
gpt4 key购买 nike

我们有一个使用 select() 设计的网络服务器,直到上周才真正看到太多负载,并且在我们的 500-1000 conn/s 负载下始终可以正常工作。然而,我们最近开始看到更高的负载(和尖峰)并遇到了 select() 在看到套接字句柄 > FD_SETSIZE 后变得疯狂的问题。如果它的 FD_SET 中有任何 > FD_SETSIZE 的东西,这只会在重复超时后卡住服务器,选择进入一个牢不可破的循环。切换到 poll(或 epoll)的选项现在不存在,我们必须坚持使用 select。我现在修复它的方法是增加监听队列,当我看到一个新连接返回 accept() 时停止接受新连接 >= FD_SETSIZE 并返回到监听套接字上的 select() 。这是可行的,因为操作系统会回收文件句柄并始终尝试提供最小的可用句柄。但不利的是,如果套接字句柄 >= FD_SETSIZE,我最终会在调用 accept() 时向某些连接发送 RST。现在这仍然是可以接受的,因为它使服务器保持运行并且连接丢失率约为 5%。有没有一种方法可以在不断开这些连接的情况下做到这一点。我不想对所有使用过的 handle 和其他东西进行计数,这让它变得太复杂了。创建一个伪造的套接字,检查它的句柄并在调用 accept 之前关闭它,将相当准确地估计操作系统接下来要给我的句柄。

while(max_conn_to_accept--){
SOCKET a_s = accept(..);
if(a_s >= FD_SETSIZE){
close(a_s);
return;
}

最佳答案

只需提高 FD_SETSIZE。在编译器命令行上指定 -DFD_SETSIZE=16384

我认为您的版本足够新,没有其他问题。如果您在头文件中遇到错误,您可能需要调整一两行。

例如,如果您看到这样的内容:

#undef __FD_SETSIZE
#define __FD_SETSIZE 1024

改成这样:

#undef __FD_SETSIZE
#ifndef FD_SETSIZE
#define __FD_SETSIZE 1024
#else
#define __FD_SETSIZE FD_SETSIZE
#endif

或者如果你看到:

#define FD_SETSIZE      1024

将其更改为:

#ifndef FD_SETSIZE
#define FD_SETSIZE 1024
#endif

但是,我再次强调,您不需要进行任何更改。

关于c++ - 在 select 上处理 FD_SETSIZE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355927/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com