增加网关的负载能力

Increasing the load capacity on Gateway

本文关键字:能力 负载 网关 增加      更新时间:2023-10-16

我试图发送10,000 XML请求连续在while()循环从客户端网关(它作为一个服务器到这个客户端)通过UDP传输。网关实现select()函数调用,监控read_fds。在Gateway中,我传递给select()struct timeval值为:

tv.tv_sec = 5;
tv.tv_usec = 0;

每个XML请求是1500字节,客户端和网关都是用c++编写,二进制文件在Linux (RHEL 5)上运行

有两种情况:

案例1:在客户端,如果我在while()循环中连续发送10,000个 XML请求,并在每个请求之间使用usleep()实现500微秒的延迟,网关接受所有10,000个请求,对其进行解析并将请求记录到.log文件中。

案例2:在客户端,如果我在while()循环中连续发送10,000个 XML请求,没有任何延迟,网关只接受2,600个请求,解析它并将请求记录到.log文件中。

问题:我怎样才能增加?在客户端没有实现延迟的情况下,网关接受了多少请求?另外,请告诉我在案例2中,来自客户端的剩余 7400 请求发生了什么,它们丢失了吗?

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

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

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

另一件要检查的事情是看看你丢失了哪些消息:如果你在早期的消息中(例如,在前100条消息中)得到持续的消息丢失,那么这意味着路上的其他东西不能这么快地处理消息——在这种情况下,服务器上的接收缓冲区不应该受到指责。