第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 -D
  • interval:指定刷新间隔,单位为秒

    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
  • 使用方法:直接运行tophtop命令
  • 适用情况:系统响应缓慢时,快速判断是否由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%。

分析步骤

  1. 使用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
  1. 查看占用CPU最高的进程
    在top命令中,按P键按CPU使用率排序,发现一个名为cpu-intensive-app的进程占用了大量CPU资源。

  2. 使用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
  1. 使用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
  1. 分析结果
    从输出可以看出:
  • cpu-intensive-app进程占用了85%的CPU资源
  • 主要集中在CPU 0核心上,使用率达到95%
  • 其他CPU核心相对空闲
  1. 解决方案

    • 方案1:优化应用程序代码,减少CPU密集型操作
    • 方案2:如果应用程序支持多线程,修改代码使其充分利用多核CPU
    • 方案3:使用taskset命令将进程绑定到多个CPU核心
    taskset -c 0,1,2,3 12345  # 将进程绑定到所有4个CPU核心
  2. 验证结果
    应用解决方案后,再次使用top和mpstat命令检查CPU使用情况,确认CPU使用率是否降低,负载是否均衡。

案例2:分析系统CPU负载高的原因

场景描述

系统负载平均值持续高于CPU核心数,但CPU使用率并不高。

分析步骤

  1. 使用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
  1. 使用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 
  1. 使用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
  1. 分析结果
    从输出可以看出:
  • 系统负载平均值为5.20,高于4个CPU核心
  • 但CPU使用率只有25%(10%用户+5%系统+10%I/O等待)
  • vmstat显示有4个进程处于不可中断睡眠状态(b列)
  • iostat显示磁盘I/O使用率达到70%,平均响应时间为50毫秒
  1. 解决方案

    • 方案1:优化磁盘I/O,如使用SSD替换HDD
    • 方案2:调整应用程序,减少I/O操作,增加缓存
    • 方案3:优化文件系统参数,如调整I/O调度器
    # 临时调整I/O调度器为deadline
    echo deadline > /sys/block/vda/queue/scheduler
  2. 验证结果
    应用解决方案后,再次使用top、vmstat和iostat命令检查系统状态,确认负载是否降低,I/O性能是否改善。

课后练习

  1. 基础练习

    • 使用top命令查看系统CPU使用情况,识别占用CPU最高的进程
    • 使用htop命令查看系统CPU使用情况,熟悉其交互功能
    • 使用mpstat命令查看每个CPU核心的使用情况
    • 使用vmstat命令查看系统整体状态,包括CPU、内存和I/O
  2. 进阶练习

    • 配置sysstat服务,使用sar命令收集和分析CPU使用历史数据
    • 使用pidstat命令监控特定进程的CPU使用情况
    • 分析系统CPU使用率高的原因,提出优化建议
    • 模拟CPU密集型场景,测试不同监控工具的表现
  3. 挑战练习

    • 编写一个脚本,使用vmstat和mpstat命令定期收集CPU使用数据,生成报告
    • 分析一个实际系统的CPU性能问题,提出详细的优化方案
    • 比较不同CPU监控工具的性能开销,评估其对系统的影响

总结

本集教程详细介绍了Linux系统中常用的CPU监控工具,包括top、htop、vmstat、mpstat、pidstat和sar等命令的使用方法、输出解释和实战应用。

  1. CPU监控的核心指标

    • CPU使用率(用户空间、系统空间、空闲、等待I/O等)
    • 负载平均值
    • 进程调度情况
  2. 常用CPU监控工具

    • top:简单易用的实时监控工具
    • htop:功能丰富的交互式监控工具
    • vmstat:综合性系统监控工具
    • mpstat:多核心CPU监控工具
    • pidstat:进程级CPU监控工具
    • sar:历史数据收集和分析工具
  3. 工具选择与使用场景

    • 快速查看:top或htop
    • 多核心分析:mpstat
    • 进程分析:pidstat
    • 历史趋势:sar
    • 综合分析:vmstat
  4. CPU性能问题分析与优化

    • 识别CPU使用率过高的原因
    • 分析系统负载高的原因
    • 提出针对性的优化建议

通过本集教程的学习,您已经掌握了Linux系统中CPU监控的基本方法和工具,能够独立分析CPU性能问题,提出优化建议,确保系统的稳定运行和性能优化。在实际工作中,您应该根据具体场景选择合适的监控工具,结合系统的其他指标进行综合分析,从而更准确地识别和解决性能问题。

« 上一篇 系统资源监控概述 下一篇 » 内存监控工具