来源:improve everyday | 发布日期:2026-05-22
Linux 服务器性能排查实战手册
五条排查原则: 先整体后局部,先 CPU 后内存,IO 网络配合看。vmstat/iostat 摸全局 → 确定问题类型 → 逐层深入 → 交叉验证 → 找到根因再处置。
快速摸底三板斧
60 秒快速摸底三连
# 1. 看负载 — load > CPU 核心数说明有资源争抢
uptime
# 10:30:05 load average: 12.85, 10.21, 8.10
# 2. 看全局 — 一屏掌握 CPU/内存/IO/Swap
vmstat 2 5
# r b swpd free buff cache si so bi bo in cs us sy id wa
# 2 0 0 2048 123 789 0 0 50 100 500 1000 10 5 80 5
# 3. 查 CPU 核心数(判断负载是否过高的基准)
nproc
四个关键信号
- r(运行队列) 持续 > CPU 核心数 × 4 → CPU 资源争抢严重
- wa(IO 等待)> 20% → 磁盘或网络 IO 瓶颈
- si/so(Swap 换页) 持续不为 0 → 内存真实不足
- id(空闲率) 持续低于 30% → 需关注
详细的多维排查方案参见 server-performance-four-dimensions(CPU/内存/磁盘/网络/文件系统五维深度解析)。
四大瓶颈快速排查
CPU 瓶颈
# 定位高 CPU 进程
ps aux --sort=-%cpu | head -10
# 查看进程内所有线程
top -H -p <PID>
# 跟踪系统调用
strace -p <PID> -c
判断: us 高 + sy 低 = 业务代码密集计算;wa 高 = 进程在等 IO;hi/si 高 = 网络/存储中断异常。
内存瓶颈
# 看 available,不是 free
free -h
# 内存泄漏检测:监控 RSS 是否持续增长
for i in {1..20}; do ps -o pid,rss,vsz,comm -p <PID>; sleep 10; done
# 查看哪些进程占用了 Swap
for f in /proc/*/status; do awk '/VmSwap/{print FILENAME,$2,$3}' $f; done | sort -k2 -n -r | head -10
磁盘 IO 瓶颈
iostat -x 2 5
# 定位 IO 最多的进程(需 root)
iotop -o
# 查看进程打开了哪些文件
lsof -p <PID>
# 查看目录空间占用
du -sh /var/log/* | sort -rh | head -10
%util = 100% → 设备已饱和;await HDD <20ms,SSD <1ms;aqu-sz > 1 → IO 排队。
网络瓶颈
# 网络连接概览
ss -s
# 统计各 TCP 状态连接数
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
# 查看哪些 IP 连接最多
netstat -an | awk '/^tcp/{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
# 监控网卡实时流量
iftop -i eth0
生产事故速查(3 个典型案例)
CASE 01:Java Full GC 导致接口飙升至 8s
现象: 促销期间接口响应从 200ms 飙升到 8s。
top看 CPU 不高,但 load average 异常偏高jstat -gc <PID> 1000发现每次 Full GC 耗时 > 2sjmap -heap <PID>确认老年代使用率 > 95%
根因: JVM heap 配置 8GB,GC 扫描区域过大。
修复: 降 heap 至 4GB,切换 G1GC;设 MaxGCPauseMillis=200。
CASE 02:Nginx 502 Bad Gateway
现象: 网站突然全线返回 502。
netstat发现 80 端口连接数超 60000- 排查发现 PHP-FPM 仅 50 个 worker
pm.max_children = 50严重不足
根因: PHP-FPM 进程数严重不足,请求大量排队。
修复: max_children 调至 200;配合 Nginx keepalive 200 优化连接复用。
CASE 03:MySQL 慢查询导致首页加载 10s
现象: 论坛首页加载 10s,数据库有查询跑了 5 分钟。
SHOW PROCESSLIST发现多条 SQL 运行超 30sEXPLAIN确认posts表全表扫描,无索引- 开启
slow_query_log,long_query_time=2
根因: posts 表缺少 (user_id, created_at) 联合索引。
修复: 低峰期 ALTER TABLE 添加索引;响应时间恢复 < 200ms。
高频优化参数速查
/etc/sysctl.conf — 内核参数
# TCP 优化
net.ipv4.tcp_syncookies = 1 # 防 SYN Flood
net.ipv4.tcp_tw_reuse = 1 # TIME_WAIT 复用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
# 内存优化
vm.swappiness = 10 # 降低 Swap 倾向
vm.dirty_background_ratio = 5
# 文件描述符
fs.file-max = 65535
/etc/security/limits.conf — 进程限制
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
内核参数完整调优方案参见 linux-kernel-tuning-production 和 linux-kernel-tuning-guide。
监控告警阈值参考
| 指标 | 阈值 | 说明 |
|---|---|---|
| load average | 持续 > CPU 核心数 × 0.8 | CPU 资源趋于饱和 |
| 内存使用率 | > 85%(available 维度) | 关注 available 而非 free |
| 磁盘使用率 | > 80% | 提前清理或扩容 |
| CPU iowait | > 20% | IO 瓶颈 |
| %util(磁盘) | > 80% | 设备趋于饱和 |
| SYN_RECV 连接数 | 突增且 > 5000 | 疑似 DDoS 攻击 |
关联链接
- server-performance-four-dimensions — 服务器性能五维排查(深度综合版)
- linux-server-load-case-study — 服务器负载过高排查
- linux-kernel-tuning-guide — Linux 高并发内核优化手册
- linux-kernel-tuning-production — 生产环境内核参数调优
- cpu-spike-troubleshooting-guide — CPU 飙高排查指南
- linux-load-high-cpu-low-troubleshooting — Load 高但 CPU 低排查
关联页面
| 页面 | 关联点 |
|---|---|
| linux-filesystem-directory-structure-guide | Linux FHS 文件系统目录结构详解 — 含各目录用途、运维排查路径速查、磁盘分区方案 |