我正在尝试从{strong>客户端 while()
循环中连续发送 10,000 XML请求到网关(充当服务器到此客户端)通过 UDP 传输。网关实施select()
函数调用以监控 read_fds 。在Gateway中,我传递给struct timeval
的{{1}}值为:
select()
每个XML请求都是 1500 字节,客户端和网关都是 用C ++编写,二进制文件在Linux上运行(RHEL 5)
有两种情况:
案例1:
在客户端,如果我在tv.tv_sec = 5;
tv.tv_usec = 0;
循环中连续发送 10,000 XML请求,并在每个请求之间使用while()
实现 500 微秒的延迟,网关接受所有 10,000 请求,解析它并将请求记录到.log文件中。
案例2:
在客户端,如果我在usleep()
循环中连续发送 10,000 XML请求而没有任何延迟,则网关仅接受 2,600 请求,解析它并记录请求到.log文件。
问题: 我怎么能增加号码。网关接受的请求,而没有在客户端实施延迟?另请告诉我客户在案例2 中剩余的 7,400 请求会发生什么情况,这些请求会丢失吗?
答案 0 :(得分:1)
如果服务器端接收缓冲区读取速度不够快,则其余消息确实丢失:这就是UDP的工作方式。
如果您只需要处理10000条消息(而不是处理持续流量),您可以增加缓冲区大小:sysctl -w net.core.rmem_max=nnnnnnn
。
或者,开始分析服务器读取循环中花费的时间。你可以,例如删除所有解析和日志记录作为测试,并只计算您收到的消息数量:如果这可以帮助您达到接近10000的数字,那么这意味着解析和日志记录对于该循环来说太慢了。
要检查的另一件事是查看您正在丢失哪些消息:如果您在早期消息中(例如在前100条消息中)获得持续的消息丢失,那么这意味着路上的其他内容无法处理快速的消息 - 在这种情况下,服务器上的接收缓冲区不应该受到责备。