Centos

snmpd 變得無響應(Centos 6)

  • March 23, 2016

在過去的幾天裡,我正在監視的 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:

#pidof snmpd
124567

2)追踪它:

# strace -p124567
select(15, [14], NULL, NULL, {1, 0})    = 0 (Timeout)
select(15, [14], NULL, NULL, {1, 0})    = 0 (Timeout)
  1. 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]
  1. 現在找到由 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 

引用自:https://serverfault.com/questions/765382