概述

广大攻城狮经常会遇到问题:用户投诉、告警、网页打不开等,如何快速诊断是解决问题的关键。

诊断问题就像看病一样,应该多方面多角度观察,开阔思路,准确把握,避免误诊或进入死胡同,可借鉴一下中医的“望闻问切”。

《古今医统》:“望闻问切四字,诚为医之纲领。”望闻问切是中医用语,就是指望诊,闻诊,问诊和切脉四种诊法。

本文简述望闻问,在于考虑的全面性,详述切诊,重在剖析一个模块运行内幕。

当诊断到问题发生的原因或部位后,如何下药治疗一般更简单了,不在本文详述。

 

外象进行观察,以测知内脏病变。

可理解为远望,部分系统比较复杂,跟其他系统有很多接口,这类系统有了问题,不要一开始就扎入各自的系统深查,先要站在远处“望”:






1



2



3



4



5



6



7



8



9



10



1,问题发生在 UC自己的系统还是腾讯、百度、阿里、新浪、金山等第三方?



  这可通过查邮件、接口日志等发现。



 



2,问题发生时是否有较大的网络波动或已知的硬件故障?



  跟运维讨论,弄清楚这类问题。



 



3,问题发生在 UC内部哪个系统?



  这些内部系统中,最近升级了哪些?哪部分的系统有告警、出错日志?



  客户端:是 symbian、 java、 ppc、 iphone、 android?哪个平台才有问题?



  后台:划清系统边界,了解下周边的系统情况。



远望不需花什么时间,重要的是广泛收集信息。如果已确定是某个系统或模块出的问题,则可省略“望”这个诊断步骤。

日常工作要修炼内功,准备日志、统计等供“望”参考,请看闻诊。

闻诊,包括听声音和嗅气味,主要是听患者语言气息的高低、强弱、清浊、缓急……等变化,以分辨病情的虚实寒热。

监控系统根据严重级别显示不同颜色,有的还配有不同告警声音;日志则带有ERR、INFO等级别,就像患者的气息一样有缓急、高低。

请看如何“闻诊”系统问题:






1



2



3



4



5



6



7



8



9



10



11



12



1,监控



  日常工作要做好各个系统的监控方便查询;



 



2,统计



  各个系统要有统计数据方便各方查询;



 



3,日志



  系统之间的接口调用有日志;



 



4,通知



  运维发现硬件故障通知相关人;



  有版本升级周知相关人。



闻诊适合各个系统的具体负责人等,为望诊提供支持。

问诊,是通过询问患者或其陪诊者,以了解病情,有关疾病发生的时间、原因、经过、既往病史、患者的病痛所在,以及生活习惯、饮食爱好等与疾病有关的情况。

通过前面的望和闻,咱们会产生一些疑问,再通过相关几个人讨论、对比求证,寻找出现问题的特征条件,逐步缩小范围,理清思路,包括:






1



2



3



4



5



开会讨论头脑风暴;



 



一对一交流确认疑点;



 



问发生问题的条件、操作顺序等。



切脉,包括脉诊和按诊两部分,是医者运用指端之触觉,在病者的一定部位进行触、摸、按、压,以了解病情的方法。

切脉就是纯技术活了,如何让自己跟老中医一样能切脉呢?

其实现在工具发达,对于linux上的程序系统来说,常用以下工具就可诊断大部分问题啦:






1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18



19



20



21



22



23



24



25



26



27



28



29



30



31



32



33



34



35



36



37



38



39



40



41



42



43



44



45



46



1,诊运行历史



   sar



  看最近一天的运行历史信息,包含 iowait



 



   sar - f / var / log / sa / sa日期   



  看本月某一天的运行历史信息



 



2,诊整体资源



   top   



  看当前负载、 cpu、内存、进程、用户数等



 



   ps aux | sort - nk3



  查看 CPU占用率最大的进程,显示在最下面一行



 



   ps aux | sort - nk4



  查看内存占用率最大的进程 ,显示在最下面一行



 



