Linux CPU性能分析完全指南
对于任何系统管理员、开发者或高级用户而言,理解和分析 Linux 系统的性能是一项至关重要的技能。当系统响应变慢时,知道应该从何处入手、各项指标意味着什么,是快速定位并解决问题的关键。
本指南将详细地、全面地覆盖 Linux 性能分析的基础概念,重点关注 平均负载(Average Load) 和 CPU 利用率(CPU Utilization) 这两个核心指标。我们将一同探索一系列强大的命令行工具,学习如何解读它们的输出,并利用这些知识来排查常见的性能瓶颈,确保涵盖您草稿中的每一个知识点。
第一部分:理解核心概念:平均负载与 CPU 利用率
在评估系统性能时,最基础的两个指标就是平均负载和 CPU 利用率。虽然它们经常被同时提及,但其背后反映的问题截然不同。
平均负载 (Average Load)
平均负载(Load Average)是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。
- 可运行状态的进程:指的是正在使用 CPU 或正在等待 CPU 的进程,也就是
ps
命令中看到的处于 R 状态(Running 或 Runnable)的进程。 - 不可中断状态的进程:指的是正处于内核关键流程中的进程,这些流程不可被打断,比如最常见的是等待硬件设备的 I/O 响应,也就是
ps
命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)。
因此,平均负载本质上就是系统的平均活跃进程数。
uptime
命令与负载分析
您可以使用 uptime
命令来快速查看系统的平均负载。
$ uptime
21:38:13 up 57 min, 1 user, load average: 12.99, 4.56, 1.64
输出结果依次显示了:当前时间、系统已运行时间、当前登录用户数,以及最重要的——系统在过去 1 分钟、5 分钟、15 分钟 的平均负载。
如何解读平均负载?
平均负载的意义需要结合系统的 CPU 核心数来看。你可以用 grep 'model name' /proc/cpuinfo | wc -l
命令来查看核心数。
- 负载 < CPU 核心数:意味着 CPU 有空闲资源,系统没有等待。
- 负载 == CPU 核心数:意味着 CPU 刚好被占满,没有额外的资源来运行更多进程。
- 负载 > CPU 核心数:意味着系统已过载,进程开始排队等待,有一部分进程竞争不到 CPU。
负载值的详细说明(以单核为例,多核系统则乘以核心数):
- load < 1: 系统没有等待,非常流畅。
- 0.7 < load < 1: 系统状态不错,但需要开始关注。
- load == 1: 系统资源刚好用完,没有额外资源运行更多进程。
- load > 1: 进程已经开始拥堵,需要排队等待资源。
- load > 5: 系统非常繁忙,存在严重问题。
根据不同时间负载值的趋势判断问题:
- 1分钟 load > 5,5分钟 load < 3,15分钟 load < 1:说明负载是短期性的,可能是临时抖动或者拥塞的前兆,问题不大但需留意。
- 1分钟 load > 5,5分钟 load > 3,15分钟 load < 1:说明负载在短期内繁忙,中期紧张,很可能是拥塞的开始。
- 1分钟 load > 5,5分钟 load > 5,15分钟 load > 5:说明系统正在经历持续的拥塞。
- 1分钟 load < 1,5分钟 load > 3,15分钟 load > 5:说明系统负载正在下降,拥塞情况有所好转。
平均负载与 CPU 利用率的关系
平均负载和 CPU 利用率是不完全对应的,因为平均负载不仅包含了使用和等待 CPU 的进程,还包含了等待 I/O 的进程。
- CPU 密集型进程:大量消耗 CPU 会导致平均负载升高,此时负载和 CPU 使用率的表现是一致的。
- I/O 密集型进程:等待 I/O 也会导致平均负载升高,但此时的 CPU 使用率不一定高。
- 大量等待 CPU 的进程调度:同样会导致平均负载升高,此时 CPU 使用率也会比较高。
第二部分:CPU 监控的核心工具
Linux 提供了一套丰富的命令行工具来监控 CPU 性能。
top
与 ps
- top: 实时显示各个进程的资源占用情况,可以按照 CPU、内存使用情况和执行时间对进程进行排序。
- ps: 用于查看进程的快照。常用命令如
ps -aux
或ps -ef
。
mpstat
: 多核 CPU 统计信息
mpstat
是一个常用的多核 CPU 性能分析工具,用于实时查看每个 CPU 的性能指标以及所有 CPU 的平均指标。当不带参数运行时,它显示的是从系统启动以来的平均值。
# -P ALL 表示监控所有CPU,1 表示每秒采样一次,10 表示总共采样10次
$ mpstat -P ALL 1 10
输出列的详细含义:
- %usr: 用户空间 CPU 使用率。
- %nice: nice 值为正的用户进程的 CPU 使用率。
- %sys: 内核空间 CPU 使用率。
- %iowait: CPU 等待 I/O 的时间百分比。
- %irq: CPU 处理硬件中断的时间百分比。
- %soft: CPU 处理软件中断的时间百分比。
- %steal: 在虚拟化环境中,被宿主机“偷走”的 CPU 时间百分比。
- %guest: 运行虚拟客户机(Guest)的 CPU 时间百分比。
- %gnice: 运行 nice 值为正的虚拟客户机的 CPU 时间百分比。
- %idle: CPU 完全空闲的时间百分比。
pidstat
: 进程级性能分析
pidstat
是一个常用的进程性能分析工具,可以实时查看进程的 CPU、内存、I/O 以及上下文切换等性能开销。
-u
: 查看 CPU 相关指标。-w
: 查看上下文切换情况。-d
: 展示磁盘 I/O 统计信息。-r
: 查看内存使用情况。-t
: 查看线程相关的统计信息(与-w结合使用很常见)。-p
: 指明要监控的进程号。
第三部分:深入理解 CPU 上下文切换
什么是上下文切换?
过多的上下文切换会把 CPU 时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短了进程真正运行的时间,成为系统性能大幅下降的元凶。
主要有四种类型:
- 系统调用上下文切换:从用户态到内核态的切换,需要保存寄存器等信息。
- 进程上下文切换:由进程调度引起,比如资源不足、进程休眠、更高优先级的进程抢占等。
- 线程上下文切换:线程是调度的基本单位。切换可以是同一进程内的线程切换,也可以是不同进程间的线程切换。
- 中断上下文切换:为响应硬件事件而调用中断处理程序,它只发生在内核态。
vmstat
: 监控上下文切换
vmstat
命令可以显示关于内核线程、虚拟内存、磁盘、陷阱和 CPU 使用率的统计信息,是查询系统上下文切换情况的利器。
# 每隔5秒输出一次报告
$ vmstat 5
输出字段解释:
- Procs (进程)
r
: 等待运行的进程数(运行队列长度)。长期大于 CPU 核心数说明 CPU 繁忙。b
: 处于不可中断睡眠状态的进程数(通常等待 I/O)。
- Memory (内存)
swpd
: 已使用的虚拟内存大小。free
: 空闲的物理内存大小。buff
: 用作缓冲区的内存大小。cache
: 用作缓存的内存大小。
- Swap (交换分区)
si
: 每秒从磁盘读入交换区的数据量 (swap-in)。值高说明物理内存不足。so
: 每秒写入磁盘的交换区数据量 (swap-out)。值高说明内存紧张。
- IO (磁盘)
bi
: 每秒从块设备读取的块数。bo
: 每秒写入块设备的块数。
- System (系统)
in
: 每秒中断次数(包括时钟中断)。cs
: 每秒上下文切换次数。值过高可能因进程频繁调度导致性能下降。
- CPU (百分比)
us
: 用户进程占用 CPU 时间百分比。sy
: 系统(内核)占用 CPU 时间百分比。id
: 空闲 CPU 时间百分比。wa
: 等待 I/O 的 CPU 时间百分比。值高说明磁盘或网络 I/O 是瓶颈。st
: 被虚拟机偷取的时间(仅虚拟化环境)。
第四部分:实战场景分析与排查
以下是您文档中提到的两个典型压测场景。
场景一:CPU 密集型
通过 stress --cpu 16 --timeout 600
命令模拟 CPU 密集场景后:
- 运行
uptime
会发现负载很高。 - 运行
mpstat -P ALL 1
会看到%usr
列接近 100%,而%iowait
几乎为 0。 - 运行
pidstat -u 1
会看到stress
进程的 CPU 使用率非常高。
场景二:I/O 密集型
通过 stress -i 16 --timeout 600
命令模拟 I/O 密集场景后:
- 运行
uptime
同样会发现负载很高。 - 运行
mpstat -P ALL 2
会看到%iowait
列的百分比很高,而%usr
和%sys
相对较低。 - 运行
pidstat -u 2
会看到stress
进程的 CPU 使用率不高,但系统负载很高,说明瓶颈在 I/O 等待。
CPU 利用率高如何排查?
这是一个系统性的排查思路:
首先,确认 CPU 消耗在哪一块。
- 内核态占用 CPU 较高:
- 如果 %iowait 高,要重点关注磁盘 I/O 相关操作,检查是否存在不合理的日志写入或数据库操作。
- 如果 %soft (软中断) 或 %cs (上下文切换) 高,需要观察 CPU 负载是否较高,网络流量是否过大,能否精简数据,或者代码在多线程操作上是否存在不合理的中断。
- 如果 %steal 高,通常发生在虚拟机上,需要检查宿主机资源是否超限。
- 用户态占用 CPU 较高:
- 如果应用程序没有达到预期的性能,说明应用程序本身需要优化。
第五部分:工具与指标快速参考
以下是您文档中总结的工具速查表,非常实用。
根据指标查找工具
性能指标 | 工具 | 说明 |
---|---|---|
平均负载 | uptime , top |
uptime 最简单;top 提供了更全的指标 |
系统整体 CPU 使用率 | vmstat , mpstat , top , sar , /proc/stat |
top 、vmstat 、mpstat 只可以动态查看,而 sar 还可以记录历史数据;/proc/stat 是其他性能工具的数据来源 |
进程 CPU 使用率 | top , pidstat , ps , htop , atop |
top 和 ps 可以按 CPU 使用率给进程排序,而 pidstat 只显示实际用了 CPU 的进程;htop 和 atop 以不同颜色显示更直观 |
系统上下文切换 | vmstat |
除了上下文切换次数,还提供运行状态和不可中断状态进程的数量 |
进程上下文切换 | pidstat |
注意加上 -w 选项 |
软中断 | top , /proc/softirgs , mpstat |
top 提供软中断 CPU 使用率,;而 /proc/softirgs 和 mpstat 提供了各种软中断在每个 CPU 上的运行次数 |
硬中断 | vmstat , /proc/interrupts |
vmstat 提供总的中断次数,;而 /proc/interrupts 提供各种中断在每个 CPU 上运行的累积次数 |
根据工具查指标
工具 | 关键指标 |
---|---|
uptime |
平均负载 |
top |
平均负载、运行队列、整体的CPU使用率以及每个进程的状态和 |
htop |
top 增强版,以不同颜色区分不同类型的进程,更直观 |
atop |
CPU、内存、磁盘和网络等各种资源的全面监控 |
vmstat |
系统整体的 CPU 使用率、上下文切换次数、中断次数还包括处于运行和不可中断状态的进程数量 |
mpstat |
每个 CPU 的使用率和软中断次数 |
pidstat |
进程和线程的 CPU 使用率、中断上下文切换次数 |
/proc/softirgs |
软中断类型和在每个 CPU 上的累积中断次数 |
/proc/interrupts |
硬中断类型和在每个 CPU 上的累积中断次数 |
ps |
每个进程的状态和 CPU 使用率 |
pstree |
进程的父子关系 |
dstat |
系统整体的 CPU 使用率 |
sar |
系统整体的 CPU 使用率,包括可配置的历史数据 |
strace |
进程的系统调用 |
perf |
CPU 性能事件剖析,如调用链分析、CPU 缓存、CPU 调度等 |
execsnoop |
监控短时进程 |