背景:我们的一台 Ubuntu 服务器随机(?)无响应,即某些连接断开,并且服务器暂时不接受新连接。至少这是我们在相关服务日志中看到的情况。该问题最多持续几分钟。这种情况每天发生 1-3 次。我们使用 munin 来监控此服务器,但标准图表中没有任何内容引起我们的注意。
初步诊断后没有发现任何问题,但我们的数据中心告诉我们,当这种情况发生时,他们的图表上会出现短暂的流量高峰。他们没有提供更多有用的信息。如何确定导致这些情况的原因?(源 IP,目标端口)
我考虑过使用 tcpdump 捕获数据包,但我不知道可以应用什么过滤器来避免生成数千兆字节的日志。也许存在一个工具来记录所有连接并打印统计信息(连接持续时间、交换的字节数、速率)?假设这些不是无连接数据包。
答案1
在收集更多数据之前,不要认为此事件的根本原因是“流量激增”。这可能是多种问题,通常属于利用率、饱和度或错误类别。查看所有指标,包括应用程序对用户请求的响应时间。阅读您的日志,包括系统日志。
如果事件对于您的监测间隔来说太短暂,请考虑尝试一些高分辨率监测。例如,Netdata 可以以 1 秒的间隔收集广泛的指标。
也许存在一个工具来记录所有连接并打印统计数据(连接持续时间、交换字节数、速率)?
自然,有人破解了 BPF 跟踪脚本来实现这一点。Brendan Greg 的实现称为 tcplife。 源自 bcc repo。
# ./tcplife -t TIME(s) PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB MS 0.000000 5973 recordProg 127.0.0.1 47986 127.0.0.1 28527 0 0 0.25 0.000059 3277 redis-serv 127.0.0.1 28527 127.0.0.1 47986 0 0 0.29 1.022454 5996 recordProg 127.0.0.1 47988 127.0.0.1 28527 0 0 0.23 1.022513 3277 redis-serv 127.0.0.1 28527 127.0.0.1 47988 0 0 0.27 2.044868 6019 recordProg 127.0.0.1 47990 127.0.0.1 28527 0 0 0.24 2.044924 3277 redis-serv 127.0.0.1 28527 127.0.0.1 47990 0 0 0.28 3.069136 6042 recordProg 127.0.0.1 47992 127.0.0.1 28527 0 0 0.22 3.069204 3277 redis-serv 127.0.0.1 28527 127.0.0.1 47992 0 0 0.28 This shows that the recordProg process was connecting once per second.
大量免责声明:Linux 4.4 或更高版本,关闭时只有 TCP 会话,PID 检测不准确。但您可以实时显示已关闭的 TCP 会话,时间戳为微秒,无需数据包跟踪。
如果事件没有被及时报道,请尝试跟踪 TCP 连接。