目录
一、系统资源常见异常
性能指标是什么?想到了什么关键词?"高并发"和"响应快",也即对应着性能优化的两个核心指标,"吞吐"和"延迟"!这两个指标是从业务应用程序负载的视角来考察性能,直接影响了产品终端的用户体验,而跟它们对应的,是从系统资源的视角出发的指标,比如资源使用率、饱和度!
随着业务应用负载的增加,系统资源的使用率也会提高,甚至达到极限。而性能问题的本质,就是系统资源已经达到瓶颈,但请求的处理却还不够快,无法支撑更多的请求!
性能分析,其实就是找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更加高效地利用系统资源处理更多的请求。
1.1 CPU
这里说个一直以来的误解!经常容易把平均负载(load average)和CPU使用率混为一体!这里做一个区分!平均负载代表的是单位时间内,处于可运行状态和不可中断状态的活跃进程数(不仅仅包括了正在使用CPU的进程,还包括等待CPU和等待I/O的进程);CPU使用率代表的是单位时间内,CPU繁忙情况的统计,所以平均负载和CPU使用率不一定完全对应。
- CPU密集型进程,使用大量CPU会导致平均负载升高,此时这两者是一致的
- I/O密集型进程,等待I/O也会导致平均负载升高,但CPU使用率不一定很高
- 大量等待CPU的进程调度也会导致平均负载升高,此时的CPU使用率也会较高
CPU和平均负载指标压测工具和分析工具
工具名称 | 工具功能描述 |
stress | Linux系统压力测试工具,模拟进程异常和平均负载升高场景 CPU密集型:stress --cpu 1 --timeout 600 I/O密集型:stress -i l --timeout 600 大量进程场景:stress -c 8 --timeout 600 |
sysstat | mpstat: 常用多核CPU性能分析工具,每个CPU及所有CPU指标 监控所有CPU并间隔5秒输出:mpstat -P ALL 5 pidstat:进程性能分析工具,查看CPU、内存、I/O及上下文切换 分析进程CPU并间隔5秒输出数据:pidstat -u 5 1 |
1.2 内存
内存的去向主要有3个:1. 进程消耗 2. slab消耗 3.pagetable消耗
参考:Linux Used内存到底哪里去了? | 系统技术非业余研究
1.3 磁盘I/O
1.4 网络流量
iftop
二、常用分析工具
2.0 uptime
uptime命令为系统整体性能评估,需要注意的是:load average这个输出值,这三个值的大小一般不能大于系统CPU个数。 那如何查看当前系统的机器的CPU个数呢?见以下
# 系统CPU信息,通过cat /proc/cpuinfo,其中cores即为CPU的核数
cat /proc/cpuinfo |grep "cores"|uniq
cpu cores : 16
# uptime
15:11:41 up 607 days, 21:22, 2 users, load average: 4.77, 4.96, 5.17
# load average(平均负载)背后的真正含义是什么?
简单说!平均负载(load average)就是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和CPU使用率并没有直接关系!
可运行状态的进程: 是指正在使用CPU或者正在等待CPU的进程,即ps 命令看到的处于R状态(Running)的进程
不可中断状态的进程: 是正处于内核态关键流程中的进程,并且这些流程是不可被中断的,比如常见的等待硬件设备的I/O响应,也就是我们ps命令看到的D状态(Uninterruptible Sleep, Disk Sleep)的进程!不可中断状态实际上是系统对进程和硬件设备的一种保护机制!
活跃进程数据的平均值,理想状态下,就是每个CPU上都刚好运行着一个进程!
2.1 iostat
2.2 vmstat
2.3 sar
2.4 dstat
dstat命令可以查看Linux系统的整体负载,是一个可以用来替代vmstat、iostat、netstat、nfsstat、ifstat这些命令的工具,是一个全能系统信息统计工具。与sysstat(sar)相比,dstat拥有一个彩色的界面,在手动观察性能状况时,数据比较显眼容易观察,而且dstat支持即时刷新,与sysstat相同的是,dstat也可以收集指定的性能资源,如dstat -c 即显示CPU的使用情况。
使用示例
# dstat
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
1 0 98 1 0 0| 145M 8322k| 0 0 | 200k 140k|4238 11k
4 1 91 4 0 0| 340M 136k| 27M 32M| 208k 0 | 19k 40k
4 1 90 5 0 0| 342M 199k| 18M 31M| 108k 0 | 17k 41k
4 1 91 4 0 0| 356M 73k| 30M 31M| 148k 0 | 16k 38k
3 1 92 5 0 0| 332M 65k|9220k 32M| 224k 0 | 14k 36k
3 1 90 5 0 0| 330M 36k| 27M 32M| 196k 0 | 17k 37k
# -c--cpu :展示CPU状态,usr/sys/idl/wai=100,hiq和siq (硬中断次数和软中断次数)
# dsk/total: 磁盘读写,read:磁盘读取速度,writ:磁盘写速度
# net/total: 网络状态,recv:接收速度,send:发送速度
# paging: 换页空间,展示内存到换页空间(swap)的使用情况,从内存到swap是out,从swap到内存是in,只有频繁的in和out才表明内存不足
# system: int 每秒产生的中断次数,csw是每秒产生的上下文切换次数,这两者值越大说明消耗CPU时间越多
# CPU使用情况
# dstat -cyl --proc-count --top-cpu
----total-cpu-usage---- ---system-- ---load-avg--- proc -most-expensive-
usr sys idl wai hiq siq| int csw | 1m 5m 15m |tota| cpu process
1 0 98 1 0 0|4238 11k|5.76 5.78 5.96| 697|ceph-osd 0.0
4 1 91 4 0 0| 16k 36k|5.94 5.82 5.97| 697|rsync 0.5
4 1 91 4 0 0| 16k 33k|5.94 5.82 5.97| 697|rsync 0.7
3 1 91 6 0 0| 14k 32k|5.94 5.82 5.97| 697|rsync 0.5
5 1 92 3 0 0| 23k 55k|5.94 5.82 5.97| 697|rsync 1.1
4 1 92 3 0 0| 19k 38k|5.94 5.82 5.97| 696|rsync 0.9
4 1 93 3 0 0| 16k 37k|5.78 5.79 5.96| 696|rsync 0.8
4 1 92 3 0 0| 15k 36k|5.78 5.79 5.96| 696|rsync 0.8
# 内存使用情况
# dstat -glms --top-mem
---paging-- ---load-avg--- ------memory-usage----- ----swap--- --most-expensive-
in out | 1m 5m 15m | used buff cach free| used free| memory process
256k 0 |5.57 5.77 5.97|26.2G 316k 1525M 3215M|6597M 3643M|ceph-osd 1977M
236k 0 |5.61 5.77 5.97|26.2G 316k 1573M 3163M|6597M 3643M|ceph-osd 1977M
328k 0 |5.61 5.77 5.97|26.2G 316k 1655M 3083M|6596M 3644M|ceph-osd 1977M
224k 0 |5.61 5.77 5.97|26.2G 316k 1741M 2995M|6596M 3644M|ceph-osd 1977M
204k 0 |5.61 5.77 5.97|26.2G 316k 1811M 2921M|6596M 3644M|ceph-osd 1977M
128k 0 |5.61 5.77 5.97|26.2G 316k 1870M 2861M|6596M 3644M|ceph-osd 1977M
108k 0 |5.48 5.74 5.96|26.2G 316k 1924M 2814M|6596M 3644M|ceph-osd 1977M
2.5 perf
通过top、ps、pidstat等命令工具,你可以轻松找到CPU使用率较高(比如100%)的进程。接下来你可能又想知道,占用CPU的到底是代码里的哪个函数呢?找到它,你才能更高效、更针对性地进行性能优化,此时可借助perf工具进行分析定位,如perf top,类似于top,能够显示占用CPU时钟最多的函数或者指令,因此可以此来查找到热点函数。
perf命令是Linux系统原生提供的性能分析工具,会返回CPU正在执行的函数名以及调用栈(stack)。通常它的执行频率是99Hz(每秒99次),如果99次都返回同一个函数名,那就说明CPU这一秒钟都在执行同一个函数,可能存在性能问题。
perf工具可以对指定的进程或事件进行采样,并可以用调用栈的形式,输出整个调用链上的汇总信息,使用perf来查找应用程序或者内核中的热点函数,从而找出是什么函数占用CPU比较高,从而定位性能瓶颈,使用perf对系统内核线程进行分析时,内核线程依然还在正常运行中,所以这种方法也被称为"动态追踪技术"!
使用方式一
perf top
# 输出结果解释
# 第一行,Samples(采样数),event(事件类型),Event count(事件总数量)
# 继续看,包括四列数据 Overhead,Sharded,Object,Symbol
# Overhead: 表示该符号的性能事件在所有采样中的比例,用百分比表示
# Sharded: 是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等
# Object: 是动态共享对象的类型,比如[.]表示用户空间的可执行程序、或动态链接库,而[k]则表示内核空间
# Symbol: 即符号名,也就是函数名,当函数名未知时,用十六进制的地址来表示
使用方式二
虽然perf top实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离线或后续的分析,而perf record则提供了保存数据的功能,保存后的数据,需要你用perf report解析展示,perf record会自动保存到当前目录下的perf.data文件中。
# 执行perf record命令,记录pid的行为
# -g 选项是告诉perf record额外记录函数的调用关系
# -a 表示对所有CPU进行采集
# -p 表示指定需要record的进程ID(PID)
# --sleep 60 表示60秒后退出
perf record -a -g -p pid --sleep 60
# 分析当前目录下上述命令生成的perf.data文件
# 统计每个调用栈出现的百分比,然后从高到低排列
perf report -i ./perf.data
# perf record -ag --sleep 10 -p pid && perf report
参考:https://blog.51cto.com/liuzhengwei521/2360430
2.6 pstack
2.7 strace
2.8 bcc工具之execsnoop
在实际工作中,偶尔会遇到系统的CPU使用率和系统平均负载很高,但却找不到高CPU的应用程序或进程,产生这个问题的原因:进程有可能在不断的崩溃或者重启,如监控客户端zabbix_agent等,通过uptime发现系统负载很高,但是通过top、mpstat、pidstat、perf等工具很难发现是什么进程导致了系统负载和CPU使用率很高(通过上面的工具判断,即不是CPU密集型,也不存在IO等待,也不存在进程、线程争用情况等{即上下文切换和软硬中断次数等指标})。为啥top、mpstat、pidstat等监控不到呢?因为这些进程是瞬时发生的,top等命令还没来得及统计,瞬时进程已经退出了。
execsnoop工具专门用于追踪短时进程(瞬时进程)设计的工具,它通过ftrace实时监控进程的exec()行为,并输出短时进程的基本信息,包括进程PID,父进程PID,命令行参数以及执行的结果。
参考资料:https://github.com/brendangregg/perf-tools
性能分析工具总结
性能问题 | 适用工具 | 备注 |
CPU | 1. perf 2. vmstat 3. sar 4. top | 分析进程 |