当服务器突然响应变慢,或是某个应用莫名其妙吃掉大量资源时,大多数人的第一反应是打开top命令。但真实的生产环境排查往往需要更精准的手术刀——不同的性能问题需要不同的诊断工具。本文将带你突破top的局限,掌握五种专业级监控工具的实战组合拳。
遇到性能问题时,先问自己三个关键问题:
需要瞬时快照还是持续追踪?
ps/free适合快速抓取当前状态atop/nmon适合长期记录趋势关注用户进程还是系统级指标?
bash复制# 用户级进程监控首选
htop -u www-data
# 系统级资源分析首选
atop -m
是否需要历史数据对比?
| 工具 | 历史记录 | 采样频率 | 数据粒度 |
|---|---|---|---|
| nmon | 支持 | 可配置 | 系统+进程级 |
| atop | 支持 | 固定 | 详细进程快照 |
| htop | 不支持 | 实时 | 交互式进程视图 |
提示:当需要快速定位内存泄漏时,优先使用
htop的RES内存排序;分析CPU毛刺则用atop的历史回放功能。
除了常见的aux参数,这些组合能快速定位问题:
bash复制# 找出内存增长最快的进程(按RSS变化率排序)
ps -eo pid,user,%mem,rss,comm --sort=-%mem | head -n 10
# 统计Java进程的总内存占用(单位MB)
ps -C java -o rss= | awk '{sum+=$1} END {print sum/1024 "MB"}'
free -m的输出常被误读,关键指标的实际意义:
bash复制# 计算真正可用内存(包含可回收缓存)
awk '/MemAvailable/ {print $2/1024 "MB"}' /proc/meminfo
bash复制sync && echo 3 > /proc/sys/vm/drop_caches
F5展示进程父子关系,轻松发现僵尸进程F4输入STATE=S快速定位休眠进程修改~/.config/htop/htoprc实现:
ini复制highlight_base_name=1
highlight_megabytes=1
bash复制# 显示每个进程的IO等待时间占比
echo "CPUIOWAIT=100*(delayacct_blkio_ticks/(utime+stime))" >> ~/.config/htop/meters
bash复制# 记录每10秒采样一次(持续1小时)
atop -w /tmp/atop.log 10 360
# 回放特定时间点的数据
atop -r /tmp/atop.log -b 14:30 -e 14:45
sys值突增可能预示系统调用过多ST列显示进程是否因内存不足被交换bash复制# 每5秒采集一次,共记录12小时(生成CSV)
nmon -f -s 5 -c 8640 -t
配合nmon_analyser生成包含以下关键视图的报告:
通过脚本监控关键指标变化:
bash复制watch -n 1 'grep -e MemFree -e Buffers -e Cached /proc/meminfo | awk '\''{printf "%s=%.2fMB ",$1,$2/1024}'\'''
重点关注:
Slab异常增长可能预示内核对象泄漏CommitLimit接近Committed_AS时需警惕OOMhtop按内存排序,标记可疑进程atop历史记录确认增长趋势pmap -x <PID>分析进程内存分布bash复制# 捕获CPU使用率前5的进程(每秒刷新)
while true; do
ps -eo pcpu,pid,user,args --sort=-pcpu | head -n 6
sleep 1
done
bash复制# 结合nmon和iotop数据
iotop -o -b -n 5 | awk '/Actual/ {print $12,$10}'