概述
攻城狮常常会遇到系统告警、网页打不开、用户投诉、数据错误等问题,如何快速诊断是解决问题的关键,当有些问题用自己习惯的三板斧不能立即定位时,静下心来试试本文提到的望闻问切的思路。
诊断问题就像看病一样,应该多方面多角度观察,开阔思路,准确把握,避免误诊,遇到问题不急不躁,可借鉴中医的“望闻问切”思路。
《古今医统》:“望闻问切四字,诚为医之纲领。”望闻问切是中医用语,就是指望诊,闻诊,问诊和切脉四种诊法。
本文重在介绍问题思路,顺便列了最常用的Linux诊断命令,适合研发、测试、运维人员。
望
中医望诊即对病人的神、色、形、态、舌象等外象进行观察,以测知内脏病变。
可理解为远望,部分系统比较复杂,跟其他系统有许多接口,这类系统有了问题,不要一开始就扎入各自的系统深查,先要站在远处“望”:
| 1,问题发生在自己的系统还是第三方?这常可通过外部接口告警、第三方邮件或电话等发现。2,问题发生时是否有较大的网络波动或已知的硬件故障? 遇到这类故障,运维一般都会收到相关通知。3,问题发生在内部哪个系统? 内部也有多个系统多个服务,这些内部系统中,最近升级了哪些?哪部分的系统有告警、出错日志? 即要划清系统边界,了解周边的系统情况。 |
远望不需花什么时间,重大的是广泛收集信息,出问题时方便立即综合信息作出判断。如果已确定是某个系统或模块出的问题,则可省略“望”这个诊断步骤。
日常工作要未雨绸缪,有收集第三方、外部接口、其他故障信息的渠道,供望诊参考。
闻
闻诊,包括听声音和嗅气味,主要是听患者语言气息的高低、强弱、清浊、缓急……等变化,以分辨病情的虚实寒热。
监控系统根据严重级别显示不同颜色,有的还配有不同告警声音;日志则带有ERR、INFO等级别,就像患者的气息一样有缓急、高低。
请看如何“闻诊”系统问题:
| 1,监控日常工作要做好各个系统的监控方便查询;2,统计各个系统要有统计数据方便各方查询;3,日志系统之间的接口调用有日志;4,通知有版本升级周知相关人。 |
闻诊适合各个系统的具体负责人等。
问
问诊,是通过询问患者或其陪诊者,以了解病情,有关疾病发生的时间、缘由、经过、既往病史、患者的病痛所在,以及生活习惯、饮食爱好等与疾病有关的情况。
通过前面的望和闻,咱们会产生一些疑问,再通过相关几个人讨论、对比求证,寻找出现问题的特征条件,逐步缩小范围,理清思路,包括:
| 一起讨论头脑风暴;一对一交流确认疑点;问发生问题的条件、操作顺序等。 |
切
切脉,包括脉诊和按诊两部分,是医者运用指端之触觉,在病者的必定部位进行触、摸、按、压,以了解病情的方法。
切脉就是纯技术活了,如何让自己跟老中医一样能切脉呢?
实则目前工具发达,对于linux上的程序系统来说,常用以下工具就可诊断大部分问题:
| 1,诊运行历史sar看最近一天的运行历史信息,包含iowaitsar -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,诊文件句柄查看所有进程的文件打开数是否接近系统限制<strong> /usr/sbin/lsof |wc -l </strong>查看某个进程打开的文件是否异常,包括wc -l查看数目/usr/sbin/lsof -p pid |
| 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 |
总之,遇到不能立即定位问题时,在那些时间以分秒计算的时候,想想“望闻问切”从远到近、从外到内、多角度地诊断思路。
更多深度技术内容,请关注云栖社区微信公众号:yunqiinsight。





