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(); }'

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

相关推荐
FBI HackerHarry浩9 分钟前
云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作)
linux·运维·服务器·rocky
努力学习的小廉5 小时前
深入了解linux系统—— 库的制作和使用
linux·运维·单片机
国际云7 小时前
腾讯云国际站性能调优
运维·服务器·数据库·云计算·腾讯云
眼镜哥(with glasses)8 小时前
0527漏洞原理:XSS笔记
运维·笔记·自动化
奋斗者1号8 小时前
提升WSL中Ubuntu编译速度的完整指南
linux·运维·ubuntu
ZHOU_WUYI8 小时前
在 Ubuntu 上安装 NVM (Node Version Manager) 的步骤
linux·运维·ubuntu
阿巴阿巴拉11 小时前
Spark-Core Project
linux·运维·服务器
ikun·11 小时前
LVS + Keepalived 高可用群集
运维·服务器·lvs
明似水11 小时前
AI时代新词-AI驱动的自动化(AI - Driven Automation)
运维·人工智能·自动化
Pseudo…12 小时前
LVS+keepalived高可用群集
运维·服务器·lvs