【问题标题】:Increasing the load capacity on Gateway增加网关的负载能力
【发布时间】:2014-03-10 13:46:49
【问题描述】:

我正在尝试在while() 循环中连续发送 10,000 个 XML 请求,从 ClientGateway(充当服务器此客户端)通过 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 中来自客户的剩余 7,400 个请求会发生什么情况,它们是否丢失了?

【问题讨论】:

  • 尝试epoll 与边缘触发选项。

标签: c++ linux select udp udpclient


【解决方案1】:

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

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

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

要检查的另一件事是查看您丢失了哪些消息:如果即使在早期消息中(例如,在前一百条消息中),您也经常丢失消息,那么这意味着其他东西在途中无法处理消息这么快——在这种情况下,服务器上的接收缓冲区不应该受到责备。

【讨论】:

  • sysctl -p | grep mem net.core.rmem_max = 41943040 net.core.wmem_max = 41943040 net.core.rmem_default = 4194304 net.core.wmem_default = 4194304
  • 我试图检查我的系统参数,但是已经为缓冲区设置了 8 位的最大大小,正如你提到的 7 位,现在我怀疑最大大小限制是多少,还想知道我是否可以在参数值之上进行更多调整,因为它们似乎已经设置为最大值。
  • 或者开始分析您的 while 循环中花费的时间。 抱歉,您说的是哪个 while 循环?
  • 对不起,不是说“while循环”:试图引用处理接收缓冲区的服务器循环。我改进了答案的那一部分。也就是说,您的net.core.rmem_max 值已经非常大了:绝对足以容纳 10000 条消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多