我有一个客户端通过localhost与TCP通信。服务器在阻塞模式下使用Boost ASIO iostream。它接受传入连接,读取请求,发送响应并关闭套接字。问题是 - 有时服务器在第一次通过getline读取时会有10-200毫秒的随机延迟。我在服务器和客户端的套接字上都设置了TCP_NODELAY标志。这种延误的原因是什么?我知道,我应该在从套接字读取之前使用select,但我预计通过localhost不应该有这么大的延迟。
以下是服务器代码的相关部分:
asio::io_service io_service;
ip::tcp::endpoint endpoint(bindAddress, 80);
ip::tcp::acceptor acceptor(io_service, endpoint);
for(;;)
{
ip::tcp::iostream stream;
acceptor.accept(*stream.rdbuf(), peer);
ip::tcp::no_delay no_delay(true);
stream.rdbuf()->set_option(no_delay);
string str;
getline(stream, str); // at this line i get random delays
//the main part of code
}
我有大约200个请求/秒,延迟每分钟发生几次。 netstat -m显示,有足够的缓冲区。
更新:
看起来像客户端的问题,而不是服务器:Apache HttpClient random delays under high requests/second
答案 0 :(得分:0)
为了解决这个问题而回答这个问题。
Apache HttpClient random delays under high requests/second
Apache的ab(1)也具有类似“锯齿”的性能,因为它通过select(2)调度它监视的-c连接,然后一旦所有连接都返回,它将调度另一个-c连接。备用(和更好)的方法是建立一个新连接,并将文件描述符读入ab(1)的select(2)数组,以确保-c连接始终处于活动状态。
我看到ab(1)给出了一些非常误导性的结果,因为一千个连接中的一个连接(仍然不是一件好事,但是当通过负载平衡器使用它时,它会非常消极地扭曲结果)。