第62集:CPU 监控工具
教学目标
- 了解Linux系统中CPU监控的重要性和核心指标
- 掌握常用的CPU监控工具的使用方法和参数
- 学会解读监控工具的输出信息,识别CPU性能瓶颈
- 掌握CPU监控数据的分析方法和优化建议
- 了解不同场景下选择合适的CPU监控工具的策略
- 培养系统的CPU性能分析和故障排查能力
主要知识点
1. CPU监控的基本概念
1.1 CPU监控的核心指标
- CPU使用率:用户空间、系统空间、空闲、等待I/O、软中断、硬中断等
- 负载平均值:1分钟、5分钟、15分钟的系统负载
- 进程调度:进程上下文切换次数、运行队列长度
- CPU温度:硬件温度,防止过热
1.2 CPU监控的重要性
- 性能优化:识别CPU瓶颈,优化应用程序和系统配置
- 故障排查:当系统响应缓慢时,确定是否由CPU资源不足引起
- 容量规划:根据CPU使用趋势,合理规划系统扩容
- 资源分配:确保关键应用获得足够的CPU资源
2. 常用CPU监控工具
2.1 top命令
命令介绍
top是最常用的CPU监控工具之一,它实时显示系统的CPU使用情况、内存使用情况和进程信息。
基本用法
top输出解释
top - 10:00:00 up 1 day, 2:30, 1 user, load average: 0.50, 0.60, 0.70
Tasks: 150 total, 1 running, 149 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 92.0 id, 1.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 16384.0 total, 8192.0 free, 4096.0 used, 4096.0 buff/cache
MiB Swap: 8192.0 total, 8192.0 free, 0.0 used. 11264.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12345 root 20 0 100000 50000 20000 R 10.0 0.3 0:05.00 nginx
67890 user 20 0 50000 25000 10000 S 5.0 0.2 0:02.50 sshd- 第一行:系统时间、运行时间、登录用户数、系统负载
- 第二行:进程总数、运行中进程数、睡眠中进程数、停止进程数、僵尸进程数
- 第三行:CPU使用率(us:用户空间,sy:系统空间,ni: nice值调整,id:空闲,wa:等待I/O,hi:硬中断,si:软中断,st:被虚拟机窃取的时间)
- 第四行:内存使用情况
- 第五行:交换空间使用情况
- 第六行及以下:进程信息,按CPU使用率排序
常用交互命令
- h:显示帮助信息
- k:终止指定PID的进程
- r:修改指定PID进程的优先级
- f:添加或删除显示字段
- M:按内存使用率排序
- P:按CPU使用率排序
- T:按累计CPU时间排序
- 1:显示每个CPU核心的使用情况
- q:退出top
实用参数
-d:指定刷新间隔,单位为秒
top -d 2 # 每2秒刷新一次-p:监控指定PID的进程
top -p 12345 # 只监控PID为12345的进程-u:监控指定用户的进程
top -u nginx # 只监控nginx用户的进程-b:批处理模式,用于输出到文件
top -b -n 5 > top_output.txt # 输出5次结果到文件
2.2 htop命令
命令介绍
htop是top的增强版,提供了更友好的界面和更多的功能,如彩色显示、进程树视图、交互操作等。
安装方法
# Debian/Ubuntu
sudo apt-get install htop
# CentOS/RHEL
sudo yum install htop
# Fedora
sudo dnf install htop基本用法
htop输出解释
htop的输出界面比top更直观,包含以下部分:
- 顶部:CPU使用率、内存使用率、交换空间使用率、系统负载、运行时间
- 中部:进程列表,默认按CPU使用率排序,支持彩色显示
- 底部:交互命令提示
常用交互命令
- F1:显示帮助信息
- F2:配置htop界面
- F3:搜索进程
- F4:过滤进程
- F5:切换到进程树视图
- F6:选择排序字段
- F7:减少进程优先级(renice)
- F8:增加进程优先级(renice)
- F9:终止进程
- F10:退出htop
- Space:标记/取消标记进程
- U:取消所有标记
- s:跟踪进程的系统调用
- l:显示进程打开的文件
- t:显示进程树
- H:切换显示/隐藏线程
- I:切换显示/隐藏空闲进程
- K:显示/隐藏内核线程
- u:显示指定用户的进程
实用参数
-d:指定刷新间隔,单位为10秒的小数
htop -d 10 # 每1秒刷新一次(10/10秒)-p:监控指定PID的进程
htop -p 12345,67890 # 监控多个PID的进程-u:监控指定用户的进程
htop -u nginx # 只监控nginx用户的进程
2.3 vmstat命令
命令介绍
vmstat(Virtual Memory Statistics)是一个综合性的系统监控工具,它可以显示CPU使用率、内存使用情况、进程状态、I/O状态等信息。
基本用法
vmstat输出解释
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 8388608 102400 4194304 0 0 0 0 10 20 5 2 93 0 0 procs:进程状态
- r:运行队列中的进程数
- b:处于不可中断睡眠状态的进程数
memory:内存使用情况
- swpd:已使用的交换空间大小
- free:空闲内存大小
- buff:用于缓冲的内存大小
- cache:用于缓存的内存大小
swap:交换空间使用情况
- si:从交换空间调入内存的数据量(每秒)
- so:从内存调入交换空间的数据量(每秒)
io:I/O状态
- bi:从块设备读取的数据量(每秒)
- bo:写入块设备的数据量(每秒)
system:系统状态
- in:每秒中断次数
- cs:每秒上下文切换次数
cpu:CPU使用率
- us:用户空间使用率
- sy:系统空间使用率
- id:空闲使用率
- wa:等待I/O的使用率
- st:被虚拟机窃取的时间
实用参数
-n:只显示一次结果
vmstat -n-s:显示内存统计信息
vmstat -s-t:显示时间戳
vmstat -t-w:宽输出模式,显示更详细的信息
vmstat -w-d:显示磁盘统计信息
vmstat -d-D:显示磁盘总体统计信息
vmstat -Dinterval:指定刷新间隔,单位为秒
vmstat 2 # 每2秒刷新一次 vmstat 2 5 # 每2秒刷新一次,共显示5次
2.4 mpstat命令
命令介绍
mpstat(Multi-Processor Statistics)是一个专门用于监控多处理器系统CPU使用情况的工具,它可以显示每个CPU核心的详细使用情况。
安装方法
mpstat是sysstat包的一部分,需要先安装sysstat:
# Debian/Ubuntu
sudo apt-get install sysstat
# CentOS/RHEL
sudo yum install sysstat
# Fedora
sudo dnf install sysstat基本用法
mpstat输出解释
Linux 5.4.0-80-generic (hostname) 06/01/2023 _x86_64_ (4 CPU)
10:00:00 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:00:00 AM all 5.00 0.00 2.00 0.50 0.00 0.00 0.00 0.00 0.00 92.50- 第一行:系统信息和日期
- 第二行:表头,解释各列的含义
- 第三行:所有CPU核心的平均使用情况
- CPU:CPU编号,all表示所有CPU
- %usr:用户空间使用率
- %nice:nice值调整的进程使用率
- %sys:系统空间使用率
- %iowait:等待I/O的使用率
- %irq:硬中断使用率
- %soft:软中断使用率
- %steal:被虚拟机窃取的时间
- %guest:运行虚拟机的时间
- %gnice:运行nice值调整的虚拟机的时间
- %idle:空闲使用率
实用参数
-P:指定要显示的CPU核心,ALL表示所有核心
mpstat -P ALL # 显示所有CPU核心的使用情况 mpstat -P 0,1 # 只显示CPU 0和CPU 1的使用情况interval:指定刷新间隔,单位为秒
mpstat 2 # 每2秒刷新一次 mpstat -P ALL 2 5 # 每2秒刷新一次所有CPU核心的使用情况,共显示5次
2.5 pidstat命令
命令介绍
pidstat是sysstat包的一部分,它可以显示指定进程或所有进程的CPU使用情况、内存使用情况、I/O使用情况等。
基本用法
pidstat输出解释
Linux 5.4.0-80-generic (hostname) 06/01/2023 _x86_64_ (4 CPU)
10:00:00 AM UID PID %usr %system %guest %wait %CPU CPU Command
10:00:00 AM 0 1234 2.00 1.00 0.00 0.00 3.00 0 nginx
10:00:00 AM 0 5678 1.00 0.50 0.00 0.00 1.50 1 sshd- 第一行:系统信息和日期
- 第二行:表头,解释各列的含义
- 第三行及以下:进程的CPU使用情况
- UID:进程所属用户的ID
- PID:进程ID
- %usr:用户空间使用率
- %system:系统空间使用率
- %guest:运行虚拟机的时间
- %wait:进程等待CPU的时间百分比
- %CPU:进程使用的CPU百分比
- CPU:进程运行在哪个CPU核心上
- Command:进程命令名
实用参数
-u:显示CPU使用情况(默认)
pidstat -u-r:显示内存使用情况
pidstat -r-d:显示I/O使用情况
pidstat -d-p:监控指定PID的进程
pidstat -p 1234 # 只监控PID为1234的进程-t:显示线程级别的统计信息
pidstat -t # 显示所有线程的CPU使用情况-u:监控指定用户的进程
pidstat -u nginx # 只监控nginx用户的进程interval:指定刷新间隔,单位为秒
pidstat 2 # 每2秒刷新一次 pidstat -p 1234 2 5 # 每2秒刷新一次PID为1234的进程的CPU使用情况,共显示5次
2.6 sar命令
命令介绍
sar(System Activity Reporter)是sysstat包的一部分,它可以收集、报告和保存系统活动信息,包括CPU使用情况、内存使用情况、I/O使用情况、网络使用情况等。
基本用法
sar输出解释
Linux 5.4.0-80-generic (hostname) 06/01/2023 _x86_64_ (4 CPU)
10:00:00 AM CPU %user %nice %system %iowait %steal %idle
10:10:00 AM all 5.00 0.00 2.00 0.50 0.00 92.50
10:20:00 AM all 5.50 0.00 2.20 0.60 0.00 91.70
10:30:00 AM all 4.80 0.00 1.90 0.40 0.00 92.90
Average: all 5.10 0.00 2.03 0.50 0.00 92.37- 第一行:系统信息和日期
- 第二行:表头,解释各列的含义
- 第三行及以下:不同时间点的CPU使用情况
- 最后一行:平均值
实用参数
-u:显示CPU使用情况(默认)
sar -u-P:指定要显示的CPU核心,ALL表示所有核心
sar -P ALL # 显示所有CPU核心的使用情况-f:从指定的文件中读取数据
sar -f /var/log/sysstat/sa01 # 从sa01文件中读取数据-o:将数据保存到指定文件
sar -o /var/log/sysstat/sa01 60 10 # 每60秒收集一次数据,共收集10次,保存到sa01文件interval:指定数据收集间隔,单位为秒
sar 2 5 # 每2秒收集一次CPU使用情况,共收集5次
3. CPU监控工具的选择与使用场景
3.1 工具对比
| 工具 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| top | 简单易用,实时显示,默认安装 | 界面相对简单,功能有限 | 快速查看系统CPU使用情况,监控进程 |
| htop | 界面友好,功能丰富,支持彩色显示 | 需要额外安装 | 交互式CPU监控,进程管理 |
| vmstat | 综合性强,显示内存和I/O信息 | CPU信息不够详细 | 系统整体性能监控,识别瓶颈 |
| mpstat | 显示每个CPU核心的详细信息 | 需要额外安装 | 多核心CPU性能分析,负载均衡 |
| pidstat | 显示进程级别的详细信息 | 需要额外安装 | 进程级CPU监控,识别占用CPU的进程 |
| sar | 可以保存历史数据,支持趋势分析 | 需要额外安装,配置复杂 | 长期性能监控,历史数据分析 |
3.2 使用场景推荐
场景1:快速查看系统整体CPU使用情况
- 推荐工具:top或htop
- 使用方法:直接运行
top或htop命令 - 适用情况:系统响应缓慢时,快速判断是否由CPU资源不足引起
场景2:分析多核心CPU的负载分布
- 推荐工具:mpstat
- 使用方法:运行
mpstat -P ALL命令 - 适用情况:系统CPU使用率高,但不确定哪个核心负载过高
场景3:识别占用CPU的进程
- 推荐工具:top、htop或pidstat
- 使用方法:
top:按CPU使用率排序,查看占用CPU最高的进程htop:彩色显示,更直观地查看进程CPU使用情况pidstat:查看进程级别的详细CPU使用情况
- 适用情况:系统CPU使用率高,需要找出具体是哪个进程占用了大量CPU资源
场景4:分析系统CPU使用趋势
- 推荐工具:sar
- 使用方法:配置sysstat服务,定期收集数据,然后使用
sar命令查看历史数据 - 适用情况:需要分析系统CPU使用的长期趋势,进行容量规划
场景5:系统整体性能分析
- 推荐工具:vmstat
- 使用方法:运行
vmstat命令,同时查看CPU、内存、I/O等信息 - 适用情况:系统性能问题可能由多个因素引起,需要综合分析
4. CPU监控数据的分析与优化
4.1 常见CPU性能问题及分析
问题1:CPU使用率过高
- 现象:CPU使用率持续超过80%,系统响应缓慢
- 可能原因:
- 应用程序逻辑问题,导致CPU密集型操作
- 进程数量过多,导致CPU竞争
- 死循环或无限递归
- 系统服务异常,消耗大量CPU资源
- 分析方法:
- 使用top或htop查看占用CPU最高的进程
- 使用pidstat查看进程级别的CPU使用情况
- 使用mpstat查看每个CPU核心的负载情况
- 解决方法:
- 优化应用程序代码,减少CPU密集型操作
- 调整进程优先级,确保关键应用获得足够的CPU资源
- 终止或重启异常进程
- 考虑增加CPU核心或升级CPU
问题2:系统CPU使用率高,用户CPU使用率低
- 现象:
%sys值高,%usr值低 - 可能原因:
- 系统调用频繁
- 中断处理过多
- 内核线程活跃
- 分析方法:
- 使用vmstat查看上下文切换次数(cs列)和中断次数(in列)
- 使用pidstat查看内核线程的CPU使用情况
- 解决方法:
- 优化应用程序,减少系统调用次数
- 检查硬件设备驱动,是否有异常中断
- 调整内核参数,优化中断处理
问题3:I/O等待时间长
- 现象:
%iowait值高 - 可能原因:
- 磁盘I/O性能瓶颈
- 文件系统问题
- 存储设备故障
- 分析方法:
- 使用iostat查看磁盘I/O情况
- 使用iotop查看进程I/O使用情况
- 检查系统日志,是否有磁盘错误
- 解决方法:
- 优化磁盘I/O,如使用SSD、RAID等
- 调整文件系统参数
- 检查并修复存储设备故障
问题4:CPU负载高,但使用率不高
- 现象:系统负载平均值高,但CPU使用率不高
- 可能原因:
- 进程等待I/O操作
- 进程阻塞在其他资源上
- 分析方法:
- 使用vmstat查看b列(不可中断睡眠进程数)
- 使用iostat查看磁盘I/O情况
- 解决方法:
- 优化I/O操作
- 检查进程是否有资源竞争
4.2 CPU优化建议
应用程序优化
- 代码优化:减少CPU密集型操作,优化算法和数据结构
- 并行处理:使用多线程或多进程,充分利用多核CPU
- 异步操作:将I/O操作改为异步,避免阻塞
- 缓存优化:合理使用缓存,减少重复计算
系统配置优化
- 进程优先级:使用nice和renice命令调整进程优先级
- CPU亲和性:使用taskset命令设置进程的CPU亲和性,减少上下文切换
- 内核参数:调整内核参数,优化CPU调度
# 调整进程调度策略 echo 1 > /proc/sys/kernel/sched_child_runs_first # 调整内核定时器频率 echo 1000 > /proc/sys/kernel/hrtimer_resolution
硬件优化
- 增加CPU核心:对于多线程应用,增加CPU核心数可以显著提高性能
- 升级CPU:选择更高性能的CPU,如更高的主频、更大的缓存
- 使用NUMA架构:对于多处理器系统,使用NUMA架构可以减少内存访问延迟
实用案例分析
案例1:识别并解决CPU使用率过高的问题
场景描述
系统响应缓慢,通过top命令发现CPU使用率持续超过90%。
分析步骤
- 使用top命令查看CPU使用情况
top输出显示:
top - 10:00:00 up 1 day, 2:30, 1 user, load average: 3.50, 3.20, 3.00
Tasks: 150 total, 3 running, 147 sleeping, 0 stopped, 0 zombie
%Cpu(s): 85.0 us, 10.0 sy, 0.0 ni, 5.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st查看占用CPU最高的进程
在top命令中,按P键按CPU使用率排序,发现一个名为cpu-intensive-app的进程占用了大量CPU资源。使用pidstat查看进程的详细CPU使用情况
pidstat -p $(pgrep cpu-intensive-app)输出显示:
Linux 5.4.0-80-generic (hostname) 06/01/2023 _x86_64_ (4 CPU)
10:00:00 AM UID PID %usr %system %guest %wait %CPU CPU Command
10:00:00 AM 0 12345 80.00 5.00 0.00 0.00 85.00 0 cpu-intensive-app- 使用mpstat查看每个CPU核心的使用情况
mpstat -P ALL输出显示:
Linux 5.4.0-80-generic (hostname) 06/01/2023 _x86_64_ (4 CPU)
10:00:00 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:00:00 AM 0 90.00 0.00 5.00 0.00 0.00 0.00 0.00 0.00 0.00 5.00
10:00:00 AM 1 10.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 88.00
10:00:00 AM 2 5.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 94.00
10:00:00 AM 3 6.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 93.00
10:00:00 AM all 27.75 0.00 2.25 0.00 0.00 0.00 0.00 0.00 0.00 69.00- 分析结果
从输出可以看出:
cpu-intensive-app进程占用了85%的CPU资源- 主要集中在CPU 0核心上,使用率达到95%
- 其他CPU核心相对空闲
解决方案
- 方案1:优化应用程序代码,减少CPU密集型操作
- 方案2:如果应用程序支持多线程,修改代码使其充分利用多核CPU
- 方案3:使用taskset命令将进程绑定到多个CPU核心
taskset -c 0,1,2,3 12345 # 将进程绑定到所有4个CPU核心验证结果
应用解决方案后,再次使用top和mpstat命令检查CPU使用情况,确认CPU使用率是否降低,负载是否均衡。
案例2:分析系统CPU负载高的原因
场景描述
系统负载平均值持续高于CPU核心数,但CPU使用率并不高。
分析步骤
- 使用top命令查看系统状态
top输出显示:
top - 10:00:00 up 1 day, 2:30, 1 user, load average: 5.20, 4.80, 4.50
Tasks: 150 total, 1 running, 149 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.0 us, 5.0 sy, 0.0 ni, 75.0 id, 10.0 wa, 0.0 hi, 0.0 si, 0.0 st- 使用vmstat命令查看系统整体状态
vmstat 2输出显示:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 4 0 8388608 102400 4194304 0 0 100 200 50 80 10 5 75 10 0 - 使用iostat命令查看磁盘I/O情况
iostat -x 2输出显示:
Linux 5.4.0-80-generic (hostname) 06/01/2023 _x86_64_ (4 CPU)
device r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 50.0 20.0 200.0 400.0 17.1 3.5 50.0 20.0 80.0 10.0 70.0- 分析结果
从输出可以看出:
- 系统负载平均值为5.20,高于4个CPU核心
- 但CPU使用率只有25%(10%用户+5%系统+10%I/O等待)
- vmstat显示有4个进程处于不可中断睡眠状态(b列)
- iostat显示磁盘I/O使用率达到70%,平均响应时间为50毫秒
解决方案
- 方案1:优化磁盘I/O,如使用SSD替换HDD
- 方案2:调整应用程序,减少I/O操作,增加缓存
- 方案3:优化文件系统参数,如调整I/O调度器
# 临时调整I/O调度器为deadline echo deadline > /sys/block/vda/queue/scheduler验证结果
应用解决方案后,再次使用top、vmstat和iostat命令检查系统状态,确认负载是否降低,I/O性能是否改善。
课后练习
基础练习
- 使用top命令查看系统CPU使用情况,识别占用CPU最高的进程
- 使用htop命令查看系统CPU使用情况,熟悉其交互功能
- 使用mpstat命令查看每个CPU核心的使用情况
- 使用vmstat命令查看系统整体状态,包括CPU、内存和I/O
进阶练习
- 配置sysstat服务,使用sar命令收集和分析CPU使用历史数据
- 使用pidstat命令监控特定进程的CPU使用情况
- 分析系统CPU使用率高的原因,提出优化建议
- 模拟CPU密集型场景,测试不同监控工具的表现
挑战练习
- 编写一个脚本,使用vmstat和mpstat命令定期收集CPU使用数据,生成报告
- 分析一个实际系统的CPU性能问题,提出详细的优化方案
- 比较不同CPU监控工具的性能开销,评估其对系统的影响
总结
本集教程详细介绍了Linux系统中常用的CPU监控工具,包括top、htop、vmstat、mpstat、pidstat和sar等命令的使用方法、输出解释和实战应用。
CPU监控的核心指标:
- CPU使用率(用户空间、系统空间、空闲、等待I/O等)
- 负载平均值
- 进程调度情况
常用CPU监控工具:
- top:简单易用的实时监控工具
- htop:功能丰富的交互式监控工具
- vmstat:综合性系统监控工具
- mpstat:多核心CPU监控工具
- pidstat:进程级CPU监控工具
- sar:历史数据收集和分析工具
工具选择与使用场景:
- 快速查看:top或htop
- 多核心分析:mpstat
- 进程分析:pidstat
- 历史趋势:sar
- 综合分析:vmstat
CPU性能问题分析与优化:
- 识别CPU使用率过高的原因
- 分析系统负载高的原因
- 提出针对性的优化建议
通过本集教程的学习,您已经掌握了Linux系统中CPU监控的基本方法和工具,能够独立分析CPU性能问题,提出优化建议,确保系统的稳定运行和性能优化。在实际工作中,您应该根据具体场景选择合适的监控工具,结合系统的其他指标进行综合分析,从而更准确地识别和解决性能问题。