故障排查:
早上突然收到nagios伺服器check_icmp的報警,報警顯示一台網站伺服器的内網網絡有問題。因為那台伺服器挂載了内網的NFS,是以内網的網絡就采用nagios的check_icmp來做監控。
趕緊登入伺服器進行排查。首先使用ping 内網IP的方式檢視内網的連通性,ping的過程中出現丢包現象,資訊如下:
64 bytes from 10.1.1.1: icmp_seq=34 ttl=255 time=0.928 ms
64 bytes from 10.1.1.1: icmp_seq=35 ttl=255 time=1.01 ms
ping: sendmsg: Operation not permitted
顯示ping不被允許,奇怪,防火牆上明明開通了icmp的協定。有問題先看日志,日志檔案一般會有所記錄,tail –f /var/log/messages,發現大量的如下内容:
Sep 13 09:11:21 dowload_server1 kernel: printk: 261 messagessuppressed.
Sep 13 09:11:21 dowload_server1 kernel: ip_conntrack: table full,dropping packet
發現是目前會話數已經滿了,是以出現丢包現象。這裡對ip_conntrack做一下簡單的介紹:IP_conntrack表示連接配接跟蹤資料庫(conntrack database),代表NAT機器跟蹤連接配接的數目,連接配接跟蹤表能容納多少記錄是被一個變量控制的,它可由核心中的ip-sysctl函數設定。每一個跟蹤連接配接表會占用350位元組的核心存儲空間,時間一長就會把預設的空間填滿,那麼預設空間是多少?在記憶體為64MB的機器上是4096,記憶體為128MB是8192,記憶體為256MB是16384
通過如下指令檢視目前的會話數:
cat /proc/net/ip_conntrack | wc –l 不要用,占CPU
或者使用:
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
使用如下指令檢視設定的最大會話數
cat /proc/sys/net/ipv4/ip_conntrack_max
解決辦法:
發現确實已經達到了最大會話數,通過google發現,可以直接調大使用者的最大會話數,指令為:
echo "102400" > /proc/sys/net/ipv4/ip_conntrack_max
執行此指令後,不在丢包了,ping也正常了。但是這樣設定不會永久儲存,當系統重新開機後設定會丢失,是以需要儲存到/etc/sysctl.conf,在/etc/sysctl.conf中加入:net.ipv4.ip_conntract_max =102400,然後執行/sbin/sysctl –p重新整理核心參數即可,如果出現error:"net.ipv4.ip_conntract_max" is an unknown key報錯的話,需要加載ip_conntract子產品,使用modprobe ip_conntrack加載,使用lsmod | grepip_conntrack檢視子產品是否加載。
終極解決:
為了使徹底解決此問題,還需要再設定一個東西,那就是會話連接配接逾時變量,這個參數設定太長的話就會導緻會話連接配接數不斷增加,預設是設定為432000秒,很顯然這個值太大了,通過如下指令設定小一點:
echo 21600>/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
設定成21600也就是6小時,這樣會自動清除6小時候後的無效連結。記得将這句話加到自動啟動檔案/etc/rc.local檔案中去。