Linux系统性能异常问题诊断,追根溯源(未完)

目录

一、系统资源常见异常

二、常用分析工具

三、案例分析


一、系统资源常见异常

        性能指标是什么?想到了什么关键词?"高并发"和"响应快",也即对应着性能优化的两个核心指标,"吞吐"和"延迟"!这两个指标是从业务应用程序负载的视角来考察性能,直接影响了产品终端的用户体验,而跟它们对应的,是从系统资源的视角出发的指标,比如资源使用率、饱和度!

        随着业务应用负载的增加,系统资源的使用率也会提高,甚至达到极限。而性能问题的本质,就是系统资源已经达到瓶颈,但请求的处理却还不够快,无法支撑更多的请求!

        性能分析,其实就是找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更加高效地利用系统资源处理更多的请求。

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内存到底哪里去了? | 系统技术非业余研究

                   故障分析 | 一条du命令引发的内存不足报警

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

分析进程

三、案例分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值