我正在尝试在 Linux 计算机(CentOS Linux 版本 7.3.1611)上设置 Heartbeat 客户端,该客户端向大约 1300 个主机发送 ICMP 回显请求。然而,未来这个数字将会更高。 Heartbeat 生成的消息将被发送到另一台服务器上的 Logstash 实例。
这些请求每 3 分钟一次发出一次。第一轮请求后,大量此类消息包含错误:
"write ip4 0.0.0.0->x.x.x.x: sendto: no buffer space available"
我尝试了多种方法来缓解此问题,包括错开请求,以减少 1 秒内发出的请求。这导致了该管道末尾的数据同步问题(并且没有完全解决问题),因此这对我来说并不是一个真正可行的选择。
在线研究使我增加了系统分配给 TCP/IP 连接的内存,但据我所知,这些是 ICMP 请求,应该是分开的。
我也无法恢复网络接口,因为机器是远程的,而且我没有办法返回来将其恢复。
我还测试了增加(并设置为 0) /proc/sys/net/ipv4 中的 icmp_ratelimit 变量,但这也没有帮助。
我的问题很笼统,什么可能导致这个问题?我是否需要在系统上调整某种变量,以允许这些请求同时发出?我无法真正推断出错误消息引用的缓冲区。
任何帮助将不胜感激...
PS:如果需要进一步说明,我很乐意提供。
编辑
仍然不确定其他地方是否存在故障,但是增加由 wmem_max、wmem_default、rem_max、rem_default 变量确定的套接字缓冲区的大小已经/proc/sys/net/core
解决了该问题。所有 ICMP 回显请求的数据总大小可能太大,无法低于之前的最大值 208kb,因此其中大量数据将被丢弃。并没有真正解释为什么丢弃的请求数量每次都会有所不同,也许存在潜在的问题......
现在我唯一的问题是,每次重新启动系统时,这些变量都会重置为 208kb。如何使这些更改持久存在?