php-fpm php_network_getaddresses调用随机启动失败,坏udp cksum

我们在AWS上的ubuntu实例上运行了许多Web服务器(nginx,php5.6-fpm)。 他们已经运行好几个月了,但是在过去的几天里,我们已经开始讨论一个事件发生后一切正常,但在12个小时左右之后,networking调用开始失败(特别是在这个实例套接字tcp调用redis)。

在使用tcpdump进行了一些挖掘之后,由于udp校验和失败,看起来dns查找被抛出:

17:13:38.013346 IP(tos 0x0,ttl 64,id 46236,offset 0,flags [DF],proto UDP(17),length 103)10.0.0.121.34071> 10.0.0.2.53:[bad udp cksum 0x14df – > 0x3ae1!] 25855+ Type20736? xxxxxxxx.us-east-1.rds.amazonaws.com。 (75)

如果我使用telnet从同一个实例连接到Redis服务器,那么很好,它似乎只影响fpm。 同样奇怪的是,它只是在实例开始后才发生 – 最初的所有请求都没有问题。 同样,重新启动php5.6-fpm服务似乎已经清除了一段时间的问题。

在这一点上,我的知识基本已经结束了,所以希望有人能指出我正确的方向!

您安装的安全修复程序存在缺陷 – 这听起来像USN-3239-2的问题。

GNU libc的一个安全更新,解决(除其他外)…

GNU C库的getaddrinfo()函数中的无限堆栈分配。

….包含了一个回归 – 一个意想不到的ABI变化 – 似乎导致类似于您所描述的问题… DNSparsing最终将停止工作,直到进程重新启动。

原始更新是发布2017-03-20和修复发布2017-03-21。 如果是这样,应用最新的操作系统安全修复程序应该可以解决问题。

错误的校验和可能是由于校验和卸载造成的 。

我会检查是否是这种情况,你可以通过运行:

sudo ethtool --show-offload ethX

值得深入研究一下tcpdump可能会对你的数据包的内容做些什么,但值得注意的是,我想知道你是否可能没有达到某种速率限制。 您可能想检查NXDOMAIN或类似的返回数据包。

如果这是问题,有某种cachingparsing器可能会有所帮助。

更新为以下评论:

如果重新启动服务本身就是“解决”问题(感谢@ Liam Wiltshire提供的更多信息),那么我同意速率限制听起来不正确(或者至less是上游没有速率限制)。

我认为由于本地资源的限制可能仍然是一个值得考虑的可能性:例如,确保没有conntrack条目的限制,或限制打开的文件(即nofiles是低的。

话虽如此,坏的安全补丁/坏的软件引导似乎更有希望 – 所以我肯定会给予重量(并给予积分)@ 迈克尔 – sqlbot的build议。