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


