在日常服务器运维和开发中,CPU 监控是一个非常重要的任务。通过监控 CPU 的各项指标,能够帮助我们识别系统性能瓶颈,并进一步定位到具体的应用或代码问题。以下是常用的 CPU 监控命令、各个指标的解释及问题定位思路。
1. 常用的 CPU 监控命令
1.1 top
top
是一个实时显示系统任务的命令,用于监控系统运行状态。默认情况下,它会显示 CPU、内存、负载、运行时间等信息。
重要的列说明:
- PID: 进程 ID
- USER: 进程所属用户
- PR: 优先级
- NI: Nice 值,影响进程的优先级
- VIRT: 虚拟内存使用量
- RES: 常驻内存使用量
- SHR: 共享内存
- S: 进程状态,常见值有
R
(运行)、S
(休眠)、Z
(僵尸)、T
(暂停) - %CPU: 进程使用的 CPU 百分比
- TIME+: 进程使用的 CPU 总时间
- COMMAND: 进程名
定位问题思路:
- 按
P
键排序,找出占用 CPU 最高的进程。 - 如果某个进程的
%CPU
长期占用很高,可能是 CPU 密集型任务或代码进入死循环。 - 使用
PID
和strace
或gdb
等工具进一步跟踪进程的系统调用或调试代码。
1.2 htop
htop
是 top
命令的增强版,提供更好的可视化界面。它可以通过彩色图形表示 CPU 使用率,并且可以更方便地管理进程。
重要的列和解释:
- CPU usage bars: 不同颜色代表不同的 CPU 使用状态,如用户进程、系统进程、IO 等。
- MEM/Swap usage: 内存和交换区使用情况。
- Tasks: 显示当前任务的总数和状态。
定位问题思路:
- 观察每个 CPU 核心的利用率,查看是否存在单个核心过载的情况。
- 可以直接杀死某个高占用的进程,或者进一步分析其系统调用。
1.3 mpstat
mpstat
用于显示 CPU 使用情况的详细统计。它能展示每个 CPU 核心的使用情况,帮助我们了解系统的整体负载。
mpstat -P ALL 1
- CPU: CPU 核心编号,
all
表示所有 CPU 的平均值。 - %usr: 用户态进程占用的 CPU 时间百分比。
- %sys: 内核态进程占用的 CPU 时间百分比。
- %iowait: CPU 等待 I/O 操作完成的时间百分比。
- %idle: CPU 空闲时间百分比。
定位问题思路:
- 如果
%iowait
很高,说明系统在等待磁盘 I/O,可能是磁盘瓶颈导致的 CPU 闲置。 - 如果
%sys
很高,说明内核态任务占用 CPU 过多,可能是与硬件相关的内核进程问题。
1.4 sar
sar
是一个系统活动报告工具,用来查看历史的 CPU、内存、网络等系统资源的使用情况。
sar -u 1 10
- %user: 用户态 CPU 使用率。
- %system: 系统态 CPU 使用率。
- %iowait: I/O 等待时间。
- %idle: 空闲时间。
定位问题思路:
- 通过
sar
可以查看过去的 CPU 使用趋势,找到某个时间点 CPU 异常升高的原因。
1.5 pidstat
pidstat
可以显示每个进程的 CPU 使用情况,包括用户态和系统态的详细信息。
pidstat -u -p <pid> 1
- %usr: 进程在用户态的 CPU 使用率。
- %system: 进程在系统态的 CPU 使用率。
- %CPU: 进程的总 CPU 使用率。
定位问题思路:
- 用
pidstat
跟踪某个进程的 CPU 使用变化,找出 CPU 密集型进程。
1.6 perf
perf
是 Linux 的性能分析工具,用于分析内核或应用程序的性能瓶颈。
perf top
- Cycles: CPU 周期数,代表 CPU 执行了多少操作。
- Functions: 执行时间最长的函数,按比例显示。
定位问题思路:
perf
可以帮助深入到函数级别,分析代码中哪些函数消耗了最多的 CPU 时间,从而发现性能瓶颈。
2. CPU 监控指标详解
- %usr (User CPU Time): 用户态程序消耗的 CPU 时间,通常与应用程序的执行时间直接相关。过高的 %usr 表明 CPU 密集型的应用代码。
- %sys (System CPU Time): 系统态消耗的 CPU 时间,包括系统调用、内核任务、I/O 等。%sys 过高可能意味着内核有问题或者设备驱动程序工作不正常。
- %iowait: CPU 等待 I/O 操作的时间占比,通常与磁盘或网络瓶颈相关。I/O 密集型任务会导致该值增高。
- %irq / %softirq: 硬件中断和软中断时间。%irq 过高通常是硬件问题,尤其是网络或磁盘。
- %idle: CPU 空闲时间,表示系统的空闲时间。如果 %idle 接近 0,说明系统负载很高。
3. CPU 性能问题的定位思路
3.1 排查 CPU 使用率高的进程
- 使用
top
或htop
命令 查看占用 CPU 最高的进程。 - 使用
pidstat
跟踪进程:查看特定进程的 CPU 使用情况。 - 定位到具体代码:
- 如果是自家应用的进程,结合
strace
分析进程的系统调用,或者使用gdb
调试程序,找出具体的代码段。 - 使用
perf
分析应用的函数执行时间,发现哪些函数占用了大量 CPU 资源。
- 如果是自家应用的进程,结合
3.2 识别系统态 CPU 问题
- 如果
%sys
值较高,说明内核态任务(例如系统调用、设备驱动等)占用了大量 CPU 时间。 - 使用
perf
或ftrace
追踪内核事件,分析内核中的瓶颈点。
3.3 处理 I/O 密集型问题
- 如果
%iowait
较高,表明 CPU 正在等待 I/O 操作。检查磁盘或网络 I/O 是否出现瓶颈。 - 使用
iotop
查看哪些进程产生了大量的 I/O 操作,进一步优化这些进程的 I/O 操作。
3.4 单核过载问题
- 使用
mpstat
或htop
查看是否某个 CPU 核心使用率过高。 - 如果存在单核过载的现象,可能是程序没有正确利用多线程或多进程。可以尝试优化代码的并行执行方式。
3.5 CPU 资源争用
- 检查是否有多个 CPU 密集型任务同时运行,导致资源争用。可以使用
cgroups
或nice
等工具调整进程的优先级或限制资源使用。
4. 定位到应用代码
- 查看日志文件:检查系统或应用程序的日志,尤其是在 CPU 使用率异常时的记录。
- 分析应用行为:
- 对于 Java 应用,可以使用
jstack
生成线程堆栈,找出哪个线程占用了大量 CPU。 - 对于 Python 应用,可以使用
cProfile
或line_profiler
分析代码执行的性能瓶颈。
- 对于 Java 应用,可以使用
- 使用性能分析工具:利用
perf
或flamegraph
生成性能火焰图,直观展示代码中的 CPU 消耗热点。
通过这些工具和方法,可以从系统级别逐步定位到具体的应用代码,分析 CPU 性能问题并进行优化。