snmpd 无响应(Centos 6)

snmpd 无响应(Centos 6)

在过去的几天里,我监控的 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)

答案1

事实证明,我的 snmpd 守护进程运行了许多 (shell) 命令 - 在 snmpd.conf 的可扩展部分中指定。其中一个命令(原因尚待确定)开始不时卡住。愚蠢的 snmpd 守护进程在读取该命令时卡住了,整个过程都超时了。

我发现的方法可能会很有趣。

1)找到snmpd的pid:

#pidof snmpd
124567

2)跟踪它:

# strace -p124567
select(15, [14], NULL, NULL, {1, 0})    = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0})    = 0 (Timeout)

3)14 是 snmpd 卡住的文件描述符。现在找到它的 inode:

# ls -l /proc/1124567/fd
total 0
lrwx------ 1 root root 64 Mar 23 10:41 0 -> /dev/null
lrwx------ 1 root root 64 Mar 23 10:41 1 -> /dev/null
[...]
lr-x------ 1 root root 64 Mar 23 10:41 14 -> pipe:[6200340]

4) 现在找到由 inode 6200340 标识的管道另一端的进程。此脚本(以 inode 作为参数调用)可用于以下目的:

#!/bin/bash

for i in /proc/*/fd; do 
    found=$(ls -l $i| fgrep $1)
    if [[ x$found != x ]]; then
    pid=$(basename $(dirname $i))
    name=$(ps -p $pid -o comm=)
    echo "$name ($pid)"
    fi
done 

相关内容