linux 性能优化CPU

发布于:2025-05-30 ⋅ 阅读:(22) ⋅ 点赞:(0)

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


第一部分:系统概览信息
1. 第一行:系统状态汇总
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 详解)。

2. 第二行:任务统计
bash
Tasks: 250 total, 1 running, 249 sleeping, 0 stopped, 0 zombie
total:总进程数。

running:正在运行(或等待 CPU)的进程数。

sleeping:休眠中的进程(等待事件触发)。

stopped:被信号暂停的进程(如 Ctrl+Z)。

zombie:僵尸进程(已终止但未被父进程回收的进程)。

3. 第三行: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 时间(仅虚拟化环境)。

4. 第四行和第五行:内存和交换空间
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

1. 高 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 时间。


2. 上下文切换频繁
问题:频繁的进程/线程切换导致 CPU 浪费。

bpftrace 脚本:

bash
# 统计进程的上下文切换次数(按进程名聚合)
sudo bpftrace -e 'tracepoint:sched:sched_switch { @[comm] = count(); }'

优化建议:减少线程数、使用无锁数据结构或协程。