文章目录
- CPU 使用率过高问题排查
- 1. CPU使用率过高常见问题
- 2. 压力测试
- 2.1 stress
- 安装
- 参数说明
- 测试示例
- 2.2 stress-ng
- 安装
- 参数说明
- 测试示例
- 3. 问题排查
- 3.1 使用 top 命令
- 3.2 使用 ps 命令
- 3.3 使用 perf top
- 3.4 vmstat 命令
- 常用信息
- 内存信息
- 磁盘信息
CPU 使用率过高问题排查
1. CPU使用率过高常见问题
无法SSH连接
操作卡顿
用户访问服务响应失败,超时
…
2. 压力测试
2.1 stress
stress
是一款简单但功能强大的工具,可对Linux
系统施加可配置的CPU、内存、I/O 或磁盘
压力。通过模拟繁重的工作负载,系统管理员可以观察系统在压力下的表现反应。这一工具的价值在于找出系统潜在的薄弱环节,确保系统能够在不影响性能的情况下处理繁重的任务。
stress-ng:
stress-ng
是stress
的扩展版本,它超越了前者的基本功能,提供的压力测试范围更广,不仅包括CPU、内存、I/O 和磁盘压力
,还包括对进程间通信、套接字和各种文件操作
的额外测试。
stress
和stress-ng
对Linux
系统的前瞻性管理都有很大帮助,使管理员和程序员能够优化系统配置、识别潜在问题并提高系统的整体可靠性
安装
使用
stress
命令进行压力测试,这个命令需要单例安装可参考文档:https://blog.csdn.net/cronaldo91/article/details/131214903
- 使用
yum
安装yum install -y epel-release.noarch && yum -y update yum install -y stress stress-ng
- 源码安装
源码地址:https://fossies.org/linux/privat/stress-ng-0.17.08.tar.gz/
参数说明
参考:https://blog.csdn.net/qq_34777982/article/details/137334439
[root@105 ~]# stress --help
`stress' imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-?, --help show this help statement--version show version statement-v, --verbose be verbose-q, --quiet be quiet-n, --dry-run show what would have been done-t, --timeout N timeout after N seconds--backoff N wait factor of N microseconds before work starts-c, --cpu N spawn N workers spinning on sqrt()-i, --io N spawn N workers spinning on sync()-m, --vm N spawn N workers spinning on malloc()/free()--vm-bytes B malloc B bytes per vm worker (default is 256MB)--vm-stride B touch a byte every B bytes (default is 4096)--vm-hang N sleep N secs before free (default none, 0 is inf)--vm-keep redirty memory instead of freeing and reallocating-d, --hdd N spawn N workers spinning on write()/unlink()--hdd-bytes B write B bytes per hdd worker (default is 1GB)Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10sNote: Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size).
参数 | 说明 |
---|---|
-c | –cpu N: 产生 N 个进程,每个进程都反复不停的计算随机数的平方根; |
-i | –io N: 产生 N 个进程,每个进程反复调用 sync() 将内存上的内容写到硬盘上; |
-m | –vm N: 产生 N 个进程,每个进程不断分配和释放内存; |
–vm-bytes B | 指定分配内存的大小; |
–vm-stride B | 不断的给部分内存赋值,让 COW(Copy On Write)发生; |
–vm-hang N | 指示每个消耗内存的进程在分配到内存后转入睡眠状态 N 秒,然后释放内存,一直重复执行这个过程; |
–vm-keep | 一直占用内存,区别于不断的释放和重新分配(默认是不断释放并重新分配内存); |
-d | –hadd N: 产生 N 个不断执行 write 和 unlink 函数的进程(创建文件,写入内容,删除文件); |
–hadd-bytes B | 指定文件大小; |
-t | –timeout N: 在 N 秒后结束程序; |
–backoff N | 等待N微妙后开始运行; |
-q | –quiet: 程序在运行的过程中不输出信息; |
-n | –dry-run: 输出程序会做什么而并不实际执行相关的操作; |
–version | 显示版本号 |
-v | –verbose: 显示详细的信息 |
测试示例
- CPU压测
# stress 消耗 CPU 资源是通过调用 sqrt() 函数(计算由 rand() 函数产生的随机数的平方根)实现。命令会产生 8 个这样的子进程不断计算,超时时间为20秒,结束后再次运行 uptime 比较平均负载
stress --cpu 8 --timeout 20# 启动 8 个 sqrt() 子进程,超时时间 30s,同时显示有关操作的详细信息
stress --cpu 8 -v --timeout 30s
- 内存测试
# 产生 8 个子进程,超时时间 20s,每个进程不断分配和释放内存
stress --vm 8 --timeout 20s# 产生 2 个子进程,每个进程分配 2048M 内存
stress --vm 2 --vm-bytes 2048M --vm-keep --timeout 20s
- IO测试
# 产生 8 个进程,每个进程都反复调用 sync() 函数将内存上的内容写到硬盘上
stress -i 8 --timeout 20s# 产生 1 个进程不断的在磁盘上创建 10M 大小的文件并写入内容
# 使用 top 命令查看 CPU 的状态(此时的 CPU 主要消耗在内核态),iostat 2 输出,高 iowait,瓶颈是写磁盘
stress -d 1 --hdd-bytes 10M --timeout 20s# 执行多个类型的任务,比如产生 4 个 CPU 进程、3 个 IO 进程、2 个 256M 的 vm 进程,并且每个 vm 进程中循环分配释放内存:
stress --cpu 4 --io 3 --vm 2 --vm-bytes 256M --vm-keep --timeout 20s
2.2 stress-ng
stress-ng
完全兼容stress
, 并且在此基础上通过几百个参数,可以产生各种复杂的压力
安装
yum install stress-ng
参数说明
-h,--help:显示帮助信息;--version:显示版本信息;-t,–timeout:指定程序运行结束的时间,后面直接跟数字,单位为秒;-c,–-cpu:后面空格跟一个整数,表示测试CPU的进程数,--cpu 4 :表示生成4个worker循环调用sqrt()产生cpu压力;-i,--io:后面空格跟一个整数,表示测试磁盘I/O的进程数, --io 4 :表示生成4个worker循环调用sync()产生io压力;-m,--vm:后面空格跟一个整数,表示测试内存的进程数,--vm 4 :表示生成4个worker循环调用malloc()/free()产生内存压力;-d,--hdd:后面空格直接跟数字,表示产生执行write和unlink函数的进程数,用于磁盘负载测试;--cpu-method:指定CPU的测试方法,后面空格直接跟方法名;--metrics:输出命令执行指标;--vm-bytes:指定在内存测试时malloc的字节数,默认256M;--class:指定测试类别,后面空格跟类别名;--matrix:启用矩阵测试模式,后面空格跟矩阵模式名;--random-seed:指定测试随机种子,后面空格跟种子名;--sequential:启用顺序测试模式;--hdd-bytes:指定写的字节数;--cpu-load:CPU负载占比,后面空格直接跟数字,单位为百分比;
测试示例
- CPU测试
# 使用 4 个 CPU 进程数,进行矩阵乘法计算以进行压力测试,持续时间为20秒
stress-ng --cpu 4 --cpu-method matrixprod --timeout 20s# 产生 2 个 worker 做圆周率算法压力
stress-ng -c 2 --cpu-method pi --timeout 20s# 产生 2 个 worker 迭代使用 30 多种不同的压力算法,包括pi, crc16, fft等等
stress-ng -c 2 --cpu-method all --timeout 20s# 产生 2 个 worker 调用 socket 相关函数产生压力
stress-ng --sock 2 --timeout 20s# 产生 2 个 worker 读取 tsc 产生压力
stress-ng --tsc 2 --timeout 20s# 将压力指定到特定的cpu 0上
stress-ng --tsc 2 --taskset 0 --timeout 20s
- 内存测试
# 用 4 个内存分配进程, 每次分配大小512M,分配后不释放,保持测试20秒
stress-ng --vm 4 --vm-bytes 512M --timeout 20s
- IO测试
# 使用 4 个 IO 进程 ,保持测试20秒
stress-ng --io 4 --timeout 20s
- 磁盘IO压测
# 使用 4 个I/O进程, 1 个写进程,每次写1G 文件块,测试20秒
stress-ng --io 4 --hdd 1 --hdd-bytes 1G --timeout 20s
3. 问题排查
3.1 使用 top 命令
- top 命令简介
- 命令选项
参数 说明 -b 以批处理模式操作 -c 显示完整的治命令 -d 屏幕刷新间隔时间 -I 忽略失效过程 -s 保密模式 -S 累积模式 -i<时间> 设置刷新间隔时间 -u<用户名> 指定用户名 -p<进程号> 指定进程 -n<次数> 循环显示的次数
- 在该命令中常用快捷键
参数 说明 h 显示快捷键帮助 k 终止一个进程 i 开/关忽略闲置和僵死进程 q 退出程序 r 重新安排一个进程的优先级别 S 切换到累计模式 s 更改刷新间隔时间,单位秒 f,F 从当前显示中添加或者删除项目 o,O 改变显示项目的顺序 l 切换显示平均负载和启动时间信息 m 切换显示内存信息 t 切换显示进程和CPU状态信息 c 切换显示命令名称和完整命令行 M 根据内存使用大小排序 P 根据CPU使用率进行排序 (默认排序) T 根据时间/累计时间进行排序 w 将当前设置写入~/.toprc文件中 1 展开多核cpu显示
- 说明
参数 说明 top - 系统当前时间 up 系统已开机多长时间 user 当前用户数 load average cpu平均负载,三个数值分别为,1分钟,5分钟,15分钟 Tasks 系统当前进程数,total:总进程数,running:正在运行的进程数,sleeping:睡眠的进程数,stopped:停止的进程数,zombie:僵尸进程数 %Cpu(s) cpu使用率 us:(user)用户使用cpu百分百,sy:(system)系统内核使用cpu百分百,ni:(niced)运行已调整优先级的用户进程的CPU时间,id:剩余的cpu百分百,wa:(IO wait)用于等待IO完成的CPU时间,hi:处理硬件中断的CPU时间,si: 处理软件中断的CPU时间,st:这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的) Mem 内存使用信息,total:总内存大小,free:空闲的内存,used:已使用的内存,buff/cache:缓存的内存大小 Swap 虚拟内存信息 PID 进程id USER 进程所有者 PR 优先级 NI nice值,负值表示高优先级,正值表示低优先级 VIRT 进程使用的虚拟内存总量 RES 进程使用的物理内存大小 SHR 共享内存大小 S 进程状态,D:不可中断的睡眠状态,R:运行,S:睡眠,T:跟踪/停止,Z:僵尸进程 %CPU 进程使用的CPU占用百分比 %MEM 进程使用的物理内存百分比 TIME+ 进程使用的CPU时间总计 COMMAND 命令名
3.2 使用 ps 命令
ps aux --sort=-%cpu | head -n 10参数说明:ps aux 可以用来查看进程的 CPU 内存使用情况--sort=-%CPU 以参数%CPU进行降序排列,升序排列可使用 --sort=+%CPU,同理也可以使用 %MEM 参数进行排序head -n 10 取前10行
3.3 使用 perf top
它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数
第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)
第一列
Overhead
,是该符号的性能事件在所有采样中的比例,用百分比来表示。第二列
Shared
,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。第三列
Object
,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。最后一列
Symbol
是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示
3.4 vmstat 命令
是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数
CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。
常用信息
# 每隔5秒输出一组数据,一共输出5组
[root@105 ~]# vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st
10 0 64 388948 4172 1305068 0 0 23 44 35 18 1 0 99 0 08 0 64 388932 4172 1305068 0 0 0 0 1837 211 100 0 0 0 08 0 64 388932 4172 1305068 0 0 0 0 1777 206 100 0 0 0 08 0 64 388932 4172 1305068 0 0 0 0 1772 206 100 0 0 0 08 0 64 388932 4172 1305068 0 0 0 1 1775 207 100 0 0 0 0
- 参数说明
参数 | 说明 |
---|---|
r | 运行队列中进程数量 |
b | 等待IO的进程数量 |
swpd | 使用虚拟内存大小 |
free | 可用内存大小 |
buff | 用作缓冲的内存大小(是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值) |
cache | 用作缓存的内存大小(是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和。(有遇到过些系统是Cached 与 Slab之和,具体还以自己系统为准)) |
si | 每秒从交换区写到内存的大小 |
so | 每秒写入交换区的内存大小 |
bi | 每秒读取的块数(现在的Linux版本块的大小为1024bytes) |
bo | 每秒写入的块数(现在的Linux版本块的大小为1024bytes) |
in | 每秒中断数,包括时钟中断。【interrupt】 |
cs | 每秒上下文切换数。 【count/second】 |
us | 用户进程执行时间(user time) |
sy | 系统进程执行时间(system time) |
id | 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。 |
wa | 等待IO时间 |
注:
- 如果
r
经常大于 4,id
经常少于 40,表示cpu
的负荷很重。- 如果
bi,bo
长期不等于0
,表示内存不足。- 如果
disk
经常不等于0
,且在b
中的队列大于3
,表示io
性能不好。- Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。
内存信息
[root@105 ~]# vmstat -s1867044 K total memory168700 K used memory623160 K active memory639964 K inactive memory389004 K free memory4172 K buffer memory1305168 K swap cache1048572 K total swap64 K used swap1048508 K free swap871742 non-nice user cpu ticks190 nice user cpu ticks46726 system cpu ticks57724331 idle cpu ticks3661 IO-wait cpu ticks0 IRQ cpu ticks3668 softirq cpu ticks0 stolen cpu ticks13153817 pages paged in25607239 pages paged out11 pages swapped in20 pages swapped out21641981 interrupts10865763 CPU context switches1716926093 boot time64048 forks
注:这些信息的分别来自于
/proc/meminfo,/proc/stat
和/proc/vmstat
磁盘信息
[root@105 ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------total merged sectors ms total merged sectors ms cur sec
sr0 18 0 2056 316 0 0 0 0 0 0
sda 44509 22 26305578 419857 116587 12097 51219286 2593733 0 89
dm-0 43003 0 26218018 416346 128402 0 51040550 2808927 0 87
dm-1 145 0 6616 112 20 0 160 61 0 0
注:这些信息主要来自于
/proc/diskstats
显示指定磁盘分区统计信息
[root@105 ~]# vmstat -p /dev/sda1
sda1 reads read sectors writes requested writes1182 73488 252 178576
注:这些信息主要来自于
/proc/diskstats