Centos
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)
事實證明,我的 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)
- 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]
- 現在找到由 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