Linux 问题故障定位,看这一篇就够了

作者:Lucien_168来源:https://www.jianshu.com/p/0bbac570fa4c1. 背景
有时候会遇到一些疑难杂症 , 并且监控插件并不能一眼立马发现问题的根源 。这时候就需要登录服务器进一步深入分析问题的根源 。那么分析问题需要有一定的技术经验积累 , 并且有些问题涉及到的领域非常广 , 才能定位到问题 。所以 , 分析问题和踩坑是非常锻炼一个人的成长和提升自我能力 。如果我们有一套好的分析工具 , 那将是事半功倍 , 能够帮助大家快速定位问题 , 节省大家很多时间做更深入的事情 。
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 分析工具
 
Linux 问题故障定位,看这一篇就够了

文章插图
 
 
说明:
  • 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-clock5. 内存
5.1 说明
内存是为提高效率而生 , 实际分析问题的时候 , 内存出现问题可能不只是影响性能 , 而是影响服务或者引起其他问题 。同样对于内存有些概念需要清楚:
  • 主存
  • 虚拟内存
  • 常驻内存
  • 地址空间
  • OOM
  • 页缓存
  • 缺页
  • 换页
  • 交换空间
  • 交换
  • 用户分配器libc、glibc、libmalloc和mtmalloc
  • linux内核级SLUB分配器
5.2 分析工具
 
Linux 问题故障定位,看这一篇就够了

文章插图
 
 
说明:
  • free,vmstat,top,pidstat,pmap只能统计内存信息以及进程的内存使用情况 。
  • valgrind可以分析内存泄漏问题 。
  • dtrace动态跟踪 。需要对内核函数有很深入的了解 , 通过D语言编写脚本完成跟踪 。
5.3 使用方式
//查看系统内存使用情况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之前 , 同样我们需要理解一些概念 , 例如: