Linux 系统性能监控与瓶颈排查

📖 知识点简介

服务器出问题,能最快定位根因的能力就是性能监控。Linux 自带了一套性能诊断工具链,覆盖 CPU、内存、磁盘 IO、网络四大维度。掌握这些命令,可以在不装任何第三方工具的情况下,快速回答:「系统到底卡在哪?」


🛠 核心命令整理

1. CPU 监控

命令 用途 示例
top 实时查看进程 CPU/内存占用 top -bn1 一次性输出
htop top 增强版(需安装) 交互更友好
mpstat -P ALL 1 每核 CPU 使用率,每秒刷新 排查单核打满
uptime 显示负载均值 load average load > CPU核数 → 过载

top 关键字段说明:

  • us --- 用户态 CPU 占比
  • sy --- 内核态 CPU 占比(过高说明系统调用密集)
  • wa --- I/O 等待(过高 → 磁盘有瓶颈)
  • id --- 空闲百分比
  • st --- 被虚拟机偷走的 CPU(VM 环境常见)

2. 内存监控

命令 用途 关键参数
free -h 查看内存总量/已用/可用 -h 人类可读
vmstat 1 5 每 1 秒采样 5 次,含内存&CPU si/so 是 swap 换入/换出
cat /proc/meminfo 内存细粒度信息 含 PageCache、Slab 等

CPU + 内存二合一: vmstat 1

text 复制代码
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 123456  1024 456789    0    0    12    34  567  890 12  3 85  0  0
  • r:正在运行的进程数(CPU 排队),大于 CPU 核数说明 CPU 是瓶颈
  • b:阻塞在 I/O 的进程数(磁盘或网络)
  • si / so:swap 换入/换出,持续不为 0 → 内存不足

3. 磁盘 I/O 监控

命令 用途 关键参数
iostat -x 1 磁盘 I/O 详细报告 -x 扩展输出,1 每秒刷新
iotop 实时看哪个进程在疯狂 IO 需 root
df -h 磁盘空间使用率
du -sh * 当前目录大小排序 配合 sort -hr 使用
lsblk 查看块设备挂载关系

iostat 关键指标(关注点):

  • %util --- 磁盘繁忙率(> 80% 为瓶颈)
  • r/s + w/s --- 每秒读写次数(IOPS)
  • rkB/s + wkB/s --- 每秒吞吐量
  • await --- I/O 平均等待时间(ms),越大越慢
  • svctm --- I/O 服务时间(越接近 await 说明磁盘本身慢)

4. 网络监控

命令 用途 关键参数
ss -tuln 查看监听端口(替代 netstat) -t TCP, -u UDP
sar -n DEV 1 网卡流量实时统计
iftop 进程级别带宽占用 需安装
ping -c 10 延迟与丢包检测

5. 历史回溯(sar 神器)

sar 是 sysstat 包提供的系统活动报告器,可以回溯过去的数据。

bash 复制代码
# 查看今天整天的 CPU 使用率
sar -u

# 查看内存使用
sar -r

# 查看磁盘 I/O
sar -b

# 查看网络流量
sar -n DEV

💡 排查顺序建议: CPU 负载 → 内存使用 → 磁盘 I/O → 网络 → 应用日志 --- 逐层排查,不要跳跃。


🔧 实操示例:5 分钟定位服务器卡顿

场景: 接到告警,某 Web 服务器响应变慢,SSH 进去操作有延迟感。

bash 复制代码
# 第一步:看整体负载
uptime
# 输出:load average: 8.12, 6.34, 3.21  → 8核CPU,负载超8,异常

# 第二步:看 CPU 分布
top -bn1 | head -5
# wa 飙到 35% → I/O 瓶颈

# 第三步:查磁盘 I/O
iostat -x 1 3
# sda:  %util 92%, await 450ms → 磁盘扛不住了

# 第四步:定位哪个进程在写磁盘
iotop -o -P
# 发现 mysqld 进程正在大量写数据

# 第五步:确认 mysql 具体问题
mysql -e "SHOW PROCESSLIST;"
# 发现一条慢查询锁表导致大量写入

# 结论:慢 SQL 锁表 → 数据库夯住 → 磁盘写入堆积 → 系统响应变慢

⚠️ 常见坑点 & 注意事项

  1. free -m 看到的 used 不等于真实占用 --- Linux 用空闲内存做缓存(buff/cache),当应用需要时内核会释放,所以看 available 列而不是 free 列
  2. top 的 %CPU 可能超过 100% --- 这是多核累加值,单进程跑满 8 核显示 800%
  3. 磁盘 %util 到 100% 不一定是瓶颈 --- SSD 高 IOPS 场景下 100% 持续是正常的,要结合 await 看(超过 50ms 才报警)
  4. vmstat 的 r 列 > CPU 核数 × 2 --- 说明 CPU 排队严重,需要扩容或优化
  5. 不要只看瞬时值 --- 用 sar 看趋势,或者用 vmstat 1 10 看 10 个采样点的平均值
  6. 别忘了系统日志 --- dmesg | tail 和 /var/log/messages 经常藏着 OOM、磁盘 I/O error 等关键线索

💡 一句话总结: 性能排查三板斧 --- uptime 看负载,top 看分布,iostat / vmstat 定维度。找到短板,对症下药。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
大勇前进3 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu3 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile3 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白803 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙3 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端
盖伦发发3 天前
软件工程SOLID 五大设计原则
后端·软件工程