作者:Lucien_168来源:https://www.jianshu.com/p/0bbac570fa4c1. 背景
有时候会遇到一些疑难杂症 , 并且监控插件并不能一眼立马发现问题的根源 。这时候就需要登录服务器进一步深入分析问题的根源 。那么分析问题需要有一定的技术经验积累 , 并且有些问题涉及到的领域非常广 , 才能定位到问题 。所以 , 分析问题和踩坑是非常锻炼一个人的成长和提升自我能力 。如果我们有一套好的分析工具 , 那将是事半功倍 , 能够帮助大家快速定位问题 , 节省大家很多时间做更深入的事情 。
2. 说明
本篇文章主要介绍各种问题定位的工具以及会结合案例分析问题 。
3. 分析问题的方法论
套用5W2H方法 , 可以提出性能分析的几个问题
- What-现象是什么样的
- When-什么时候发生
- Why-为什么会发生
- Where-哪个地方发生的问题
- How much-耗费了多少资源
- How to do-怎么解决问题
4.1 说明
针对应用程序 , 我们通常关注的是内核CPU调度器功能和性能 。
线程的状态分析主要是分析线程的时间用在什么地方 , 而线程状态的分类一般分为:
a. on-CPU:执行中 , 执行中的时间通常又分为用户态时间user和系统态时间sys 。
b. 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-clock5. 内存
5.1 说明
内存是为提高效率而生 , 实际分析问题的时候 , 内存出现问题可能不只是影响性能 , 而是影响服务或者引起其他问题 。同样对于内存有些概念需要清楚:
- 主存
- 虚拟内存
- 常驻内存
- 地址空间
- OOM
- 页缓存
- 缺页
- 换页
- 交换空间
- 交换
- 用户分配器libc、glibc、libmalloc和mtmalloc
- linux内核级SLUB分配器
文章插图
说明:
- free,vmstat,top,pidstat,pmap只能统计内存信息以及进程的内存使用情况 。
- valgrind可以分析内存泄漏问题 。
- dtrace动态跟踪 。需要对内核函数有很深入的了解 , 通过D语言编写脚本完成跟踪 。
//查看系统内存使用情况free -m//虚拟内存统计信息vmstat 1//查看系统内存情况top//1s采集周期 , 获取内存的统计信息pidstat -p pid -r 1//查看进程的内存映像信息pmap -d pid//检测程序内存问题valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./程序名6. 磁盘IO
6.1 说明
磁盘通常是计算机最慢的子系统 , 也是最容易出现性能瓶颈的地方 , 因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作 , 比如转轴、寻轨等 。访问硬盘和访问内存之间的速度差别是以数量级来计算的 , 就像1天和1分钟的差别一样 。要监测 IO 性能 , 有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的 。
在理解磁盘IO之前 , 同样我们需要理解一些概念 , 例如: