增加Gateway的负载能力

时间:2014-03-10 13:46:49

标签: c++ linux select udp udpclient

我正在尝试从{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 请求会发生什么情况,这些请求会丢失吗?

1 个答案:

答案 0 :(得分:1)

如果服务器端接收缓冲区读取速度不够快,则其余消息确实丢失:这就是UDP的工作方式。

如果您只需要处理10000条消息(而不是处理持续流量),您可以增加缓冲区大小:sysctl -w net.core.rmem_max=nnnnnnn

或者,开始分析服务器读取循环中花费的时间。你可以,例如删除所有解析和日志记录作为测试,并只计算您收到的消息数量:如果这可以帮助您达到接近10000的数字,那么这意味着解析和日志记录对于该循环来说太慢了。

要检查的另一件事是查看您正在丢失哪些消息:如果您在早期消息中(例如在前100条消息中)获得持续的消息丢失,那么这意味着路上的其他内容无法处理快速的消息 - 在这种情况下,服务器上的接收缓冲区不应该受到责备。