linux 性能优化CPU

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 详解)。

  1. 第二行:任务统计

bash

Tasks: 250 total, 1 running, 249 sleeping, 0 stopped, 0 zombie

total:总进程数。

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

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

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

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

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

  1. 第四行和第五行:内存和交换空间

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 时间。

  1. 上下文切换频繁

问题:频繁的进程/线程切换导致 CPU 浪费。

bpftrace 脚本:

bash

统计进程的上下文切换次数(按进程名聚合)

sudo bpftrace -e 'tracepoint:sched:sched_switch { @[comm] = count(); }'

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

相关推荐
Akshsjsjenjd1 分钟前
Nginx反向代理与负载均衡全解析
运维·nginx·负载均衡
Voyager_41 小时前
Linux服务器NAS挂载:Truenas
linux·运维·服务器
liujing102329292 小时前
Day01_Linux移植基础
linux·运维·服务器
桥边驿语人2 小时前
Docker 容器无法访问外网的问题排查与解决指南
运维·docker·容器
ZStack开发者社区2 小时前
ZStack Cloud v5.4.0 LTS让运维自动驾驶,让合规开箱即用
运维·云计算
叶凡要飞2 小时前
linux安装google chrome 谷歌浏览器
linux·运维·chrome
专注VB编程开发20年3 小时前
vb.net编写DDE(Dynamic Data Exchange)服务器
运维·服务器·github·vb.net·dde
chaofan9804 小时前
如何用 Claude Code 搭建安全、可测、可自动化的 GitHub CI 流程?
运维·人工智能·ci/cd·ai·自动化·github·claude
无敌最俊朗@4 小时前
Linux 进程创建与控制详解
linux·运维·服务器
jieyu11194 小时前
入侵检测系统(IDS)和入侵防御系统(IPS)
运维·服务器·系统安全