识别 Linux 上失败或挂起的出站网络连接

识别 Linux 上失败或挂起的出站网络连接

我管理一个繁忙的网络服务器,它使用 nginx/php-fpm,连接到 mysql(RDS)和 elasticsearch,但网站上还有许多第三方广告和其他插件等(不幸的是我不知道所有的细节)。

我有一个随机的、间歇性的问题困扰着我,偶尔 php-fpm 工作者开始堆积,因此 CPU、与 sql 的连接以及最终 sql CPU 也会堆积起来——幸运的是,这种情况不会持续太久。

我确信这是远程的事情,因为它同时发生在当前 LB 下的所有服务器上

通过我的调查和测试,我认为我已经将此问题追溯到 Web 层中导致 php 进程挂起的某些原因。

我相信我可以排除与我的 ES 集群的连接,也可以排除与 RDS 的连接,原因有几个,- 对出现问题的特定主机的 ES 进行单独监控现在显示问题 - 与 ES/SQL 的所有连接都是通过 api 层执行的,api 日志显示没有失败的请求(499/502),正如我在 Web 日志中看到的。- 在 php 中运行的健康检查脚本,从 Web 服务器本身调用来自 ES 和 SQL 的数据也没有显示问题,同时 Web 层开始返回 499/502 - 对 SQL 和 ES 的进一步一般环境监控没有显示问题。

这也不是连接/攻击的突然增加——回顾负载均衡器指标,除了问题开始生效时延迟增加之外,没有什么值得担心的。

我怀疑,对 Web 层的 php 请求的一部分需要它生成一个包含来自外部源的数据的响应,其中一些数据偶尔无法响应并导致服务器响应挂起。

我需要一种方法来证明(或反驳)这一点并识别连接,我一直在研究 netstat,可能还有 wireshark,但我需要一些帮助来确定一个命令,该命令将突出显示传出连接失败或挂起——只是能够记录任何超过一定时间的传出连接会非常有帮助,如果问题与这些日志相符,那么我将走上正确的轨道,并获得一些线索。

如果连续运行不切实际的话,我知道当连接开始超时时如何启动它。

希望你们能给我一些想法:)

谢谢

答案1

获得所需数据的唯一方法是进行数据包捕获,并获取完整的数据包详细信息。例如:

$ tcpdump -s0 -w packet.cap port 80 or port 443

警告,这将占用磁盘空间,因此请确保您有足够的存储空间用于数据包捕获。在观察到问题的一段时间后,将文件复制到本地并使用 wireshark 检查。您将能够检查完整的 TCP 流和 HTTP 调用/响应,包括由客户端发起的和由您的服务器发起的。

不过,我想问的是……你确定你的服务器确实在请求这些外部资源,然后将它们提供给客户端吗?在绝大多数情况下,广告网络等服务直接地到客户端的浏览器,而不是通过您的网络服务器。

相关内容