14_性能监控:Linux 系统 “健康体检” 手册
性能监控:Linux 系统 “健康体检” 手册
就像人需要定期体检一样,Linux 服务器也需要 “健康监控”—— 当用户反馈 “访问变慢”“操作卡顿” 时,若能提前通过监控发现 CPU、内存、I/O 的异常,就能避免故障扩大。今天这篇 “体检手册”,从 “基础实时监控” 到 “进阶历史分析”,再到 “瓶颈定位调优”,带你掌握 Linux 性能监控的核心工具与方法,让你成为系统的 “健康管家”。
一、基础体检:用 top/htop/free/vmstat 做 “实时快照”
基础监控工具就像 “体温计”,能快速获取系统当前的 “健康指标”——CPU 使用率、内存占用、I/O 状态,适合实时排查 “当下是否有问题”。
1. top/htop:实时监控 “全能工具”
top
是 Linux 自带的实时监控工具,htop
是它的 “增强版”(支持鼠标操作、颜色区分),两者核心功能一致,重点关注CPU、内存、进程三大维度。
(1)top 核心用法与指标解读
\# 启动top(默认每3秒刷新一次)
top
关键界面解读(新手必看 5 列):
区域 / 列名 | 含义 | 健康阈值 | 异常判断标准 |
---|---|---|---|
顶部 CPU 行 | %us (用户进程占比)、%sy (系统进程占比)、%id (空闲占比) |
%id ≥30%、%us ≤70%、%sy ≤30% |
%id <10%(CPU 繁忙)、%sy >50%(内核占用过高) |
顶部 Mem 行 | total (总内存)、used (已用)、free (空闲)、buff/cache (缓存) |
available (实际可用)≥总内存 10% |
available <5%(内存紧张)、buff/cache 占比>80%(缓存过多可临时清理) |
进程列 PID |
进程唯一 ID | - | 高 CPU / 内存进程的 PID(后续定位用) |
进程列 %CPU |
进程占用 CPU 百分比 | 单个进程≤30%(非核心服务) | 非核心进程持续>50%(可能是异常进程) |
进程列 %MEM |
进程占用内存百分比 | 单个进程≤20%(非核心服务) | 非核心进程持续>40%(可能是内存泄漏) |
常用操作:
-
按
P
:按 CPU 占用降序排序(找 “吃 CPU” 的进程); -
按
M
:按内存占用降序排序(找 “吃内存” 的进程); -
按
k
:输入 PID 后按回车,再输9
(强制关闭异常进程); -
按
q
:退出 top。
(2)htop 增强体验(推荐新手使用)
htop
比top
更直观,支持鼠标点击排序、进程树查看,安装与使用:
\# Ubuntu安装
sudo apt install htop -y
\# CentOS安装
sudo dnf install htop -y
\# 启动htop
htop
核心优势:
-
用颜色区分 CPU 状态(蓝色:低优先级进程、绿色:用户进程、红色:系统进程);
-
右侧实时显示 CPU 核心、内存、交换分区的使用率曲线;
-
鼠标点击 “% CPU”“% MEM” 列即可排序,无需记快捷键。
2. free/vmstat:聚焦内存与 I/O 的 “专项检查”
top
是 “全能工具”,free
和vmstat
则是 “专项工具”—— 前者专注内存,后者兼顾内存与 I/O,适合深入分析资源瓶颈。
(1)free:读懂内存 “真实可用量”
新手常被free
的 “used 高、free 低” 误导,其实关键看available
(实际可用内存,含可回收缓存):
\# 用-h参数(human-readable)显示GB/MB,更直观
free -h
输出解读(以 16GB 内存为例):
  total used free shared buff/cache available
Mem: 15Gi 6.2Gi 2.1Gi 384Mi 6.7Gi 8.3Gi
Swap: 15Gi 0B 15Gi
-
健康判断:
available
=8.3Gi(占总内存 55%),Swap used
=0,内存状态健康; -
异常信号:
available
<1.5Gi(<10%)、Swap used
持续增长,需警惕内存不足。
(2)vmstat:监控内存与 I/O 的 “联动变化”
vmstat
能显示内存交换(si/so)、磁盘 I/O(bi/bo)的实时变化,适合判断 “是否因 I/O 拖累内存 / CPU”:
\# 每2秒输出1次,共输出5次(观察趋势)
vmstat 2 5
核心列解读(新手重点看 4 列):
列名 | 含义 | 健康阈值 | 异常判断标准 |
---|---|---|---|
si |
从 Swap 读入内存的大小(KB / 秒) | si ≈0 |
持续>100KB / 秒(内存不足,频繁读 Swap) |
so |
从内存写入 Swap 的大小(KB / 秒) | so ≈0 |
持续>100KB / 秒(内存不足,被迫写 Swap) |
bi |
从块设备读入数据(KB / 秒) | 无固定阈值,看业务波动 | 持续>1000KB / 秒且%util (磁盘使用率)>80%(I/O 繁忙) |
bo |
写入块设备的数据(KB / 秒) | 无固定阈值,看业务波动 | 持续>1000KB / 秒且%util >80%(I/O 繁忙) |
二、进阶体检:用 sar/iostat/nmon 做 “历史回溯与报表”
基础工具只能看 “当下”,若要排查 “昨天下午 3 点为何卡顿”“上周内存占用峰值是多少”,就需要历史数据分析工具——sar(系统活动报告)、iostat(I/O 统计)、nmon(报表生成),帮你回溯历史数据、生成可视化报表。
1. sar:“全能历史记录者”(CPU / 内存 / I/O 全记录)
sar
是 Linux 性能监控的 “瑞士军刀”,能周期性采集系统活动数据,支持事后回溯,默认安装在大部分系统中。
(1)核心用法:采集与查看历史数据
\# 1. 实时采集(每5秒采集1次,共采集10次,输出到终端)
sar 5 10
\# 2. 采集并保存数据(每5秒采集1次,共10次,保存到sar.log)
sar 5 10 -o sar.log
\# 3. 查看历史数据(从sar.log中查看CPU使用情况)
sar -f sar.log -u # -u:查看CPU相关数据
(2)常用场景与参数组合
监控目标 | 命令 | 关键指标解读 |
---|---|---|
CPU 历史占用 | sar -f sar.log -u |
%idle (空闲占比):若某时段<10%,说明当时 CPU 繁忙 |
内存历史占用 | sar -f sar.log -r |
%memused (内存使用率):持续>90% 需警惕内存不足 |
磁盘 I/O 历史 | sar -f sar.log -b |
tps (每秒 I/O 次数)、rtps (每秒读次数):异常高峰对应 I/O 繁忙时段 |
网络流量历史 | sar -f sar.log -n DEV |
rxpck/s (每秒接收包数)、txpck/s (每秒发送包数):异常增长可能是网络攻击 |
(3)实战:回溯 “昨天下午 3 点的 CPU 异常”
\# 1. 查看系统默认保存的sar历史数据(CentOS默认存于/var/log/sa/,Ubuntu需手动配置)
ls /var/log/sa/ # 输出如sa25(25日的数据)
\# 2. 查看25日15:00-15:30的CPU数据(-s指定开始时间,-e指定结束时间)
sar -f /var/log/sa/sa25 -u -s 15:00:00 -e 15:30:00
\# 3. 解读结果:若15:10-15:15的%idle<5%,说明当时CPU繁忙,再结合top历史进程排查
2. iostat:I/O 性能的 “专项分析师”
sar
是 “全能工具”,iostat
则专注于磁盘 I/O 监控,能精准定位 “哪个磁盘最繁忙”“哪个进程在频繁读写”,适合排查 “I/O 瓶颈导致的卡顿”。
(1)基础用法:查看磁盘 I/O 状态
\# 安装iostat(属于sysstat包)
sudo apt install sysstat -y # Ubuntu
sudo dnf install sysstat -y # CentOS
\# 查看所有磁盘的I/O统计(-x:显示详细指标,-k:以KB为单位)
iostat -x -k
(2)关键指标解读(判断磁盘是否繁忙)
指标名 | 含义 | 健康阈值 | 异常判断标准 |
---|---|---|---|
%util |
磁盘繁忙百分比(I/O 时间占比) | ≤60% | 持续>80%(磁盘 I/O 饱和,是卡顿主因) |
rMB/s |
每秒读数据量(MB) | 无固定阈值,看磁盘性能 | 远超磁盘标称读写速度(如机械盘>100MB/s) |
wMB/s |
每秒写数据量(MB) | 无固定阈值,看磁盘性能 | 远超磁盘标称读写速度 |
avgqu-sz |
平均 I/O 队列长度 | ≤2 | 持续>5(I/O 请求排队过多,磁盘处理不过来) |
(3)进阶:定位 “繁忙磁盘对应的进程”
当iostat
发现/dev/sdb
的%util
=95%(I/O 饱和),用iotop
找对应的读写进程:
\# 安装iotop
sudo apt install iotop -y # Ubuntu
sudo dnf install iotop -y # CentOS
\# 启动iotop(按P显示进程PID,按O只显示有I/O活动的进程)
sudo iotop -P -O
输出中 “DISK READ”“DISK WRITE” 列数值高的进程,就是导致磁盘繁忙的 “元凶”(如PID=1234
的mysql
进程频繁写数据)。
3. nmon:性能报表的 “自动生成器”
对于需要输出 “监控报表” 的场景(如给领导汇报、故障复盘),nmon
是最佳选择 —— 它能实时监控 CPU、内存、I/O、网络,还能生成 CSV 格式报表,方便后续用 Excel 或 Python 分析。
(1)安装与启动 nmon
\# Ubuntu安装
sudo apt install nmon -y
\# CentOS安装
sudo dnf install nmon -y
\# 启动nmon(默认显示系统概览)
nmon
(2)核心操作:查看不同资源与生成报表
需求 | 操作 | 说明 |
---|---|---|
查看 CPU 详情 | 按c 键 |
显示各 CPU 核心的使用率、等待时间等 |
查看内存详情 | 按m 键 |
显示内存使用、Swap 使用、缓存情况 |
查看磁盘 I/O 详情 | 按d 键 |
显示各磁盘的读写速度、繁忙百分比 |
查看网络详情 | 按n 键 |
显示各网卡的接收、发送流量 |
生成 CSV 报表 | 启动时加-f -s 5 -c 720 参数 |
nmon -f -s 5 -c 720 :每 5 秒采集 1 次,共 720 次(1 小时),生成 nmon_日期_时间.csv 文件 |
(3)报表分析:用 Excel 可视化
-
找到生成的 CSV 文件(如
nmon_20241025_1400.csv
); -
用 Excel 打开,按 “数据→分列→逗号分隔” 拆分数据;
-
选中 CPU 使用率、内存使用率列,插入 “折线图”,即可直观看到 1 小时内的性能趋势(如 14:30-14:40 CPU 使用率骤升)。
三、调优实战:CPU / 内存 / I/O 瓶颈定位与解决
监控的最终目的是 “解决问题”—— 当发现 CPU、内存、I/O 异常时,需结合进程、内存、网络管理知识,定位瓶颈根源并优化。
1. 瓶颈 1:CPU 使用率 100%(系统卡顿、响应慢)
定位步骤:
-
找高 CPU 进程:用
top
按P
排序,找到%CPU
持续>80% 的进程(如PID=4567
的java
进程); -
看进程是否异常:用
ps aux | grep 4567
查看进程命令(如java -jar app.jar
,是业务应用还是异常脚本); -
查线程级占用:若进程是多线程(如 Java、Nginx),用
pidstat -t -p 4567 2 3
查看线程占用,定位到具体繁忙线程(%CPU
高的线程 ID); -
分析线程用途:Java 进程可结合
jstack 4567
查看线程栈,判断是否有死循环、频繁 GC(垃圾回收)。
解决方法:
-
若为异常进程(如病毒、测试脚本):
sudo kill -9 4567
强制关闭; -
若为业务进程(如 Java 应用):
-
临时:重启进程(
sudo systemctl restart app
)缓解; -
长期:优化代码(如修复死循环、减少 CPU 密集型操作)、升级 CPU 或增加核心数。
-
2. 瓶颈 2:内存泄漏(内存占用持续增长、Swap 频繁使用)
定位步骤:
-
确认内存趋势:用
sar -f sar.log -r
查看内存使用率,若%memused
从 50% 持续涨到 90%,且无下降,怀疑内存泄漏; -
找泄漏进程:用
top
按M
排序,找到%MEM
持续增长的进程(如PID=7890
的python
脚本); -
验证泄漏:用
ps aux --sort=-%mem | grep 7890
观察进程内存变化,1 小时后VSZ
(虚拟内存)、RSS
(物理内存)明显增长,确认泄漏。
解决方法:
-
临时:重启泄漏进程(
sudo kill -15 7890
,正常关闭避免数据丢失); -
长期:排查代码(如 Python 脚本未释放数据库连接、Java 静态集合未清理),或用
valgrind
(C/C++)、jmap+jhat
(Java)分析内存泄漏点。
3. 瓶颈 3:磁盘 I/O 饱和(%util
>90%、读写卡顿)
定位步骤:
-
找繁忙磁盘:用
iostat -x -k
找到%util
高的磁盘(如/dev/sdc
); -
找对应进程:用
iotop -P -O
找到读写该磁盘的进程(如PID=3456
的rsync
备份进程); -
分析 I/O 类型:用
sar -f sar.log -b
查看是 “读多” 还是 “写多”(rtps
高是读瓶颈,wtps
高是写瓶颈)。
解决方法:
-
若为临时任务(如
rsync
备份):调整任务时间(避开业务高峰); -
若为业务进程(如 MySQL):
-
优化存储:将机械盘换成 SSD(提升读写速度 10 倍以上);
-
优化 I/O 操作:MySQL 开启缓存(
innodb_buffer_pool_size
调大)、减少频繁小文件读写(合并成大文件); -
分散 I/O:将数据分散到多块磁盘(如用 LVM 或 RAID 10)。
-
四、避坑指南:3 个监控常见误区
1. 误区 1:只看单一指标,忽略联动分析
表现:看到 CPU 使用率 100%,直接杀死高 CPU 进程,却没发现是磁盘 I/O 饱和导致 CPU 等待(%wa
高)。
正确做法:CPU 异常时,结合vmstat
看%wa
(I/O 等待时间占比),若%wa
>20%,先解决 I/O 瓶颈(如优化磁盘读写),再看 CPU 是否恢复。
2. 误区 2:过度依赖实时监控,不存历史数据
表现:故障发生后,才发现没保存历史数据,无法回溯 “故障前的指标变化”。
正确做法:配置sar
自动采集历史数据(CentOS 默认开启,Ubuntu 需编辑/etc/cron.d/sysstat
,设置5-59/10 * * * * root command -v debian-sa1 > /dev/null && debian-sa1 1 1
,每 10 分钟采集 1 次)。
3. 误区 3:用 “默认阈值” 判断所有系统
表现:认为 “CPU% idle<10% 就是异常”,但数据库服务器正常业务下%idle
常<5%。
正确做法:结合 “业务场景” 定阈值 —— 数据库服务器 CPU 繁忙是常态,重点看%wa
(I/O 等待);Web 服务器则需%idle
≥30%,避免用户访问卡顿。
总结:Linux “健康体检” 核心流程
-
日常巡检:用
htop
看实时状态,用nmon
生成日报表,重点关注 CPU% idle、内存 available、磁盘 % util; -
故障排查:
-
卡顿先看
top
(找高 CPU / 内存进程); -
慢响应查
iostat
(看 I/O 是否饱和); -
历史问题用
sar
回溯(定位故障时段指标);
- 瓶颈调优:CPU 看线程、内存查泄漏、I/O 找磁盘,结合业务场景优化(临时重启 vs 长期代码 / 硬件优化)。
掌握这套 “体检手册”,你就能从 “被动救火” 变成 “主动预防”,让 Linux 服务器始终保持 “健康状态”,减少因性能问题导致的业务中断。