1 CPU性能指标
1.1 CPU 使用率: 显示CPU在用户态、内核态、空闲和等待I/O等状态下的时间占比。
1.2 上下文切换: 显示进程在CPU上切换的频率,过高的上下切换可能导致性能下降。
1.3 CPU负载: 显示系统中等待运行和等待IO的进程数,可以反映CPU的繁忙程度。
1.4 CPU缓存命中率:显示CPU缓存访问的成功率,高的缓存命中率表示性能更高。
2 CPU分析工具
2.1 top
root@u24-ebpf-100:~# ps aux|head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.3 22408 13336 ? Ss 08:44 0:07 /sbin/init
root 2 0.0 0.0 0 0 ? S 08:44 0:00 [kthreadd]
USER
进程的所有者(启动该进程的用户)。
PID
进程的唯一标识符(Process ID)。
%CPU
进程占用 CPU 的时间百分比(多核环境下可能超过 100%)。
%MEM
进程占用物理内存的百分比。
VSZ (Virtual Memory Size)
进程使用的虚拟内存大小(单位:KB)。包含进程可能访问的所有内存(包括交换分区和库文件)。
RSS (Resident Set Size)
进程实际使用的物理内存大小(单位:KB)。不包括交换分区和共享库。
TTY
进程关联的终端(终端设备名):
?:进程与终端无关(如守护进程)。
ttyN:物理终端。
pts/N:伪终端(如 SSH 连接或终端模拟器)。
STAT
进程状态代码(由多个字母组合):
R (Running):正在运行或可运行(在运行队列中)。
S (Sleeping):可中断的休眠(等待事件完成)。
D (Uninterruptible Sleep):不可中断的休眠(通常等待 I/O)。
Z (Zombie):僵尸进程(已终止但未被父进程回收)。
T (Stopped):进程被信号暂停(如 Ctrl+Z)。
<:高优先级进程。
N:低优先级进程。
s:会话领导者(管理一组进程)。
l:多线程进程。
+:前台进程组。
START
进程启动的时间(若超过 24 小时则显示日期)。
TIME
进程使用的累计 CPU 时间(格式:分钟:秒)。
COMMAND
启动进程的命令名称或命令行参数:
xxx\]:内核线程(如 \[kworker\])。 案例一:按CPU使用率降序 root@u24-ebpf-100:\~# ps aux --sort=-%cpu\|head USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 9189 300 0.1 11016 4516 pts/2 R+ 10:34 0:00 ps aux --sort=-%cpu mysql 7914 1.9 10.3 1756000 408368 ? Sl 09:04 1:43 /usr/local/mysql-8.0.42/bin/mysqld --defaults-file=/etc/my.cnf root 746 0.5 0.2 242148 9076 ? Ssl 08:44 0:35 /usr/bin/vmtoolsd root 8939 0.1 0.0 0 0 ? I 10:01 0:03 \[kworker/0:2-events
root 9057 0.1 0.0 0 0 ? I 10:20 0:01 [kworker/1:3-events]
root 9036 0.1 1.0 476896 40612 ? Ssl 10:18 0:01 /usr/libexec/fwupd/fwupd
root 1 0.1 0.3 22408 13336 ? Ss 08:44 0:07 /sbin/init
root 8748 0.0 0.0 0 0 ? I 09:54 0:02 [kworker/0:1-events]
root 8073 0.0 0.2 14940 10584 ? Ss 09:23 0:02 sshd: root@pts/1,pts/0
案例二:按内存使用率降序
root@u24-ebpf-100:~# ps aux --sort=-%mem|head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 7914 1.9 10.3 1756000 408368 ? Sl 09:04 1:44 /usr/local/mysql-8.0.42/bin/mysqld --defaults-file=/etc/my.cnf
root 9036 0.1 1.0 476896 40612 ? Ssl 10:18 0:01 /usr/libexec/fwupd/fwupd
root 472 0.0 0.6 354524 27408 ? SLsl 08:44 0:02 /sbin/multipathd -d -s
root 434 0.0 0.4 50760 17176 ? S<s 08:44 0:01 /usr/lib/systemd/systemd-journald
root 843 0.0 0.3 468984 13444 ? Ssl 08:44 0:00 /usr/libexec/udisks2/udisksd
root 1 0.1 0.3 22408 13336 ? Ss 08:44 0:07 /sbin/init
systemd+ 651 0.0 0.3 21580 12928 ? Ss 08:44 0:00 /usr/lib/systemd/systemd-resolved
root 1016 0.0 0.3 392092 12880 ? Ssl 08:44 0:00 /usr/sbin/ModemManager
2.2 uptime 展示系统负载平均值和系统运行时间
root@u24-ebpf-100:~# uptime
10:38:01 up 1:53, 2 users, load average: 0.00, 0.00, 0.00
当前时间
10:30:45:系统的当前时间(格式为 时:分:秒)。
系统运行时间
up 15 days, 3:22:系统自上次启动后已连续运行的时间。
格式可能为 days + 小时:分钟,或仅 分钟(若运行时间不足 1 天)。
当前登录用户数
2 users:当前登录到系统的用户数(通过终端、SSH 等)。
每个用户可能打开多个终端会话,但此处统计的是独立用户。
系统平均负载(Load Average)
load average: 0.08, 0.03, 0.01:过去 1 分钟、5 分钟、15 分钟的平均负载。
#top 按进程展示CPU使用时间,以及系统层面的CPU模式
root@u24-ebpf-100:~# top
top - 14:30:45 up 15 days, 3:22, 2 users, load average: 0.08, 0.03, 0.01
Tasks: 250 total, 1 running, 249 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.6 us, 2.3 sy, 0.0 ni, 91.9 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st
MiB Mem : 15918.8 total, 2041.2 free, 5120.5 used, 8757.1 buff/cache
MiB Swap: 2048.0 total, 2047.5 free, 0.5 used. 10500.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 user 20 0 1023448 245000 45600 S 2.5 3.2 2:30.67 firefox
1 root 20 0 169320 13140 8920 S 0.0 0.1 0:15.23 systemd
第一部分:系统概览信息
- 第一行:系统状态汇总
bash
top - 14:30:45 up 15 days, 3:22, 2 users, load average: 0.08, 0.03, 0.01
14:30:45:当前系统时间。
up 15 days, 3:22:系统已运行的时间(同 uptime 命令的输出)。
2 users:当前登录系统的用户数。
load average:过去 1、5、15 分钟的平均负载(详见 uptime 详解)。
- 第二行:任务统计
bash
Tasks: 250 total, 1 running, 249 sleeping, 0 stopped, 0 zombie
total:总进程数。
running:正在运行(或等待 CPU)的进程数。
sleeping:休眠中的进程(等待事件触发)。
stopped:被信号暂停的进程(如 Ctrl+Z)。
zombie:僵尸进程(已终止但未被父进程回收的进程)。
- 第三行:CPU 使用率
bash
%Cpu(s): 5.6 us, 2.3 sy, 0.0 ni, 91.9 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st
us (user):用户空间进程的 CPU 占用百分比(如应用程序)。
sy (system):内核空间进程的 CPU 占用百分比(如系统调用)。
ni (nice):调整过优先级的用户进程 CPU 占用。
id (idle):CPU 空闲时间百分比。
wa (iowait):等待 I/O 操作完成的 CPU 时间百分比(高值可能表示磁盘瓶颈)。
hi (hardware IRQ):硬件中断占用的 CPU 时间。
si (software IRQ):软件中断占用的 CPU 时间。
st (steal time):虚拟机被宿主机"偷走"的 CPU 时间(仅虚拟化环境)。
- 第四行和第五行:内存和交换空间
bash
MiB Mem : 15918.8 total, 2041.2 free, 5120.5 used, 8757.1 buff/cache
MiB Swap: 2048.0 total, 2047.5 free, 0.5 used. 10500.2 avail Mem
total:总内存/交换空间大小。
free:完全未使用的内存。
used:已使用的内存(包括缓存和缓冲区)。
buff/cache:内核缓存和缓冲区占用的内存(可被快速释放供程序使用)。
avail Mem:估算的可用内存(包含缓存和缓冲区的可回收部分)。
第二部分:进程列表
各列含义
列名 说明
PID 进程的唯一标识符(Process ID)。
USER 进程的所有者(启动该进程的用户)。
PR 进程的优先级(Priority),值越小优先级越高。
NI Nice 值(-20 到 19),用于调整优先级(负值提高优先级,正值降低)。
VIRT 进程使用的虚拟内存总量(包括共享库、未映射内存等,单位 KiB 或 MiB)。
RES 进程实际使用的物理内存(单位 KiB 或 MiB)。
SHR 进程使用的共享内存大小(如共享库)。
S 进程状态(同 ps):
-
R=运行,S=休眠,D=不可中断休眠,
-
Z=僵尸,T=暂停。
%CPU 进程占用的 CPU 百分比(多核可能超过 100%)。
%MEM 进程占用的物理内存百分比。
TIME+ 进程使用的累计 CPU 时间(格式:分:秒.毫秒)。
COMMAND 启动进程的命令名称或命令行参数(-c 选项显示完整命令)。
2.3 mpstat 按每个CPU展示CPu统计数据指标
apt install systat
root@u24-ebpf-100:~# mpstat -P ALL 1 1
Linux 6.11.0-25-generic (u24-ebpf-100) 05/27/2025 x86_64 (2 CPU)
10:50:59 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:51:00 AM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:51:00 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:51:00 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
输出列详解
列名 说明
CPU CPU 核心编号(all 表示总体平均值)。
%usr 用户空间进程的 CPU 使用率(未调整优先级的应用程序)。
%nice 调整过优先级(nice 值)的用户进程 CPU 使用率。
%sys 内核空间进程的 CPU 使用率(系统调用、中断处理等)。
%iowait CPU 等待 I/O 操作完成的时间占比(高值可能表示磁盘或网络瓶颈)。
%irq 处理硬件中断的时间占比。
%soft 处理软件中断(如网络数据包、定时器)的时间占比。
%steal 在虚拟化环境中,被宿主机"偷走"的 CPU 时间(资源争抢时增加)。
%guest 运行虚拟化客户机(Guest OS)的时间占比。
%gnice 运行调整过优先级的虚拟化客户机的时间占比(较新内核支持)。
%idle CPU 空闲时间占比。
2.4 bpftrace
- 高 CPU 使用率进程/函数定位
问题:某个进程或内核函数持续占用高 CPU。
bpftrace 脚本:
bash
统计按进程和内核函数聚合的 CPU 时间(每 5 秒输出一次)
sudo bpftrace -e 'profile:hz:99 /cpu/ { @[comm, kstack] = count(); } interval:s:5 { exit(); }'
输出示例:
bash
@[nginx,
__x64_sys_write+0
do_syscall_64+0x5d
entry_SYSCALL_64_after_hwframe+0x65
]: 12345
分析:显示 nginx 进程的 sys_write 系统调用消耗了大量 CPU 时间。
- 上下文切换频繁
问题:频繁的进程/线程切换导致 CPU 浪费。
bpftrace 脚本:
bash
统计进程的上下文切换次数(按进程名聚合)
sudo bpftrace -e 'tracepoint:sched:sched_switch { @[comm] = count(); }'
优化建议:减少线程数、使用无锁数据结构或协程。