运维必备的问题定位工具及案例分析

【摘要】本文主要介绍各种问题定位的工具,并结合案例分析问题 。
1. 背景有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源 。这时候就需要登录服务器进一步深入分析问题的根源 。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题 。所以,分析问题和踩坑非常锻炼一个人的成长和提升自我能力 。如果我们有一套好的分析工具,那将是事半功倍,能够帮助大家快速定位问题,节省大家很多时间做更深入的事情 。
 
2. 说明本篇文章主要介绍各种问题定位的工具以及会结合案例分析问题 。
 
3. 分析问题的方法论套用5W2H方法,可以提出性能分析的几个问题

  1. What-现象是什么样的
  2. When-什么时候发生
  3. Why-为什么会发生
  4. Where-哪个地方发生的问题
  5. How much-耗费了多少资源
  6. How to do-怎么解决问题
 4. CPU4.1 说明针对应用程序,我们通常关注的是内核CPU调度器功能和性能 。
线程的状态分析主要是分析线程的时间用在什么地方,而线程状态的分类一般分为:
a. on-CPU:执行中,执行中的时间通常又分为用户态时间user和系统态时间sys 。
b. off-CPU:等待下一轮上CPU,或者等待I/O、锁、换页等等,其状态可以细分为可执行、匿名换页、睡眠、锁、空闲等状态 。
如果大量时间花在CPU上,对CPU的剖析能够迅速解释原因;如果系统时间大量处于off-cpu状态,定位问题就会费时很多 。但是仍然需要清楚一些概念:
1、处理器
2、核
3、硬件线程
4、CPU内存缓存
5、时钟频率
6、每指令周期数CPI和每周期指令数IPC
7、CPU指令
8、使用率
9、用户时间/内核时间
10、调度器
11、运行队列
12、抢占
13、多进程
14、多线程
15、字长
4.2 分析工具
运维必备的问题定位工具及案例分析

文章插图
 
说明:
  1. uptime,vmstat,mpstat,top,pidstat只能查询到cpu及负载的的使用情况 。
  2. 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 说明内存是为提高效率而生,实际分析问题的时候,内存出现问题可能不只是影响性能,而是影响服务或者引起其他问题 。同样对于内存有些概念需要清楚:
1、主存
2、虚拟内存
3、常驻内存
4、地址空间
5、OOM
6、页缓存
7、缺页
8、换页
9、交换空间
10、交换
11、用户分配器libc、glibc、libmalloc和mtmalloc
12、linux内核级SLUB分配器
5.2 分析工具
运维必备的问题定位工具及案例分析

文章插图
 
说明:
1、free,vmstat,top,pidstat,pmap只能统计内存信息以及进程的内存使用情况 。
2、valgrind可以分析内存泄漏问题 。
3、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. 磁盘IO6.1 说明磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等 。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样 。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的 。
在理解磁盘IO之前,同样我们需要理解一些概念,例如:
1、文件系统
2、VFS
3、文件系统缓存
4、页缓存page cache
5、缓冲区高速缓存buffer cache
6、目录缓存
7、inode
8、inode缓存
9、noop调用策略


推荐阅读