Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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/0/performance/5.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
空气间隙Linux笔记本电脑上的c_C_Performance_Sockets - Fatal编程技术网

空气间隙Linux笔记本电脑上的c

空气间隙Linux笔记本电脑上的c,c,performance,sockets,C,Performance,Sockets,我用C编写了一个简单的echo服务器(from),在localhost上一切都很好。然后我决定尝试将10000次“客户端”点击紧密地连接到服务器。它没有立即声称我打开了太多的文件。因此,我缩小到1022,它工作了(建立了1022个连接,发送和接收数据)。我还发现我可以超越上限(在非特权模式下4094个,在特权模式下1百万个)。我当时感觉很好,但在开始做select()或epoll()之类的事情之前,我决定对非特权运行进行压力测试。我可以在大约0.5秒内连接并发送4000次(我避免了4096次左右

我用C编写了一个简单的echo服务器(from),在localhost上一切都很好。然后我决定尝试将10000次“客户端”点击紧密地连接到服务器。它没有立即声称我打开了太多的文件。因此,我缩小到1022,它工作了(建立了1022个连接,发送和接收数据)。我还发现我可以超越上限(在非特权模式下4094个,在特权模式下1百万个)。我当时感觉很好,但在开始做
select()
epoll()
之类的事情之前,我决定对非特权运行进行压力测试。我可以在大约0.5秒内连接并发送4000次(我避免了4096次左右的时间)(无需
printf()
logging)。我可以用几乎相同的时间连续做三次。第四次大约需要6.0秒。然后我得到大约11.0秒的时间。相同的客户端程序(发送4000个5个字母的单词)未更改的服务器程序(只有5个作为
MAXPENDING
的值)。。。在我等待11.2097秒的3到4次跑步后,它又回到0.5秒(3次),然后是6秒,然后又是11秒这感觉就像是我用完了某种游泳池(大约12或13000?),那是用来取的,然后需要垃圾收集。。。。慢慢地。。。我很乐意以不同的方式做事,但我不知道问题是什么,也不知道解决方法是什么。我还将服务器移动到一个具有自己IP
addr
的虚拟机上,结果完全相同。有谁能告诉我幕后可能发生的事情,以及管理这些事情的最佳做法是什么

我认为可以通过
setsockopt(TCP_NODELAY)
来抑制Nagle的算法来解决这个问题,但结果是相同的:.5、.5、6、11、11、11 如果我尽可能快地重复,它会暂时“崩溃”服务器几秒钟。但最终(“崩溃”或没有“崩溃”),我们将在0.5秒内返回4000个“回声”

在64位Ubuntu 18.04上运行gcc。。。gcc-v给了我:

Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 


for(i=0; i<CLIENT; i++)
{
    if (connect(sock[i], (struct sockaddr *) &echoserver[i], sizeof(echoserver[i])) < 0) Die("Failed to connect with server");

    echolen = strlen(argv[2]);
    if (send(sock[i], argv[2], echolen, 0) != echolen) Die("!");

    while (received < echolen) {
      int bytes = 0;
      if ((bytes = recv(sock[i], buffer[i], BUFFSIZE-1, 0)) < 1) Die("!rcv");
      received += bytes;
      buffer[i][bytes] = '\0';
    }
    close(sock[i]);
}
线程模型:posix
gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.10)

对于(i=0;iNetstat赢了这一天。感谢评论员杰里米·弗里斯纳。问题是插槽在
TIME\u WAIT
状态下仍然打开。当然,我会继续尝试绕过这个状态。似乎
TIME\u WAIT
是不可避免的。如果是这样,我希望能够将系统的
MAX\u open
提高到一个值ger超过16384。对这个问题的评论是非常受欢迎的。如果我解决了它,我会自己评论。
时间等待
在我的笔记本电脑上持续60秒。我怎么知道这一点?
日期;netstat | wc
…老实说,我从来都不是netstat、netcat、nc或其他系统工具的忠实粉丝。但这是最重要的愚蠢的,先入为主的我。netstat很好。也感谢其他的评论者,他们把我推向了正确的方向。谢谢,一个叫tad的人…谢谢,只是说…

你能在问题中包含相关的代码而不是作为外部链接吗?这有助于使你的问题保持独立并集中在问题上。我假定“在我开始做select()或epoll()之类的事情之前"意味着您在未意识到的情况下淹没了写入缓冲区。您需要
select`或等效程序来告诉您套接字何时准备好写入,您必须注意,否则堆栈将抛出您的写入操作。在每次测试后在您的计算机上运行netstat可能会提供信息——TCP套接字通常会在内核中停留一段时间在程序关闭它们之后输入ime(以避免无意中重用旧连接,IIRC),可能是内核的套接字表暂时被填满了。您能否详细说明一下“它会暂时“崩溃”服务器几秒钟”?我包含的链接包含echo服务器和echo客户端的代码。我将这两个程序逐个字符地从这台机器复制到我的气隙机器上。因此…在下面的代码(我刚刚复制)中,其中显示“死(“连接到服务器失败”)这就是我所说的“崩溃”的意思。显然服务器没有崩溃,但错误消息暗示了连接问题。以下是没有链接的相关代码(客户端代码):(一分钟后-发布整个程序太长了)