1、背景
有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提升自我能力。如果我们有一套好的分析工具,那将是事半功倍,能够帮助大家快速定位问题,节省大家很多时间做更深入的事情。
2、说明
本篇文章主要介绍各种问题定位的工具以及会结合案例分析问题。
3、分析问题的方法论
套用5W2H方法,可以提出性能分析的几个问题
-
What-现象是什么样的
-
When-什么时候发生
-
Why-为什么会发生
-
Where-哪个地方发生的问题
-
How much-耗费了多少资源
-
How to do-怎么解决问题
4、cpu
4.1 说明
针对应用程序,我们通常关注的是内核CPU调度器功能和性能。
线程的状态分析主要是分析线程的时间用在什么地方,而线程状态的分类一般分为:
a. on-CPU:执行中,执行中的时间通常又分为用户态时间user和系统态时间sys。 b. off-CPU:等待下一轮上CPU,或者等待I/O、锁、换页等等,其状态可以细分为可执行、匿名换页、睡眠、锁、空闲等状态。
如果大量时间花在CPU上,对CPU的剖析能够迅速解释原因;如果系统时间大量处于off-cpu状态,定位问题就会费时很多。但是仍然需要清楚一些概念:
-
处理器
-
核
-
硬件线程
-
CPU内存缓存
-
时钟频率
-
每指令周期数CPI和每周期指令数IPC
-
CPU指令
-
使用率
-
用户时间/内核时间
-
调度器
-
运行队列
-
抢占
-
多进程
-
多线程
-
字长
4.2 分析工具
说明:
-
uptime,vmstat,mpstat,top,pidstat只能查询到cpu及负载的的使用情况。
-
perf可以跟着到进程内部具体函数耗时情况,并且可以指定内核函数进行统计,指哪打哪。
4.3 使用方式
//查看系统cpu使用情况
top
//查看所有cpu核信息
mpstat -P ALL 1
//查看cpu使用情况以及平均负载
vmstat 1
//进程cpu的统计信息
pidstat -u 1 -p pid
//跟踪进程内部函数级cpu使用情况
perf top -p pid -e cpu-clock
5、内存
5.1 说明
内存是为提高效率而生,实际分析问题的时候,内存出现问题可能不只是影响性能,而是影响服务或者引起其他问题。同样对于内存有些概念需要清楚:
-
主存
-
虚拟内存
-
常驻内存
-
地址空间
-
OOM
-
页缓存
-
缺页
-
换页
-
交换空间
-
交换
-
用户分配器libc、glibc、libmalloc和mtmalloc
-
LINUX内核级SLUB分配器
5.2 分析工具
说明:
-
free,vmstat,top,pidstat,pmap只能统计内存信息以及进程的内存使用情况。
-
valgrind可以分析内存泄漏问题。
-
dtrace动态跟踪。需要对内核函数有很深入的了解,通过D语言编写脚本完成跟踪。