在过去的几天里,我正在监视的 Centos 6.7 邮件服务器在 snmp 查询上不断超时。在行为改变之前的那段时间里,服务器没有发生任何变化(我知道......),所以我倾向于责怪环境中的“某些东西”。
如果我重新启动守护程序,它将再次响应几分钟(最多几个小时),然后它将再次开始超时。对于从机器本身运行的查询也会发生这种情况,如
# snmpstatus -v1 -c public localhost
(所以图片中没有网络问题)。我在 dmesg 中没有什么值得注意的,我在 /var/log/messages 中可以看到的唯一东西——不是普通的 snmp 连接跟踪——是偶尔的:
Mar 22 17:34:53 turnip snmpd[31053]: read:Interrupted system call
出现与我重新启动守护程序有关的行。
我试图 strace snmpd 并且我可以看到它在似乎是一个选择/接收循环中等待 - 当无响应时,它永远不会离开那里并且它不会在日志中写入任何内容 - 就好像数据包没有传递到守护进程。但是重启机器没有效果。
同样无效的是试图调整打开文件限制并调查其他可能的资源限制 - 更不用说机器本身并没有特别强调。所以我目前没有线索。
如果需要,我可以发布 snmpd.conf。
TIA 和欢呼
编辑:这是跟踪循环的样子(当无响应时):
select(15, [14], NULL, NULL, {0, 27618}) = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0}) = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0}) = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0}) = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0}) = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0}) = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0}) = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0}) = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0}) = 0 (Timeout)
事实证明,我的 snmpd 守护程序运行了许多(shell)命令 - 在 snmpd.conf 的可扩展部分中指定。其中之一(原因尚未确定)开始时不时地变得楔入。愚蠢的 snmpd 守护进程在读取该命令时卡住了,整个 shebang 都超时了。
我发现的方式可能很有趣。
1)找到snmpd的pid:
2)追踪它:
3) 14 是 snmpd 卡住的文件描述符。现在找到它的inode:
4) 现在找到由 inode 6200340 标识的管道另一端的进程。这个脚本 - 以 inode 作为参数调用 - 可用于以下目的: