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 |
| 进程状态 | 描述进程当前行为(通过 ps 的 STAT l字段查看) |
见下文进程状态详解 |
| 优先级(NI) | 决定 CPU 资源分配优先级(-20~19,默认 0,数值越低优先级越高) | root 可设 NI<0(提升优先级),普通用户仅能设 NI≥0 |
| 资源占用 | CPU 使用率、内存占用(RSS/VSZ)、I/O 读写量 | RSS:物理内存占用(实际使用);VSZ:虚拟内存(含共享库) |
iii. 进程状态详解(STAT 字段)
ps/top 中 STAT 字段是进程状态的核心标识,不同状态对应不同场景:
| 状态符 | 名称 | 核心含义 | 典型场景 |
|---|---|---|---|
| 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.com 按 Ctrl+Z 后变 T 态 |
| < | High Priority | 高优先级进程(NI<0) | 核心服务(如 ClickHouse)手动调高优先级 |
| N | Low Priority | 低优先级进程(NI>0) | 备份、日志清理等后台任务 |
| s | 包含子进程 | ||
| + | 前台进程 | ||
| l | 多线程 |
iiii. 进程类型
| 类型 | 特点 | 示例 |
|---|---|---|
| 前台进程 | 与终端关联,阻塞终端操作 | 直接执行 ls、vim |
| 后台进程 | 与终端解耦,不阻塞终端(& 启动),终端关闭则进程终止 |
ls &、nginx & |
| 守护进程 | 脱离终端,后台持久运行(通常以 d 结尾) |
sshd、crond、mysqld |
| 系统进程 | 内核启动,用于管理系统资源(UID=0) | systemd、kworker(内核工作线程) |
| 用户进程 | 普通用户启动,权限受 UID 限制 | bash、python 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.sh、nginx |
终端阻塞,终端关闭则进程终止 | 临时执行、需要交互的命令(如 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 - root→ulimit -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,频繁读取文件(如
cat、grep)后占用升高 -
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)终止部分进程,释放内存以保障系统存活。
-
终止优先级 :
- 内存占用高的进程
- 优先级低的用户进程
- 避免终止核心系统进程(如
systemd、sshd)
-
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 事件会记录到系统日志中,可通过以下命令查看
bashdmesg | 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 换出,内存不足)。 |
关键结论
- 若
si和so持续大于 0(如 >100 KB/s),说明物理内存不足,系统频繁置换 Swap,需优化; buff和cache持续增长是正常现象,说明缓存生效。
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 缓存(如
dentry、inode_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 处理器)。 | lscpu 中 Socket(s) 总数 = 物理 CPU 数 |
核心数(Core) |
每颗物理 CPU 包含的独立计算核心(如 8 核 CPU,每颗芯片有 8 个计算单元)。 | 物理 CPU 数 × 核心数 = 总物理核心数(如 2 颗 × 8 核 = 16 物理核心) |
超线程(Hyper-Threading) |
英特尔技术,让单个物理核心同时处理 2 个线程,共享核心资源。 | 开启后 lscpu 中 Thread(s) per core: = 2,关闭则为 1 |
逻辑 CPU(Logical CPU) |
开启超线程(HT)后,每个核心模拟的虚拟核心(如 16 物理核心 → 32 逻辑 CPU)。 | 超线程可提升多线程任务性能(约 30%),lscpu 中 CPU(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 和内存)。
- 查看 NUMA 节点:
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 的系统调用耗时) |