21、Linux常用命令-进程内存CPU相关命令

1. 进程

进程是 Linux 系统资源分配和调度的核心单元。

a. 进程基础核心概念

i. 进程的本质

进程是程序的一次运行实例,操作系统为每个进程分配独立的:

  • 内存空间(栈、堆、代码段、数据段)
  • 唯一标识(PID)、文件描述符、CPU 时间片
  • 权限上下文(UID/GID,决定进程能访问的资源)

进程/线程/协程

  • 进程:资源分配的最小单位,独立内存空间,进程间通信需借助管道/套接字等
  • 线程:调度的最小单位,共享进程内存空间,切换开销更低(如 Nginx 工作线程)
  • 协程:协程不是操作系统内核所管理,而是完全由程序控制(即在用户态执行)因此不会像线程切换那样耗费资源

ii. 进程核心属性

属性 说明 示例/补充
PID 进程唯一 ID(1~65535,重启后重置) 1 号进程:systemd(CentOS 7+/Rocky)/init(CentOS 6),是所有进程的父进程
PPID 父进程 ID(创建当前进程的进程,父进程通过fork()创建子进程,当子进程数据变动通过COW分配独立的内存空间) bash 启动 ls,则 ls 的 PPID = bash 的 PID
UID/GID 进程所属用户/组 ID root 进程 UID=0,普通用户进程 UID≥1000
进程状态 描述进程当前行为(通过 psSTAT l字段查看) 见下文进程状态详解
优先级(NI) 决定 CPU 资源分配优先级(-20~19,默认 0,数值越低优先级越高) root 可设 NI<0(提升优先级),普通用户仅能设 NI≥0
资源占用 CPU 使用率、内存占用(RSS/VSZ)、I/O 读写量 RSS:物理内存占用(实际使用);VSZ:虚拟内存(含共享库)

iii. 进程状态详解(STAT 字段)

ps/topSTAT 字段是进程状态的核心标识,不同状态对应不同场景:

状态符 名称 核心含义 典型场景
R Running(运行态) 正在 CPU 执行,或在就绪队列等待 CPU(R+ 表示前台运行) top 中占 CPU 高的进程多为 R 态
S Sleeping(可中断睡眠) 等待事件完成(I/O、信号),可被 kill 唤醒(默认状态) 大部分后台服务(如 Nginx、MySQL)是 S 态
D Uninterruptible Sleep(不可中断睡眠) 等待核心 I/O(磁盘读写、NFS 挂载),无法被 kill 唤醒 磁盘 I/O 阻塞、网络请求超时
Z Zombie(僵尸态) 进程终止但父进程未回收资源,PID 残留,可以用 kill -9 杀死父进程 父进程未调用 wait(),长期存在会占 PID 资源
T Stopped(停止态) SIGSTOP/Ctrl+Z 暂停,可被 SIGCONT 唤醒 ping www.baidu.comCtrl+Z 后变 T 态
< High Priority 高优先级进程(NI<0) 核心服务(如 ClickHouse)手动调高优先级
N Low Priority 低优先级进程(NI>0) 备份、日志清理等后台任务
s 包含子进程
+ 前台进程
l 多线程

iiii. 进程类型

类型 特点 示例
前台进程 与终端关联,阻塞终端操作 直接执行 lsvim
后台进程 与终端解耦,不阻塞终端(& 启动),终端关闭则进程终止 ls &nginx &
守护进程 脱离终端,后台持久运行(通常以 d 结尾) sshdcrondmysqld
系统进程 内核启动,用于管理系统资源(UID=0) systemdkworker(内核工作线程)
用户进程 普通用户启动,权限受 UID 限制 bashpython script.py

b. 进程查看命令

i. ps:静态查看进程

最基础的进程查看工具,支持多格式输出,适合快速筛选进程。

