歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux服務 >> linux服務器出現丟包的解決方法

linux服務器出現丟包的解決方法

日期:2017/3/3 15:58:27   编辑:Linux服務

故障排查:

早上突然收到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: 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

URL:http://www.bianceng.cn/OS/Linux/201410/45922.htm

發現是當前會話數已經滿了,因此出現丟包現象。這裡對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文件中去。

Copyright © Linux教程網 All Rights Reserved