Linux下系统或服务排障的最佳实践
一、故障表现。首先一个应用或系统不正常,会表现在:1、前端应用/网页显示不正常,出错5XX,4XX或其他错误信息或慢或出不来;2、当前端端...
id="cproIframe_u944267" width="250" height="250" src="http://pos.baidu.com/acom?adn=3&at=231&aurl=&cad=1&ccd=24&cec=UTF-8&cfv=15&ch=0&col=zh-CN&conOP=0&cpa=1&dai=2&dis=0<r=http%3A%2F%2Fwww.5iops.com%2Fhtml%2Fproblem%2F2.html<u=http%3A%2F%2Fwww.5iops.com%2Fhtml%2F2012%2Fproblem_0517%2F21.html&lunum=6&n=qudao123_cpr&pcs=1345x659&pis=10000x10000&ps=591x213&psr=1366x768&pss=1345x873&qn=4f0b6963f57c9fd8&rad=&rs=61820&rsi0=250&rsi1=250&rsi5=2&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000FF&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=&td_id=944267&tn=text_default_250_250&tpr=1419351203495&ts=1&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u944267" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true">
1、 前端应用/网页显示不正常,出错5XX,4XX或其他错误信息或慢或出不来;
2、 当前端端应用/网页暂时显示正常,但监控系统报警:如负载过高,CPU繁忙,系统占用比率过高;内存缺少,OOM(Out Of Memory),Swap使用过多等;磁盘空间不足,IO利用率过高;进程数过多,死锁;数据库慢查询过多,session\processes过多;流量过高,异常增减,断开;系统日志(dmesg或/var/log/message)报错;应用日志报错(各种错误,如4XX,5XX;或原来正常的接口现在无法访问;无法解析;响应时间过长….);。。。。
3、系统时而正常,时而不正常,或者之前正确结果,但突然不正确,或者某地用户出问题,但本地正常。
二、主要的原因:
1、 各类新版本发布、变更配置引起。如新版本配置不正确;iptables; DNS设置;接口调用发生变化等。【所有变更务必进行记录,以供查询】
2、 用户行为变化(如进行商业推广,接口加载变化),请求量大增。系统容量不足,如内核参数设置过小,资源过少。带宽不够;数据库慢。
3、 应用程序的BUG。
4、 运维人为错误的修改、配置。如修改密码,增加定时任务,脚本。
5、 网络或硬件故障。如交换机故障,网线故障(千兆变百兆),网卡驱动;磁盘故障、主板故障等。
6、 所依赖的接口或服务挂起(如DNS,后端接口).
7、 攻击或安全漏洞。
8、 ....
三、排查、分析及解决问题的办法【需要综合很多经验,故障要区别对待(P0~P4),大面积重要或核心功能受损最优先P0;个别用户外围功能受损:P4;每个级别承诺不同的响应时间】:
1、 仔细看报障提供的故障信息:包括但不限于故障方的环境【网络-电信还是网通,客户机IP地址,DNS地址,浏览器,操作系统等】,报障内容(截图)。自己看问题能否重现。如能重现,比较好办:依据经验,可能可快速判断问题所在;若不能,可进行抓包,常用工具:HttpWatch,HttpAnalyser,FireFox里的插件,wireshark等等。若不能重现,则继续:
2、 查看网络状态:ping 服务器及服务器上反ping用户IP或traceroute/tracert。同时看监控系统是否有监测到相关报警,确认无外围的硬件与网络问题。
3、 组织人手,让业务运维最直接的人参与进来,排查。确认是否最近有变更。
4、 着手自己排查:找到相关架构(前端所有机器Nginx,Squid等),应用服务器(PHP or Resin),缓存层Memcache,数据库(Mysql,Oracle),清楚地知道为该应用提供服务所有机器。
5、 查看前端机器的资源情况【负载,CPU,内存,磁盘,进程,定进任务等】:top, w, sar, dmesg(/var/log/messages), ps, df, free, vmstat, iostat, netstat, telnet, curl, wget, lsof, cat等等。如负载过高,CPU繁忙,系统占用比率过高;内存缺少,OOM(Out Of Memory),Swap使用过多等;磁盘空间不足,IO利用率过高;进程数过多,死锁;数据库慢查询过多,session\processes过多;流量过高,异常增减,断开;系统日志(dmesg或/var/log/message)报错;应用日志报错(各种错误,如4XX,5XX;或原来正常的接口现在无法访问;无法解析;响应时间过长….);。。。。
dmesg
vi /var/log/messages
netstat –na|grep LISTEN
netstat –nlp –ip
iptables –nL
sysctl -a
cat /etc/rc.local
cat /etc/resolv.conf
ps –ef|grep java
ps –ef|grep php
ps –ef|grep mysql
ps –ef|grep nginx
df –h
fdisk –l
mount
crontab –l
sar –f /var/log/sa/sar* 将sar改为分钟级别记录,同时分析对比一段时间的变化,以Excel画图
分析日志(nginx等)的变化,请求数,错误率,做一段时间的对比,以Excel画图(不同机器横比,不同时间纵比)。
下面是一些技巧:
对比查看PHP服务器的PHP查询慢日志条数(slow query log count): wc –l /tmp/clientweb/log/slow_~day.log
将多台服务器上sar的相应值拿出来,将在excel中画图对比(不同机器横比,不同时间纵比) :
for file in `ls –tl /var/log/sa/ `
do
sar –f $file|awk ‘{print 100-$7}’
done
在Linux下以主机头信息查看某个IP的服务是否正常:
curl –H “Host: www.5iops.com” http://202.96.159.234:80/index.php
curl –Iv –H “Host: www.5iops.com” http://202.96.159.234:8080/index.php
demsg中有这个报错:ip_conntrack: table full, dropping packet.查看系统内核配置及当前使用状态:
[root@166-208 ~]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
81920
[root@166-208 ~]# cat /proc/net/ip_conntrack|wc -l
45899
查找/目录下大于100M的文件:find / -size +100000k -exec ls -hl {} \;
[root@166-88 /]# find / -size +100000k -exec ls -hl {} \;
-rw-r--r-- 1 root root 526M 12-03 20:29 /usr/local/nginx/logs/error.log
-rw-r--r-- 1 root root 291M 2010-07-15 /usr/local/resource.tar.gz
-rw-r--r-- 1 root root 454M 12-03 20:29 /usr/local/resin/logs/access.log
-rw------- 1 root root 362M 12-03 20:25 /var/log/messages
-rw-r--r-- 1 root root 8.2G 12-02 23:59 /home/adlogs/adrequest.log.2011-12-02
-rw-r--r-- 1 root root 7.6G 12-03 20:29 /home/adlogs/adrequest.log
-rw-r--r-- 1 root root 8.1G 12-01 23:59 /home/adlogs/adrequest.log.2011-12-01
-rw-r--r-- 1 root root 405M 12-02 00:10 /home/adlogs_backup/adrequest.log.2011-12-01.tar.gz
-rw-r--r-- 1 root root 406M 12-03 00:09 /home/adlogs_backup/adrequest.log.2011-12-02.tar.gz
一、故障表现。首先一个应用或系统不正常,会表现在:1、前端应用/网页显示不正常,出错5XX,4XX或其他错误信息或慢或出不来;2、当前端端...
id="cproIframe_u944267" width="250" height="250" src="http://pos.baidu.com/acom?adn=3&at=231&aurl=&cad=1&ccd=24&cec=UTF-8&cfv=15&ch=0&col=zh-CN&conOP=0&cpa=1&dai=2&dis=0<r=http%3A%2F%2Fwww.5iops.com%2Fhtml%2Fproblem%2F2.html<u=http%3A%2F%2Fwww.5iops.com%2Fhtml%2F2012%2Fproblem_0517%2F21_2.html&lunum=6&n=qudao123_cpr&pcs=1345x659&pis=10000x10000&ps=591x213&psr=1366x768&pss=1345x873&qn=70a332d2951522cf&rad=&rsi0=250&rsi1=250&rsi5=2&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000FF&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=&td_id=944267&tn=text_default_250_250&tpr=1419351254309&ts=1&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u944267" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true">
[root@166-88 /]# lsof |grep -i del
。。。
nginx 5219 root DEL REG 0,9 18446744073202310822 /dev/zero
nginx 5219 root 3w REG 253,0 13127866257 2719794 /usr/local/nginx/logs/error.log (deleted)
nginx 24661 root 3w REG 253,0 13127866257 2719794 /usr/local/nginx/logs/error.log (deleted)
可以看到open file ,被删除了,但是空间没有释放;
重启nginx
[root@SZT-AD-AFV-166-88 /]# service nginx stop; service nginx start
Stopping nginx...
查看某个应用软件打开的日志:如查看mq打开的日志,ps –ef|grep mq,找出pid为18787,然后 lsof –p 18787|grep log
[root@DB-241 bin]# ps -ef|grep mq
root 10686 10441 0 16:14 pts/1 00:00:00 grep mq
root 18787 1 0 Oct20 ? 00:13:07 /usr/local/jdk/bin/java -Xms2048M -Xmx2048M -Dorg.apache.activemq.UseDedicatedTaskRunner=true -Djava.util.logging.config.file=logging.properties -Dcom.sun.management.jmxremote -Dactivemq.classpath=/usr/local/activemq-5.4.1/conf; -Dactivemq.home=/usr/local/activemq-5.4.1 -Dactivemq.base=/usr/local/activemq-5.4.1 -jar /usr/local/activemq-5.4.1/bin/run.jar start
[root@DB-241 bin]# lsof –p 18787|grep log
verify:--10次循环(每个挂载点写入100M的文件100次)
verify:
for i in 0 1 2 3 4 5 6 7 8 9 10
do
dd if=/dev/zero of=/home/service/$i/test.log bs=1048576 count=100
done
查看并升级DELL R510的Broadcom网卡驱动(网卡驱动有缺陷):
#!/bin/sh
#Checking network interface driver.
DRIVER_VER=`modinfo bnx2 | grep '\bversion' | awk '{print $2}'`
KERNEL=`modinfo bnx2 | grep filename | awk -F'/' '{print $4}'`
if [ $DRIVER_VER == "2.0.8e" ]
then
depmod -a && modprobe bnx2
echo "Network interface driver was installed. It works well now." >> /root/check_net_driver.log
else
if [ $KERNEL == "2.6.18-164.el5" ]
then
rpm -Uvh http://www.5iops.com/rhel_5.4_repo/5iops/netxtreme2-5.2.55-2.x86_64.rpm
depmod -a && modprobe bnx2 && echo "netxtreme2 installed"
fi
if [ $KERNEL == "2.6.18-164.el5 xen" ]
then
rpm -Uvh http://www.5iops.com/rhel_5.4_repo/5iops/netxtreme2- xen-5.2.55-2.x86_64.rpm
depmod -a && modprobe bnx2 && echo "netxtreme2-xen installed"
fi
fi
查一系列文件中的行数:如查看所有rpc_error*.log文件中的错误数
for file in `ls rpc_error*.log`; do echo $file; grep -c recommend $file; done
rpc_error_20111122.log 91190
rpc_error_20111123.log 88909
rpc_error_20111124.log 110018
rpc_error_20111125.log 134591
rpc_error_20111126.log 221625
rpc_error_20111127.log 237515
rpc_error_20111128.log 156007
rpc_error_20111129.log 192667
rpc_error_20111130.log 182664
rpc_error_20111201.log 117474
rpc_error_20111202.log 170258
调试进程:
strace –p pid
pstree|grep net
grep ^read abc.log
一、故障表现。首先一个应用或系统不正常,会表现在:1、前端应用/网页显示不正常,出错5XX,4XX或其他错误信息或慢或出不来;2、当前端端...
id="cproIframe_u944267" width="250" height="250" src="http://pos.baidu.com/acom?adn=3&at=231&aurl=&cad=1&ccd=24&cec=UTF-8&cfv=15&ch=0&col=zh-CN&conOP=0&cpa=1&dai=2&dis=0<r=http%3A%2F%2Fwww.5iops.com%2Fhtml%2Fproblem%2F2.html<u=http%3A%2F%2Fwww.5iops.com%2Fhtml%2F2012%2Fproblem_0517%2F21_3.html&lunum=6&n=qudao123_cpr&pcs=1345x659&pis=10000x10000&ps=591x213&psr=1366x768&pss=1345x873&qn=a9adc92be002681f&rad=&rsi0=250&rsi1=250&rsi5=2&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000FF&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=&td_id=944267&tn=text_default_250_250&tpr=1419351293653&ts=1&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u944267" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true">
1、 好用的运维平台。完善的运维 架构及说明文档;
2、 全面、及时、准确的监控系统或平台。最好有专门的运维工具开发团队(2-3人),专门负责小工具开发。
3、 变更管理。每一次修改及变更都有记录,操作步骤在执行前有人REVIEW(评估、复查);
4、 故障管理。每一次问题或故障都要设法找到根本原因。如果短时间找不到,要启用及时发现该问题的能力并绕过(如设定健康检测脚本重启服务)。故障与BUG均需要分级管理【P0~P4】。
5、 备份体系。不仅要有本地备份(应用与数据),而且还要有异地备份。任何情况下要做到即使系统全部破坏,我们还可以重建出来。
6、 容量规划。及时发现潜在或即将到来的瓶颈。
7、 架构设计并持续优化。设法排除单点,多机布署及负载均衡。架构的优化是长期的结果,也是最可以省成本的地方。
8、 人员的管理与培训。分享无时无处不在。