3,诊磁盘



   iostat - x - k 2   



  这个命令每隔 2秒输出一次磁盘 io统计信息,这是看数据存储方案最常用命令。



 



   df - kh



  看磁盘空间,磁盘满了?你应该自己立即发现哦



 



   #/sbin/hdparm -t /dev/sda



  评估磁盘的读取性能。 hdparm可检测、显示与设定 IDE或 SCSI硬盘的参数。



 



4,诊网络连接



   netstat - nap   



  这个命令输出当前所有连接,包括连接所属的进程



 



   ping host或 ip



  诊断网络是否可达和域名解析是否成功。



 



   / sbin / ethtool ethX



( ethX表示网卡名如 eth0)



  检查网卡和网络速度“ Speed”, 100Mb和 1000Mb的带宽差别可大了。



 



  有时要确信两台机器之间的实际带宽,



   a,可用 scp传一个大文件看看,不过 scp传送会受 ssh协议的影响,会偏慢一些。



   b,用 http协议会更真实,在 nginx的 htdocs目录下放个大文件,到另一台机器用 wget下载。



 



   sar - n DEV 5 500



  诊断网络流量,是否遭到攻击?看网卡读写数据量 rxbyt / s和 txbyt / s,单位字节。



 



5,诊文件句柄








1



2



3



4



查看所有进程的文件打开数是否接近系统限制



< strong > / usr / sbin / lsof | wc - l < / strong >



查看某个进程打开的文件是否异常,包括 wc - l查看数目



/ usr / sbin / lsof - p pid








1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18



19



20



21



22



23



24



25



26



27



28



29



30



31



32



33



34



35



36



37



38



39



40



41



42



43



44



45



46



47



48



6,诊系统限制



   ulimit - a



  看是否可生成 core文件、可打开文件句柄数 "open files",经常需要修改系统限制。



 



7 , 诊程序系统调用



   strace - p pid



  看程序进程的系统调用函数和返回值,在“显微镜”下看这程序在偷偷干吗?



  多线程程序可尝试看 pid + 1 , pid + 2后面一般依次是进程创建的多条线程



 



   strace - p pid - c



  看某个进程 id的系统调用函数次数统计,按 ctrl + c退出并输出统计信息   



 



8,诊通信包



  常用命令:



   #/usr/sbin/tcpdump -X -s 0 tcp port 8030 -i lo



   #/usr/sbintcpdump -n -x -s 0 tcp port 23000 or 23002 or 23003 or 22122 >dump



   #/usr/sbin/tcpdump -n -x -s 0 tcp port 7820 and host 192.156.30.100



  用 root可以在 linux上用 tcpdump抓包, tcp和 udp包都可以抓。



  常用选项:



   - X 以可读方式显示数据包,适合 http、 memcached asccii等明文传输的协议



   - x 输出 16进制的包内容, Print each packet ( minus its link level header ) in hex



   - A ascii码显示



 



   - i lo 看本机 localhost的通信包



   - n 不要域名解析, Don’ t convert host addresses to names .  This can be used to avoid DNS lookups .



   - s 设置抓完整的包, Snarf  snaplen  bytes  of data from each packet rather than the default of 68...



     Setting snaplen to 0 means use the required length to catch whole packets .



 



9,诊程序配置文件或启动参数



  以上几个命令一看基本知道系统内脏情况,必要时查看具体程序的配置或启动参数,



  查看是否连接数、磁盘数、内存数、进程线程数配置不合理。



 



10,诊日志



  看具体程序运行日志、统计日志、耗时日志



 



   vi / etc / syslog . conf



  查看 linux系统 log在哪个目录



   # vi /var/log/messages



  查看最近系统运行日志,包括机器重启前后的日志、用户登录日志



 



   dmesg



  查看 linux启动日志



   dmesg | grep sda



  查看启动日志中有关 sda这个磁盘分区参数 .



 



11, gdb core文件



coredump文件,则 gdb program core . * * *



coredump: kill - s SIGSEGV pid