语法与选项
命令 格式类型 核心功能
ps aux BSD 格式 查看所有用户的所有进程,含 CPU/内存/状态/启动时间(推荐
ps -ef System V 查看所有进程的父子关系(UID/PID/PPID 清晰)
ps -l 长格式 查看当前终端进程,含优先级(NI)、状态(STAT)
ps -p <PID> 指定 PID 查看单个进程详情
ps -eo pid,ppid,pcpu,cmd 自定义字段 仅显示 PID、PPID、CPU 使用率、命令行
输出解析(ps aux 示例)
bash 复制代码
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 168288 10240 ?        Ss   10:00   0:02 /usr/lib/systemd/systemd
nginx     1234  0.5  0.3 123456 8900 ?        S    10:05   0:10 nginx: worker process
  • %CPU:CPU 使用率(累计)
  • %MEM:物理内存使用率
  • VSZ:虚拟内存大小(KB)
  • RSS:物理内存占用(KB)
  • TTY:所属终端(? 表示无终端,守护进程)
  • START:进程启动时间
  • TIME:CPU 累计占用时间
常用筛选技巧
bash 复制代码
# 筛选 nginx 进程(排除 grep 自身)
ps aux | grep -v grep | grep nginx

# 查看进程树(父子关系)
ps -efH | grep nginx

# 仅显示进程 PID(用于脚本)
ps aux | grep nginx | awk '{print $2}'

ii. top/htop:实时监控进程(动态更新)

top 是系统自带的实时监控工具,htop 是增强版(需安装),支持鼠标操作、颜色区分。

top 核心操作(默认 3 秒刷新)
快捷键 功能 场景
P 按 CPU 使用率降序排序 排查高 CPU 进程
M 按内存使用率降序排序 排查高内存进程
T 按 CPU 累计占用时间排序 定位长期占用 CPU 的进程
1 显示所有 CPU 核心的使用率 多核心服务器排查核心负载
k 终止指定 PID 进程(默认发送 SIGTERM,输入 9 发送 SIGKILL 快速终止异常进程
r 调整进程优先级(修改 NI 值) 给核心服务提优先级
u 筛选指定用户的进程 查看 user1 启动的所有进程
f 自定义显示字段(如添加 PPID、NI、IO 读写量) 按需查看关键信息
q 退出 top -
top 头部信息解析
bash 复制代码
top - 15:30:00 up 10 days,  2:10,  2 users,  load average: 0.50, 0.30, 0.20
Tasks: 200 total,   1 running, 199 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.0 us,  1.0 sy,  0.0 ni, 93.5 id,  0.0 wa,  0.0 hi,  0.5 si,  0.0 st
MiB Mem :  15898.0 total,   1024.0 free,   8000.0 used,   6874.0 buff/cache
MiB Swap:   8192.0 total,   7000.0 free,   1192.0 used.  12000.0 avail Mem
  • load average:1/5/15 分钟系统负载(核心数内越低越好)
  • %Cpu(s)us(用户态 CPU)、sy(内核态 CPU)、wa(I/O 等待 CPU)
  • Mem:物理内存
  • Swap:交换分区(使用过高说明内存不足)

iii. pstree:可视化进程树(父子关系)

直观展示进程的层级关系,适合排查"进程归属"问题(如某个进程由哪个服务启动)

语法
bash 复制代码
pstree                # 简洁进程树
pstree -p             # 显示 PID(关键)
pstree -pu            # 显示 PID + 所属用户
pstree -p <PID>       # 仅显示指定 PID 的子进程树
示例
bash 复制代码
# 查看 sshd 进程的子树(PID=12730)
pstree -p 12730
# 输出:sshd(12730)───sshd(12734)───bash(12735)───pstree(14450)

iiii. pgrep/pidof:快速查找进程 PID

无需结合 grep,直接按进程名/条件获取 PID,适合脚本自动化。

命令 功能 示例
pgrep <进程名> 输出所有匹配进程的 PID(一行一个) pgrep nginx → 输出 1234 1235 1236
pgrep -u <用户> 筛选指定用户的进程 PID pgrep -u root nginx
pgrep -f <关键词> 按命令行关键词匹配 PID(如脚本参数) pgrep -f "python app.py"
pidof <进程名> 输出匹配进程的 PID(空格分隔) pidof nginx → 1234 1235 1236
脚本应用示例
bash 复制代码
# 终止所有 nginx 进程
kill $(pidof nginx)

# 检查 nginx 是否运行(非 0 表示未运行)
pgrep nginx > /dev/null || echo "nginx 未运行"

iiiii. pidstat:精细化进程监控

系统自带的进程资源监控工具,可按 CPU/内存/I/O 维度精细化分析进程。

语法
bash 复制代码
pidstat [选项] [间隔秒数] [次数]
常用选项
选项 功能 示例
-p 指定 PID(ALL 表示所有进程) pidstat -p 1234 1 5(监控 PID=1234,1 秒 1 次,共 5 次)
-u 监控 CPU 使用率(默认) pidstat -u -p ALL 2
-r 监控内存使用(缺页、物理内存占用) pidstat -r -p 1234 1
-d 监控 I/O 读写(磁盘读写量、IOPS) pidstat -d -p 1234 1
示例输出(CPU 监控)
bash 复制代码
pidstat -p 1234 1 2
Linux 5.14.0-284.30.1.el9_2.x86_64 (rocky-server) 	11/20/2024 	_x86_64_	(2 CPU)

15:40:00      PID    %usr %system  %guest   %wait    %CPU   CPU  Command
15:40:01     1234    2.00    1.00    0.00    0.00    3.00     0  nginx

15:40:01      PID    %usr %system  %guest   %wait    %CPU   CPU  Command
15:40:02     1234    1.00    0.00    0.00    0.00    1.00     1  nginx

Average:     PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:     1234    1.50    0.50    0.00    0.00    2.00     -  nginx

c. 进程控制命令(启动/终止/调度)

i. 进程启动方式

不同启动方式决定进程的"存活特性",生产环境需根据场景选择:

启动方式 命令示例 存活特性 适用场景
前台启动 ./app.shnginx 终端阻塞,终端关闭则进程终止 临时执行、需要交互的命令(如 vim)
后台启动 ./app.sh &nginx & 终端不阻塞,终端关闭则进程终止 临时后台任务(如快速测试)
持久后台启动 nohup ./app.sh & 终端关闭后进程仍运行,输出到 nohup.out 无交互的长期任务(如数据同步)
会话管理启动 screen -S app ./app.sh / tmux new -s app -d ./app.sh 断开终端后可重连,进程持续运行 需长期维护的任务(如远程部署)
开机自启 配置 systemd 服务(推荐)//etc/rc.local 系统重启后自动启动 核心服务(Nginx、MySQL)
关键启动技巧
bash 复制代码
# nohup 启动并自定义输出日志,标准输出和错误输出都输出到 /var/log/app.log
nohup ./app.sh > /var/log/app.log 2>&1 &

# screen 启动(断开后重连)
screen -S backup  # 创建会话
./backup.sh       # 执行任务
# 按 Ctrl+A+D 断开会话,重连:screen -r backup

# tmux 启动(比 screen 更强大)
tmux new -s task -d ./script.sh  # 后台创建会话并执行脚本
tmux attach -t task              # 重连会话

ii. 进程终止命令(kill/killall/pkill

Linux 终止进程的核心是发送信号,不同信号对应不同的终止行为,而非直接"杀死"进程。

bash 复制代码
# 查看所有的信号
kill -l
# 或
trap -l
核心信号(常用)
信号编号 信号名 含义 使用场景
1 SIGHUP 挂起信号,重启进程(可捕获) 重启 Nginx/MySQL 加载新配置
9 SIGKILL 强制终止(不可捕获,内核直接杀死) 无响应的进程、僵尸进程的父进程
15 SIGTERM 优雅终止(默认,可捕获),进程清理资源后退出 正常终止进程(推荐)
20 SIGTSTP 暂停进程(等价于 Ctrl+Z 临时暂停前台进程
18 SIGCONT 恢复暂停的进程 恢复 SIGTSTP 暂停的进程
命令用法pe
命令 功能 示例
kill <PID> 给指定 PID 发送 SIGTERM(默认) kill 1234(优雅终止)
kill -9 <PID> 给指定 PID 发送 SIGKILL(强制终止) kill -9 1234(强制杀死无响应进程)
kill -1 <PID> 给指定 PID 发送 SIGHUP(重启) kill -1 1234(重启 Nginx)
killall <进程名> 按进程名终止所有匹配进程(发送 SIGTERM killall nginx
killall -9 <进程名> 按进程名强制终止所有匹配进程 killall -9 python
pkill <关键词> 按进程名/命令行关键词终止进程 pkill -f "python app.py"(终止指定脚本)
pkill -u <用户> 终止指定用户的所有进程 pkill -u user1(终止 user1 的所有进程)
注意事项
  • 优先使用 kill <PID>(SIGTERM),给进程清理资源的时间;
  • kill -9 慎用!可能导致数据丢失(如数据库未刷盘);
  • 终止守护进程(如 mysqld)建议用服务管理命令(systemctl stop mysqld),而非直接 kill。

iii. 进程前台/后台调度(jobs/bg/fg

用于控制进程在前台/后台切换,避免终端阻塞。

命令 功能 示例
jobs 查看当前终端的后台进程列表(显示作业号、状态、命令) jobs[1]+ Running ./app.sh &
bg %<作业号> 将暂停的进程(T 态)恢复到后台运行 bg %1(恢复作业 1 到后台)
fg %<作业号> 将后台进程切换到前台运行 fg %1(将作业 1 切到前台)
实操流程示例
bash 复制代码
# 1. 前台启动 ping,按 Ctrl+Z 暂停
ping www.baidu.com
# 输出:^Z [1]+  Stopped  ping www.baidu.com

# 2. 查看后台进程
jobs  # 输出:[1]+  Stopped  ping www.baidu.com

# 3. 恢复到后台运行
bg %1  # 输出:[1]+ ping www.baidu.com &

# 4. 切回前台并终止
fg %1  # 恢复前台运行,按 Ctrl+C 终止

d. 进程优化

i. 进程优先级调整(nice/renice

Linux 通过 NI(Nice 值)调整进程优先级,可以保障 CPU 资源优先分配,核心规则:

  • NI 范围:-20(最高)~ 19(最低),默认 0
  • PRI(内核实际优先级)= 20 + NI,数值越低优先级越高
  • 仅 root 可设置 NI < 0(提升优先级),普通用户只能设置 NI ≥ 0
启动时设置优先级(nice
bash 复制代码
# 格式:nice -n <NI值> <命令>
nice -n -5 ./app.sh  # 启动 app.sh,NI=-5(高优先级)
nice -n 10 ./backup.sh  # 启动备份脚本,NI=10(低优先级)
运行时调整优先级(renice
bash 复制代码
# 格式:renice <NI值> -p <PID>
sudo renice -10 -p 1234  # 将 PID=1234 的进程 NI 改为 -10
renice 5 -p 5678         # 普通用户将 PID=5678 的进程 NI 改为 5
场景应用
  • 核心服务(如 ClickHouse、Flink):设置 NI=-5~-10,保障 CPU 资源优先分配
  • 非核心任务(如日志备份、数据导出):设置 NI=10~15,避免抢占核心资源。

ii. 进程资源限制(ulimit

ulimit 限制进程的资源使用(如最大文件描述符、最大进程数),避免单个进程耗尽系统资源,是高并发服务的必备配置。

核心参数
参数 含义 默认值 高并发推荐值
nofile 最大打开文件描述符数 1024 65535
nproc 最大用户进程数 4096 10000
cpu 最大 CPU 时间(秒) 无限制 按需设置
memlock 最大锁定内存(KB) 无限制 按需设置
配置方法
临时调整(当前终端有效)
bash 复制代码
ulimit -n 65535  # 临时设置最大文件描述符
ulimit -u 10000  # 临时设置最大进程数
ulimit -a        # 查看所有限制
永久调整(推荐,全局生效)

编辑 /etc/security/limits.conf

bash 复制代码
sudo vim /etc/security/limits.conf
# 添加以下内容(* 表示所有用户,也可指定单个用户)
* soft nofile 65535  # 软限制(警告阈值)
* hard nofile 65535  # 硬限制(不可超过)
root soft nproc 10000
root hard nproc 10000
  • 生效:重新登录终端/重启进程;
  • 验证:su - rootulimit -n(输出 65535 则生效)。

iii. 进程开机自启(systemd 服务)

生产环境核心服务需配置开机自启,systemd 是主流发行版(Rocky 8+/Ubuntu 16.04+)的默认服务管理器,替代传统 init.d

创建服务文件

路径:/etc/systemd/system/<服务名>.service(如 myapp.service)。

ini 复制代码
[Unit]
Description=My Application  # 服务描述
After=network.target mariadb.service  # 依赖:网络、MySQL 启动后再启动

[Service]
User=root                  # 运行用户
Group=root                 # 运行组
WorkingDirectory=/opt/myapp  # 工作目录
ExecStart=/opt/myapp/app.sh  # 启动命令
ExecReload=/bin/kill -1 $MAINPID  # 重载命令(SIGHUP)
ExecStop=/bin/kill -15 $MAINPID   # 停止命令(SIGTERM)
Restart=always             # 进程退出后自动重启
RestartSec=5               # 重启间隔 5 秒
LimitNOFILE=65535          # 资源限制:最大文件描述符
LimitNPROC=10000           # 资源限制:最大进程数
Type=simple                # 进程类型(simple/forking,默认 simple)

[Install]
WantedBy=multi-user.target  # 多用户模式下开机自启
服务管理命令
bash 复制代码
# 重新加载配置(修改服务文件后执行)
sudo systemctl daemon-reload

# 启动/停止/重启服务
sudo systemctl start myapp
sudo systemctl stop myapp
sudo systemctl restart myapp

# 查看服务状态
sudo systemctl status myapp

# 设置/禁用开机自启
sudo systemctl enable myapp
sudo systemctl disable myapp

# 查看服务日志(实时跟踪)
sudo journalctl -u myapp -f

e. 进程间数据共享(IPC)

方式 含义 示例
同一主机
pipe 管道单向传输,管道文件 mkfifi /home/1.fifo 创建一个管道文件 cat > /home/1.fifo 一个终端写入文件 cat /home/1.fifo 一个终端读取文件 单向,文件没大小,一对一
socket 套接字文件
Memory-maped file 文件映射,将文件中的一段数据映射到物理内存,多个进程共享这片内存
signal 信号
shared memory 共享内存
lock 对资源上锁,如果资源已经被某个进程锁住,其他进程想修改甚至读取这些资源,都将阻塞,直至锁被打开
semaphore 信号量,一种计数器
不同主机
rpc remote procedure call 远程过程调用
MQ 消息队列,如 Kafka RabbitMQ

2. 内存

a. 内存基础核心概念

i. 内存的本质与分类

Linux 内存分为 物理内存(RAM)虚拟内存(Swap),核心作用是临时存储运行中的程序和数据,访问速度远快于磁盘

类型 定义与特点 作用场景
物理内存(RAM) 实际硬件内存(如 DDR4),读写速度快(纳秒级),断电数据丢失。 运行中的进程、内核、缓存数据的主要存储区域
虚拟内存(Swap) 磁盘上的一块分区/文件(swap 分区/swapfile),读写速度慢(毫秒级),断电数据不丢失。 物理内存不足时,临时置换不活跃进程数据

ii. 核心内存术语

理解内存相关命令的前提是明确以下术语,避免混淆:

术语 定义与说明 示例/补充
总内存(Total 物理内存总大小(free -h 中的 total)。 服务器 16GB 内存 → total: 15.5Gi(部分被内核预留)
已用内存(Used 进程占用+缓存(Page Cache+Buffer)+内核占用的内存总和(非纯应用占用)。 free -h 中的 used = 应用内存 + 缓存 + 内核内存
空闲内存(Free 完全未使用的物理内存(free -h 中的 free)。 空闲内存过低(如 <5%)可能导致系统卡顿,但缓存占用高不一定是问题
可用内存(Available 真正可分配给新进程的内存(free -h 中的 available)= 空闲内存 + 可回收缓存。 free 更能反映实际可用内存
缓存(Cache/Page Cache 缓存磁盘文件数据(如读取的日志、配置文件),加速后续访问,可主动回收。 频繁访问的文件会被缓存,如 cat /var/log/syslog 后,文件数据存入 Cache
缓冲区(Buffer 缓存块设备(磁盘、分区)的元数据(如文件权限、目录结构),由内核管理,可回收。 磁盘 I/O 频繁时 Buffer 占用升高(如 dd 拷贝文件)
共享内存(Shared 多个进程共享的内存区域(如共享库、进程间通信(IPC)数据)。 libc.so 等系统库会被多个进程共享,减少内存占用
Swap(交换分区) 磁盘上的预留空间,物理内存不足时,将不活跃进程的内存数据置换到磁盘,释放物理内存。 应用内存泄漏、高峰期内存不足时自动触发 Swap 使用
内核内存(Kernel Memory) 内核本身占用的内存(如内核代码、进程描述符、页表),不可回收。 通常占用总内存的 1-5%,高负载下可能略有升高

iii. 关键内存原理

虚拟内存机制

Linux 为每个进程分配独立的 虚拟地址空间 (32 位系统最大 4GB,64 位系统最大 128TB 理论无上限),进程无需直接操作物理内存,而是通过内核的「页表」映射到物理内存。

  • 核心优势
    • 进程隔离:避免进程非法访问其他进程内存
    • 内存复用:多个进程可共享同一物理内存(如共享库)
    • 按需分配:进程申请内存时,内核仅分配虚拟地址,实际物理内存在进程访问时才分配
    • 突破物理内存限制:通过 Swap 扩展内存空间
缓存机制(Page Cache + Buffer)

缓存是 Linux 提升性能的核心手段,缓存占用高不是问题,反而能加速系统运行

  • Page Cache :缓存文件内容(如数据库数据文件、日志文件),下次访问直接从内存读取,避免磁盘 I/O,频繁读取文件(如 catgrep)后占用升高

  • Buffer :缓存块设备元数据(如磁盘分区表、文件权限),加速磁盘 I/O 操作,磁盘格式化、分区挂载、dd 拷贝文件时占用升高

  • 回收机制 :当物理内存不足时,内核会通过 LRU(最近最少使用)算法 主动回收不活跃的缓存,分配给新进程

  • 回收优先级

    • 未活跃的 Page Cache(长期未访问的文件数据)
    • Buffer(块设备元数据,非活跃)
    • 活跃缓存(近期访问过的文件数据)不会被回收(避免频繁从磁盘加载)
  • 手动清理缓存:不推荐

    bash 复制代码
    # sync:将缓存中的数据刷写到磁盘(避免数据丢失)
    # 清理后缓存会重新增长,无需定期执行(内核自动管理更高效)
    # 仅清理 Page Cache,
    sudo sync && echo 1 > /proc/sys/vm/drop_caches
    # 清理 Page Cache + Buffer
    sudo sync && echo 3 > /proc/sys/vm/drop_caches
Swap 工作原理

Swap 是物理内存的「备份空间」,但因磁盘速度慢,频繁使用会导致系统卡顿(称为「Swap Thrashing」)。

  • 核心作用

    • 应急内存:物理内存不足时,置换不活跃进程的数据到磁盘,释放物理内存给活跃进程
    • 休眠支持:系统休眠时,将物理内存中的所有数据写入 Swap,唤醒时从 Swap 恢复
    • 内存碎片整理:内核可通过 Swap 暂时置换进程,整理物理内存碎片,提升内存分配效率
  • 内核触发 Swap 的条件

    • 物理内存空闲低于阈值(由 vm.swappiness 控制,默认 60)
    • 进程长时间不活跃(如后台备份任务)
  • 核心场景:临时应对内存峰值,避免 OOM,但不能替代物理内存

  • 场景建议

    场景 是否需要使用 Swap? 优化建议
    物理内存充足(available > 20% 不需要,Swap 使用率应接近 0。 可降低 vm.swappiness(如设为 10),减少 Swap 使用
    物理内存不足(available < 5% 需要,但频繁使用 Swap 会导致系统卡顿(Swap Thrashing)。 优先扩容物理内存,或优化应用内存占用
    数据库/中间件(如 MySQL、ClickHouse) 不推荐频繁使用 Swap(数据库对延迟敏感)。 vm.swappiness=0,禁用 Swap 或仅应急使用
    桌面/开发环境 推荐使用(物理内存较小,可提升多任务并发能力)。 Swap 大小设为物理内存的 1-2 倍
    物理内存大小 推荐 Swap 大小 适用场景
    ≤ 4GB 物理内存的 2 倍(如 4GB 内存 → 8GB Swap) 桌面/开发环境
    4GB ~ 16GB 物理内存的 1 倍(如 8GB 内存 → 8GB Swap) 服务器/生产环境
    > 16GB 4GB ~ 8GB(足够应急) 高内存服务器(如 32GB/64GB 内存)
OOM Killer 机制

当物理内存+Swap 完全耗尽时,内核会启动 OOM Killer(Out-of-Memory Killer) ,根据进程优先级(oom_score_adj)终止部分进程,释放内存以保障系统存活。

  • 终止优先级

    • 内存占用高的进程
    • 优先级低的用户进程
    • 避免终止核心系统进程(如 systemdsshd
  • OOM Killer 流程

    • 进程申请内存,内核分配失败
    • 内核扫描所有进程,计算每个进程的 oom_score(内存占用越高、优先级越低,分数越高)
    • 终止 oom_score 最高的进程,释放其内存
    • 若内存仍不足,继续终止次高分数的进程,直到系统恢复
  • 避免核心进程被 OOM 终止

    • 通过调整 oom_score_adj 降低核心进程的 OOM 分数(范围:-1000 ~ 1000,分数越低越不容易被终止)

      bash 复制代码
      # 临时调整(重启失效):给 PID=1234 的进程设 oom_score_adj=-1000(避免被 OOM 终止)
      echo -1000 > /proc/1234/oom_score_adj
      
      # 永久调整(推荐):通过 systemd 服务配置
      sudo vim /etc/systemd/system/myapp.service
      # 添加以下内容到 [Service] 段
      OOMScoreAdjust=-1000
      # 重新加载配置并重启服务
      sudo systemctl daemon-reload
      sudo systemctl restart myapp
  • 查看 OOM 日志 :OOM 事件会记录到系统日志中,可通过以下命令查看

    bash 复制代码
    dmesg | grep -i oom  # 查看 OOM 事件
    journalctl -k | grep -i oom  # 查看更详细的 OOM 日志(包含终止的进程 PID)

b. 内存监控核心命令

i. free:快速查看内存整体使用

最基础的内存查看命令,简洁展示物理内存、Swap、缓存的使用情况,推荐用 -h(人类可读单位)。

语法
bash 复制代码
free -h  # 推荐,显示 GB/MB 单位
free -m  # 以 MB 为单位(精确)
free -s 2  # 每 2 秒刷新一次(实时监控)
输出示例与字段说明
bash 复制代码
              total        used        free      shared  buff/cache   available
Mem:           15Gi       3.2Gi       2.1Gi       128Mi        10Gi        12Gi
Swap:          8.0Gi          0B       8.0Gi
字段 含义(关键解读)
total 物理内存总大小(如 15Gi = 实际 16GB 内存,部分被内核预留)。
used 已使用内存 = 应用内存 + 缓存(buff/cache) + 内核内存(非纯应用占用,参考价值低)。
free 完全未使用的物理内存(参考价值低,缓存可回收)。
shared 共享内存大小(如共享库、IPC 数据)。
buff/cache Buffer + Page Cache 总和(可回收,占用高是正常现象)。
available 真正可分配给新进程的内存(推荐关注)= 空闲内存 + 可回收缓存(核心指标)。
Swap 交换分区使用情况(used 过高需警惕内存不足)。
关键结论
  • 不要纠结 used 高,重点看 available(如 available > 20% 则内存充足);
  • buff/cache 高说明系统缓存效果好,无需手动清理(清理会降低性能)。

ii. top/htop:实时监控进程内存占用

top 是系统自带的实时监控工具,htop 是增强版(支持鼠标操作、颜色区分),可按内存排序定位高内存进程。

内存相关字段解析(top 输出)
bash 复制代码
top - 16:30:00 up 10 days,  2:10,  2 users,  load average: 0.50, 0.30, 0.20
Tasks: 200 total,   1 running, 199 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.0 us,  1.0 sy,  0.0 ni, 93.5 id,  0.0 wa,  0.0 hi,  0.5 si,  0.0 st
MiB Mem :  15898.0 total,   1024.0 free,   8000.0 used,   6874.0 buff/cache
MiB Swap:   8192.0 total,   7000.0 free,   1192.0 used.  12000.0 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
1234 nginx     20   0  123456  89000  12340 S   0.5   0.5   0:10.00 nginx
5678 mysql     20   0  2097152 512000  45670 S   1.0   3.2   1:30.00 mysqld
字段 含义(内存核心指标)
VIRT 虚拟内存大小(进程占用的虚拟地址空间)= 物理内存 + Swap + 共享库 + 未分配内存(参考价值低)。
RES(RSS) 物理内存占用(进程实际使用的物理内存,核心指标)= 进程代码 + 数据 + 共享库(不包含 Swap)。
SHR 共享内存大小(进程与其他进程共享的内存,如共享库、文件缓存)。
%MEM 进程占用物理内存的百分比(按 M 键排序,快速定位高内存进程)。
avail Mem 系统可用内存(与 free -h 中的 available 一致)。

iii. vmstat:监控内存、CPU、I/O 整体状态

vmstat 是系统级监控工具,可同时查看内存使用、进程状态、CPU 负载、磁盘 I/O,适合排查内存与 I/O 联动问题(如 Swap 频繁使用是否因 I/O 阻塞)。

语法
bash 复制代码
vmstat 1 5  # 每 1 秒刷新 1 次,共 5 次(推荐)
输出示例(内存相关字段重点解读)
bash 复制代码
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 2150400  51200 10485760    0    0     0     0  100  200  5  1 94  0  0
字段 含义(内存核心指标)
swpd 已使用的 Swap 大小(KB)(swpd > 0 表示已使用 Swap)。
free 空闲物理内存大小(KB)(与 free -k 中的 free 一致)。
buff Buffer 大小(KB)(缓存块设备元数据)。
cache Page Cache 大小(KB)(缓存文件数据)。
si(swap in) 从 Swap 读取到物理内存的数据量(KB/s)(si > 0 表示 Swap 换入,内存不足)。
so(swap out) 从物理内存写入到 Swap 的数据量(KB/s)(so > 0 表示 Swap 换出,内存不足)。
关键结论
  • siso 持续大于 0(如 >100 KB/s),说明物理内存不足,系统频繁置换 Swap,需优化;
  • buffcache 持续增长是正常现象,说明缓存生效。

iiii. pidstat:精细化监控进程内存占用

pidstat 可按进程维度监控内存使用细节(如物理内存占用、缺页次数、Swap 使用),适合定位单个进程的内存泄漏问题。

语法
bash 复制代码
pidstat -r 1 5  # 每 1 秒刷新 1 次,共 5 次,监控所有进程内存
pidstat -r -p 1234 1 5  # 监控指定 PID=1234 的进程内存
输出示例(内存相关字段解读)
bash 复制代码
Linux 5.14.0-284.30.1.el9_2.x86_64 (rocky-server) 	11/21/2024 	_x86_64_	(2 CPU)

16:40:00      PID  %usr %system  %guest    %CPU   CPU  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
16:40:01     1234    2.00    1.00    0.00    3.00     0      10.00      0.00  123456  89000   0.5  nginx
字段 含义(进程内存核心指标)
minflt/s 每秒 minor fault(轻微缺页)次数(进程访问的内存页在物理内存中,无需磁盘 I/O,正常)。
majflt/s 每秒 major fault(严重缺页)次数(进程访问的内存页不在物理内存,需从磁盘读取,majflt/s > 0 表示 I/O 频繁)。
VSZ 虚拟内存大小(KB)(与 top 中的 VIRT 一致)。
RSS 物理内存大小(KB)(与 top 中的 RES 一致)。
%MEM 进程占用物理内存百分比(与 top 中的 %MEM 一致)。
关键结论
  • majflt/s 持续大于 0,说明进程频繁从磁盘加载数据,可能是内存不足或缓存未命中;
  • RSS 持续增长且无下降趋势,可能是进程内存泄漏(如 Java 应用未释放对象)。

iiiii. slabtop:监控内核内存占用

内核通过 slab 分配器管理内存(用于存储内核对象,如进程描述符、inode、页表),slabtop 可查看内核内存的详细占用,避免内核内存泄漏。

语法
bash 复制代码
slabtop  # 实时监控内核 slab 内存(按 `c` 键按缓存大小排序)
输出示例(核心字段)
bash 复制代码
 Active / Total Objects (% used)    : 123456 / 156789 (78.7%)
 Active / Total Slabs (% used)      : 5678 / 6789 (83.6%)
 Active / Total Caches (% used)     : 120 / 180 (66.7%)
 Active / Total Size (% used)       : 23456789 / 29876543 (78.5%)
 Minimum / Average / Maximum Object : 0.01 / 0.19 / 8.00 K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
12345 11234  91%    0.50K   345      36     1380K dentry
 9876  8765  88%    1.00K   274      36     2192K inode_cache
字段 含义
NAME slab 缓存名称(如 dentry 是目录项缓存,inode_cache 是 inode 缓存)。
OBJS 缓存对象总数。
ACTIVE 活跃的缓存对象数。
CACHE SIZE 缓存占用的内存大小(KB)。
关键结论
  • 内核内存泄漏表现为某类 slab 缓存(如 dentryinode_cache)的 CACHE SIZE 持续增长,且不释放;
  • 正常情况下,内核内存占用稳定(通常 < 总内存的 5%)。

iiiiii. 其他实用命令

命令 核心功能 示例
cat /proc/meminfo 查看内存详细参数(内核级),包含缓存、Swap、内核内存等所有细节。 `cat /proc/meminfo
ps aux --sort=-%mem 按内存使用率降序排列所有进程,快速定位高内存进程。 `ps aux --sort=-%mem
pmap -x <PID> 查看进程的内存映射(如共享库、堆/栈、文件映射),排查内存泄漏。 `pmap -x 1234

3. CPU

a. CPU 基础核心概念

i. CPU 核心术语

理解 CPU 相关命令的前提是明确以下术语,避免混淆:

术语 定义与说明 示例/补充
物理 CPU(Physical CPU 服务器实际安装的 CPU 芯片数量(如 2 颗 Intel Xeon 处理器)。 lscpuSocket(s) 总数 = 物理 CPU 数
核心数(Core 每颗物理 CPU 包含的独立计算核心(如 8 核 CPU,每颗芯片有 8 个计算单元)。 物理 CPU 数 × 核心数 = 总物理核心数(如 2 颗 × 8 核 = 16 物理核心)
超线程(Hyper-Threading 英特尔技术,让单个物理核心同时处理 2 个线程,共享核心资源。 开启后 lscpuThread(s) per core: = 2,关闭则为 1
逻辑 CPU(Logical CPU 开启超线程(HT)后,每个核心模拟的虚拟核心(如 16 物理核心 → 32 逻辑 CPU)。 超线程可提升多线程任务性能(约 30%),lscpuCPU(s): 显示逻辑 CPU 数
CPU 架构(Architecture CPU 的指令集架构(如 x86_64、ARM64),决定系统支持的软件和指令。 服务器多为 x86_64(64 位),嵌入式设备多为 ARM64
主频(Frequency CPU 核心的运行时钟频率(如 2.4GHz),主频越高,单线程计算速度越快。 睿频(Turbo Boost)可让核心临时超频(如 2.4GHz → 3.2GHz)
缓存(Cache CPU 内置的高速缓存(L1、L2、L3),加速数据访问(速度:L1 > L2 > L3 > 内存)。 L1 缓存:每核心独占;L2 缓存:每核心独占或共享;L3 缓存:多核心共享
调度器(Scheduler 内核组件,负责分配 CPU 时间片给进程/线程,决定进程执行顺序。 Linux 默认使用 CFS 调度器(完全公平调度器),适用于大部分场景
CPU 状态(us/sy/ni/id/wa 表示 CPU 时间的分配比例(top/mpstat 中显示)。 核心指标:us(用户态)、sy(内核态)、id(空闲)、wa(I/O 等待)
bash 复制代码
# 查询 cpu 信息
cat /proc/cpuinfo

# 查询 cpu 型号
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

# 查询物理 cpu 个数,主板上实际插入的 cpu 数量
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l

# 查询 cpu 核数,单个物理 cpu 上能处理数据的芯片组的数量,如双核、四核等 (cpu cores)
cat /proc/cpuinfo | grep "cores" | uniq

# 查询逻辑 cpu 数,一般情况下,逻辑cpu = 物理 cpu 个数 × 每颗核数
# 如果不相等的话,则表示服务器的 cpu 支持超线程技术
#(简单来说,它可使处理器中的 1 颗内核如 2 颗内核那样在操作系统中发挥作用。这样一来,操作系统可使用的执行资源扩大了一倍,大幅提高了系统的整体性能,此时逻辑 cpu = 物理 cpu 个数 × 每颗核数 x 2)
cat /proc/cpuinfo | grep "processor" | wc -l

ii. CPU 核心状态详解(top/mpstat 字段)

CPU 时间分为多个状态,通过这些状态可判断 CPU 负载类型(如用户进程占用、内核占用、I/O 等待):

状态符 状态名称 定义与说明 正常范围 异常场景
us(%user) 用户态 CPU 应用进程占用的 CPU 时间(如 MySQL、Nginx、Java 应用)。 50-80% 持续 > 90% → 应用 CPU 瓶颈(如死循环、高并发计算)
sy(%system) 内核态 CPU 内核进程占用的 CPU 时间(如进程调度、内存管理、磁盘 I/O、网络栈)。 5-15% 持续 > 30% → 内核优化不足(如频繁系统调用、上下文切换)
ni(%nice) 低优先级用户态 调整过 nice 值的低优先级应用占用的 CPU 时间。 0-5% 过高可能是低优先级进程抢占资源
id(%idle) 空闲 CPU 无进程需要执行时的 CPU 时间(空闲状态)。 10-30% <5% → CPU 资源紧张;>50% → CPU 利用率低
wa(%iowait) I/O 等待 CPU CPU 等待磁盘 I/O、网络 I/O 完成的时间(CPU 空闲但等待 I/O)。 0-5% 持续 > 10% → I/O 瓶颈(如磁盘读写慢、网络阻塞)
hi(%hardirq) 硬中断 CPU 处理硬件中断(如键盘、网卡、磁盘控制器触发的中断)的 CPU 时间。 0-1% 过高可能是硬件故障(如网卡异常、磁盘控制器问题)
si(%softirq) 软中断 CPU 处理内核软中断(如网络数据包接收、定时器)的 CPU 时间。 0-5% 持续 > 10% → 软中断风暴(如网络数据包洪水)
st(%steal) 虚拟化窃取 CPU 虚拟化环境中,CPU 时间被其他虚拟机抢占的比例(物理机为 0)。 0-2% 持续 > 5% → 虚拟机资源不足(需扩容 CPU)

iii. CPU 调度机制(核心原理)

Linux 内核通过调度器分配 CPU 时间片给进程/线程,核心目标是"公平性"和"高效性"。

调度策略(适用于不同场景)
调度策略 适用场景 优先级 示例进程
CFS(完全公平调度器) 大部分用户态进程(默认策略) 动态调整 Nginx、MySQL、Java 应用
实时调度(SCHED_FIFO/SCHED_RR) 实时任务(如工业控制、音频处理) 最高 实时数据采集程序
SCHED_IDLE 低优先级后台任务(如日志清理、备份) 最低 nice -n 19 启动的备份脚本
优先级机制
  • 静态优先级 :通过 nice 值(-20 ~ 19)设置,值越低优先级越高(root 可设 -20,普通用户仅能设 ≥0)
  • 动态优先级:调度器根据进程运行状态(如 I/O 密集型/CPU 密集型)动态调整,I/O 密集型进程(如数据库)优先级会略高
  • 调度周期:CFS 调度器通过"调度周期"(默认 10-20ms)分配时间片,确保每个进程公平获得 CPU 资源
调度器优化建议
  • CPU 密集型任务(如计算、编码) :设置较高 nice 值(如 10),避免抢占 I/O 密集型任务资源;
  • I/O 密集型任务(如 Nginx、MySQL) :设置较低 nice 值(如 -5),确保快速响应请求。

b. CPU 监控命令

i. lscpu:查看 CPU 硬件信息

最直观的 CPU 硬件配置查询命令,没有复杂选项,直接输出物理 CPU、核心数、逻辑 CPU、架构等关键信息。

语法
bash 复制代码
# 直接运行,输出所有 CPU 硬件信息
lscpu
输出解析(关键字段)
bash 复制代码
Architecture:        x86_64  # CPU 架构(64位)
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              32      # 逻辑 CPU 总数(2 物理 CPU × 8 核心 × 2 超线程 = 32)
On-line CPU(s) list: 0-31
Thread(s) per core:  2       # 每核心线程数(开启超线程)
Core(s) per socket:  8       # 每颗物理 CPU 的核心数
Socket(s):           2       # 物理 CPU 数(2 颗芯片)
NUMA node(s):        2       # NUMA 节点数(多 CPU 服务器常见)
Vendor ID:           GenuineIntel  # CPU 厂商(Intel/AMD)
CPU family:          6
Model:               85
Model name:          Intel(R) Xeon(R) Gold 6248 CPU @ 2.50GHz  # CPU 型号
Stepping:            7
CPU MHz:             2500.000  # 主频
CPU max MHz:         3900.0000  # 最大睿频
CPU min MHz:         1200.0000  # 最小主频
Cache L1d:           32K       # L1 数据缓存(每核心)
Cache L1i:           32K       # L1 指令缓存(每核心)
Cache L2:            1024K     # L2 缓存(每核心)
Cache L3:            33792K    # L3 缓存(每颗物理 CPU,共享)
关键结论
  • 逻辑 CPU 数 = 物理 CPU 数 × 核心数 × 每核心线程数
  • Thread(s) per core: 2 表示开启超线程,1 表示关闭
    • 提升多线程任务性能(如 Web 服务器、数据库,多线程并发场景)
    • 单线程任务性能无提升(甚至略有下降,因资源共享)
    • BIOS 中开启或者禁用 Hyper-Threading
    • 或通过内核参数 nosmt(临时:sudo sysctl -w kernel.nosmt=1;永久:echo "kernel.nosmt=1" >> /etc/sysctl.conf
  • NUMA node(s) 表示 NUMA 节点数,多 CPU 服务器需注意内存与 CPU 节点的绑定(避免跨节点访问内存导致延迟)多 CPU 服务器通常采用 NUMA(非统一内存访问) 架构,每个 CPU 节点(NUMA 节点)有独立的内存控制器和内存,跨节点访问内存延迟更高(约 2 倍)
    • 查看 NUMA 节点:numactl --hardware
    • 绑定进程到 NUMA 节点:numactl --cpunodebind=0 --membind=0 ./app.sh(将进程绑定到节点 0 的 CPU 和内存)。

ii. top:实时监控 CPU 负载

top 是系统自带的实时监控工具用于查看 CPU 整体负载、进程 CPU 占用

top 核心操作与输出解析
bash 复制代码
top  # 启动实时监控(默认 3 秒刷新)
顶部 CPU 整体负载信息
bash 复制代码
top - 14:30:00 up 10 days,  2:10,  2 users,  load average: 16.50, 15.20, 14.80
Tasks: 400 total,   2 running, 398 sleeping,   0 stopped,   0 zombie
%Cpu(s): 75.0 us, 10.0 sy,  0.0 ni, 12.0 id,  2.0 wa,  0.5 hi,  0.5 si,  0.0 st
字段 含义(核心解读)
load average: 16.50, 15.20, 14.80 1/5/15 分钟系统负载(逻辑 CPU 数为 32 时,16.5 表示负载率 51.6%,正常)。
%Cpu(s): 75.0 us 用户态 CPU 占比 75%(应用进程占用为主,正常)。
%Cpu(s): 10.0 sy 内核态 CPU 占比 10%(正常范围 5-15%)。
%Cpu(s): 12.0 id 空闲 CPU 占比 12%(资源充足)。
%Cpu(s): 2.0 wa I/O 等待 CPU 占比 2%(正常,无 I/O 瓶颈)。

iii. mpstat:监控多核心 CPU 负载(精细化)

mpstat (需要安装 sysstat)核心优势是按 CPU 核心拆分负载,可排查"单核心负载过高"(如某核心 100% 其他空闲)的问题。

语法
bash 复制代码
mpstat  # 查看所有 CPU 核心的平均负载
mpstat -P ALL 1 5  # 每 1 秒刷新 1 次,共 5 次,显示每个核心的负载(-P ALL 表示所有核心)
mpstat -P 0 1 3  # 仅监控 CPU 核心 0,每 1 秒刷新 1 次,共 3 次
输出解析(mpstat -P ALL 1 2
bash 复制代码
Linux 5.14.0-284.30.1.el9_2.x86_64 (rocky-server) 	11/22/2024 	_x86_64_	(32 CPU)

14:40:00     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
14:40:01     all   76.25    0.00    9.38    1.88    0.31    0.62    0.00    0.00    0.00   11.56
14:40:01       0   85.00    0.00    8.00    2.00    0.00    1.00    0.00    0.00    0.00    4.00
14:40:01       1   72.00    0.00   10.00    1.00    0.00    0.00    0.00    0.00    0.00   17.00
...
字段 含义
CPU: all 所有核心的平均负载
CPU: 0/1/2... 单个逻辑 CPU 核心的负载(如核心 0 的 %usr 为 85%,负载较高)
%usr/%sys/%iowait top 中含义一致,按核心拆分显示
关键结论
  • 若某核心 %usr 持续 100%,其他核心空闲 → 单线程应用瓶颈(如应用未充分多线程化);
  • 若所有核心 %sys 持续 >30% → 内核态占用过高(如频繁系统调用、上下文切换);
  • 若某核心 %iowait 持续 >10% → 该核心绑定的 I/O 设备(如磁盘)存在瓶颈。

iiii. pidstat:监控进程 CPU 占用(精细化)

pidstat 可按进程维度监控 CPU 占用(用户态/内核态、上下文切换、CPU 核心绑定),适合定位单个进程的 CPU 消耗问题(如内存泄漏导致的高 CPU)。

语法
bash 复制代码
pidstat  # 查看所有进程的 CPU 占用(默认每 1 秒刷新)
pidstat -u 1 5  # 每 1 秒刷新 1 次,共 5 次,监控 CPU 使用率(-u 表示 CPU 维度)
pidstat -u -p 1234 1 3  # 仅监控 PID=1234 的进程,每 1 秒刷新 1 次,共 3 次
pidstat -w 1 5  # 监控进程上下文切换(-w 表示上下文切换维度)
输出解析(pidstat -u -p 1234 1 2
bash 复制代码
Linux 5.14.0-284.30.1.el9_2.x86_64 (rocky-server) 	11/22/2024 	_x86_64_	(32 CPU)

14:50:00      PID    %usr %system  %guest    %CPU   CPU  Command
14:50:01     1234   85.00    5.00    0.00   90.00     0  java
14:50:02     1234   88.00    4.00    0.00   92.00     0  java
字段 含义
%usr/%system 进程占用的用户态/内核态 CPU 比例(如 85% 用户态,说明是应用逻辑占用)
%CPU 进程占用的总 CPU 比例(如 90% 表示占用近 1 个逻辑核心)
CPU 进程绑定的 CPU 核心(如 0 表示进程运行在核心 0 上)
上下文切换监控(pidstat -w 1 3
bash 复制代码
14:55:00      PID   cswch/s nvcswch/s  Command
14:55:01     1234    120.00     5.00  java
14:55:02     1234    115.00     3.00  java
  • cswch/s:每秒自愿上下文切换(如进程等待 I/O 主动放弃 CPU);
  • nvcswch/s:每秒非自愿上下文切换(如时间片用完被调度器强制切换);
  • 非自愿上下文切换过高(如 >1000/s)→ 进程竞争 CPU 激烈,需优化。

iiiii. sar:历史 CPU 负载查询(核心)

sar (需要安装 sysstat)是系统活动报告工具,可查看历史 CPU 负载(默认保存近 1 个月的历史数据),适合排查非实时的 CPU 瓶颈问题(如"昨天 10 点 CPU 突然飙升")

语法
bash 复制代码
sar -u  # 查看当天的 CPU 平均负载
sar -u 1 5  # 实时监控:每 1 秒刷新 1 次,共 5 次
sar -u -f /var/log/sa/sa22  # 查看 22 号的历史 CPU 负载(/var/log/sa/ 存储历史日志)
sar -u -s 10:00:00 -e 10:30:00 -f /var/log/sa/sa22  # 查看 22 号 10:00-10:30 的 CPU 负载
输出解析(sar -u 1 2
bash 复制代码
Linux 5.14.0-284.30.1.el9_2.x86_64 (rocky-server) 	11/22/2024 	_x86_64_	(32 CPU)

15:00:00       CPU     %user     %nice   %system   %iowait    %steal     %idle
15:00:01       all      78.50      0.00      9.25      1.75      0.00     10.50
15:00:02       all      79.00      0.00      8.75      2.00      0.00     10.25
Average:       all      78.75      0.00      9.00      1.88      0.00     10.38
  • 字段含义与 top/mpstat 一致,sar 优势是支持历史数据查询和平均统计。

iiiiii. perf:CPU 性能分析工具(高级)

perf (需要安装 perf)是 Linux 内核自带的性能分析工具,可深入分析 CPU 指令执行、函数调用、缓存命中情况,适合排查复杂的 CPU 性能问题(如代码瓶颈、缓存失效)。

语法
bash 复制代码
# 1. 查看进程的 CPU 热点函数(采样 10 秒)
perf top -p 1234 -g  # -p 指定 PID,-g 显示函数调用关系

# 2. 记录进程的 CPU 执行情况(生成报告文件)
perf record -p 1234 -g -o perf.data  # 记录 PID=1234 的 CPU 活动,生成 perf.data
perf report -i perf.data  # 分析报告,查看热点函数

# 3. 生成火焰图(需安装火焰图工具)
perf record -F 99 -p 1234 -g -- sleep 10  # 采样 10 秒
perf script -i perf.data > perf.script
./stackcollapse-perf.pl perf.script > perf.folded
./flamegraph.pl perf.folded > perf.svg  # 生成火焰图(用浏览器打开查看)
应用场景
  • 定位应用代码瓶颈(如 Java 应用的某个方法占用 80% CPU);
  • 分析缓存失效(如 L1/L2 缓存命中率低导致的 CPU 性能下降);
  • 排查内核函数占用过高(如某内核模块频繁被调用)。

iiiiiii. 其他实用命令

命令 核心功能 示例
cat /proc/cpuinfo 查看 CPU 详细硬件信息(逐核心显示,如型号、主频、缓存)。 `cat /proc/cpuinfo
taskset 绑定进程到指定 CPU 核心(避免进程在多核心间切换,提升缓存命中率)。 taskset -cp 0-3 1234(将 PID=1234 绑定到核心 0-3)
nice/renice 调整进程优先级(nice 启动时设置,renice 运行时调整)。 nice -n -5 ./app.sh(启动时提升优先级)、renice -10 -p 1234(运行时调整)
chrt 查看/设置进程调度策略(如实时调度)。 chrt -p 1234(查看 PID=1234 的调度策略)、chrt -f -p 99 1234(设置为实时调度)
strace 跟踪进程的系统调用(查看进程是否频繁调用某系统函数导致高 CPU)。 strace -c -p 1234(统计 PID=1234 的系统调用耗时)
相关推荐
qqssss121dfd1 小时前
计算机网络(第8版,谢希仁)第二章习题解答
服务器·网络·计算机网络
weixin_307779131 小时前
Jenkins Ioncions API 插件:现代化图标库在持续集成中的应用
java·运维·开发语言·前端·jenkins
楼田莉子1 小时前
Linux学习:基础IO相关学习
linux·开发语言·c++·后端·学习
行初心1 小时前
uos基础 systemd-resolve 命令执行报错与参考处理方法
运维
小陈phd1 小时前
langgraph从入门到精通(一)——langgraph概念解析
linux·运维·数据库
阿巴~阿巴~1 小时前
解锁HTTP方法奥秘:GET与POST的深度探索与实战演示
服务器·网络·网络协议·http·get·post·请求方法
inquisiter1 小时前
cove-salus-tellus测试程序时序逻辑
linux·服务器·网络·riscv
这儿有一堆花1 小时前
告别“脚本小子”:真正理解 Linux 包管理器
linux