http://tech.uc.cn/?p=355
广大攻城狮经常会遇到问题:用户投诉、告警、网页打不开等,如何快速诊断是解决问题的关键。
诊断问题就像看病一样,应该多方面多角度观察,开阔思路,准确把握,避免误诊或进入死胡同,可借鉴一下中医的“望闻问切”。
《古今医统》:“望闻问切四字,诚为医之纲领。”望闻问切是中医用语,就是指望诊,闻诊,问诊和切脉四种诊法。
本文简述望闻问,在于考虑的全面性,详述切诊,重在剖析一个模块运行内幕。
当诊断到问题发生的原因或部位后,如何下药治疗一般更简单了,不在本文详述。
中医望诊即对病人的神、色、形、态、舌象等外象进行观察,以测知内脏病变。
可理解为远望,部分系统比较复杂,跟其他系统有很多接口,这类系统有了问题,不要一开始就扎入各自的系统深查,先要站在远处“望”:
远望不需花什么时间,重要的是广泛收集信息。如果已确定是某个系统或模块出的问题,则可省略“望”这个诊断步骤。
日常工作要修炼内功,准备日志、统计等供“望”参考,请看闻诊。
闻诊,包括听声音和嗅气味,主要是听患者语言气息的高低、强弱、清浊、缓急……等变化,以分辨病情的虚实寒热。
监控系统根据严重级别显示不同颜色,有的还配有不同告警声音;日志则带有ERR、INFO等级别,就像患者的气息一样有缓急、高低。
请看如何“闻诊”系统问题:
闻诊适合各个系统的具体负责人等,为望诊提供支持。
问诊,是通过询问患者或其陪诊者,以了解病情,有关疾病发生的时间、原因、经过、既往病史、患者的病痛所在,以及生活习惯、饮食爱好等与疾病有关的情况。
通过前面的望和闻,咱们会产生一些疑问,再通过相关几个人讨论、对比求证,寻找出现问题的特征条件,逐步缩小范围,理清思路,包括:
切脉,包括脉诊和按诊两部分,是医者运用指端之触觉,在病者的一定部位进行触、摸、按、压,以了解病情的方法。
切脉就是纯技术活了,如何让自己跟老中医一样能切脉呢?
其实现在工具发达,对于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
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
|