系统: CENTOS 5.5 64 bit
软件:nginx+mysql+php+NFS
故障排查:
收到 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 messages suppressed.
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
或者使用:
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 | grep ip_conntrack 查看模块是否加载。
终极解决:
为了使彻底解决此问题,还需要再设置一个东西,那就是会话连接超时变量,这个参数设置太长的话就会导致会话连接数不断增加,默认是设置为 432000 秒,很显然这个值太大了,通过如下命令设置小一点:
echo 21600 >/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
设置成 21600 也就是 6 小时,这样会自动清除 6 小时候后的无效链接。
记得将上面的命令加到自动启动文件/etc/rc.local 文件中去。
故障总结:
此次故障显示我们必须加强服务器的监控,才能第一时间获取故障问题并在第一时间解决,减少此类问题给公司造成损失。另外出现问题多看日志,日志往往能看出问题的蛛丝马迹,通过日志我们能更快地定位问题,从而找到问题的解决办法。