Linux top/ps 命令实战:5分钟定位CPU 100%与内存泄漏的进程
Linux性能排查实战:5分钟精准定位CPU满载与内存泄漏进程
当服务器突然响应迟缓,终端操作卡顿,或是监控系统频频告警,作为运维工程师或开发者的你该如何快速锁定问题根源?本文将带你深入Linux系统性能排查的核心战场,聚焦top和ps这对黄金组合的实战技巧,通过真实案例演示如何像专业侦探一样抽丝剥茧,在5分钟内精准定位CPU 100%占用和内存泄漏的元凶进程。
1. 性能危机预警:识别异常的关键指标
在开始排查前,我们需要明确几个关键指标的含义及其危险阈值:
- CPU负载:运行队列中等待CPU资源的进程数。当1分钟负载值持续超过CPU核心数的70%时需警惕
- 内存使用:重点关注
available而非free字段,当可用内存低于总内存10%时可能出现OOM - 交换分区:频繁的swap in/out操作是内存不足的明显信号
快速检查系统整体状态:
# 查看核心指标概览 uptime && free -h && df -h # 示例输出: # 16:30:01 up 23 days, 4:32, 2 users, load average: 3.21, 2.89, 2.45 # total used free shared buff/cache available # Mem: 15G 8.2G 512M 1.2G 6.3G 5.4G # Swap: 2.0G 1.7G 300M注意:当
available内存接近耗尽时,系统会开始使用swap空间,此时性能将急剧下降。而CPU负载持续高于核心数2倍以上时,说明系统已过载运行。
2. CPU满载排查:定位贪婪的进程
2.1 实时监控利器:top命令进阶用法
启动基础监控:
top -c关键操作技巧:
- 按1:展开显示每个CPU核心的详细利用率
- 按P:按CPU使用率降序排列(默认)
- 按M:按内存使用量降序排列
- 按z:切换彩色/黑白显示
- 按x:高亮显示排序列
典型异常场景分析:
| 现象 | 可能原因 | 验证命令 |
|---|---|---|
| 用户空间CPU高 | 应用程序异常循环 | perf top -p <PID> |
| 系统空间CPU高 | 系统调用频繁/上下文切换 | pidstat -w 1 |
| 软中断CPU高 | 网络包处理瓶颈 | watch -n1 'cat /proc/softirqs' |
| IO等待高 | 磁盘性能瓶颈 | iostat -x 1 |
2.2 进程快照分析:ps命令组合拳
当需要保存进程状态快照时,ps命令更胜一筹:
# 抓取CPU消耗Top10进程 ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu | head -n 11 # 抓取内存消耗Top10进程 ps -eo pid,user,%cpu,%mem,cmd --sort=-%mem | head -n 11实用过滤技巧:
# 统计Java进程资源占用 ps -e -o pid,user,cmd,%cpu,%mem | grep java # 查看特定用户的进程资源 ps -U www-data -o pid,%cpu,%mem,cmd3. 内存泄漏追踪:发现隐藏的内存黑洞
3.1 内存监控三板斧
方法一:top动态观察
- 启动top后按
M按内存排序 - 关注
RES列(实际物理内存占用) - 记录可疑进程PID
方法二:pmap深度分析
pmap -x <PID> | tail -n 1 # 输出示例: # total kB 1036824 978632 919288最后一行显示该进程占用的总内存、RSS(驻留集大小)和私有内存。
方法三:smem专业统计
smem -p -P nginx # 输出示例: # PID User Command Swap USS PSS RSS # 1234 www-data nginx: worker process 124.4K 12.3M 13.1M 15.6M- USS:独占内存(最准确的内存泄漏指标)
- PSS:按比例计算的共享内存
- RSS:总物理内存占用
3.2 内存泄漏特征判断
- 时间序列对比法:
# 每隔10秒记录一次进程内存 while true; do ps -p <PID> -o %mem= >> mem.log sleep 10 done如果内存占用呈单调递增趋势,基本可判定存在泄漏。
- 内存类型分析:
cat /proc/<PID>/smaps | grep -E '^(Size|Rss|Pss)'重点观察哪些内存段在持续增长。
4. 高级诊断工具链
4.1 perf性能分析
# 采样CPU使用情况 perf top -p <PID> # 记录调用图 perf record -g -p <PID> -- sleep 30 perf report4.2 内存泄漏检测神器:valgrind
valgrind --leak-check=full --show-leak-kinds=all ./your_program4.3 自动化监控脚本
#!/bin/bash CRITICAL=90 # CPU阈值% while true; do PID=$(top -bn1 | grep -E "^\s*[0-9]" | awk '$9>'"$CRITICAL"'{print $1; exit}') if [[ -n "$PID" ]]; then echo "[$(date)] CPU超过${CRITICAL}%的进程:" >> /var/log/cpu_monitor.log ps -fp $PID >> /var/log/cpu_monitor.log pstack $PID >> /var/log/cpu_monitor.log fi sleep 30 done5. 实战案例库
案例1:Java应用CPU 100%
现象:某Java服务CPU持续满载排查:
top -p <java_pid>发现单个线程CPU占用99%jstack <pid> | grep -A10 <nid>定位到GC线程疯狂运行jstat -gcutil <pid>确认老年代内存已满解决:调整JVM参数,增加堆内存
案例2:Nginx内存泄漏
现象:Nginx worker进程内存缓慢增长排查:
smem -P nginx确认USS持续增长gdb -p <pid>分析内存分配- 发现第三方模块未释放共享内存解决:升级问题模块版本
案例3:内核态CPU占用高
现象:系统CPU使用率80%以上排查:
perf top显示__alloc_pages占用高sar -B发现major fault激增- 确认某进程频繁mmap大文件解决:优化文件访问模式
6. 性能优化速查表
CPU问题排查路径:
top → pidstat → perf → strace → 代码优化内存问题排查路径:
top → pmap → smem → valgrind → 代码修复常用命令速查:
| 场景 | 命令组合 |
|---|---|
| 快速定位CPU问题 | top -c → 按1 → 按P |
| 统计进程内存 | ps -eo pid,cmd,%mem --sort=-%mem | head |
| 分析线程栈 | pstack <pid>或gdb -p <pid> → thread apply all bt |
| 监控系统调用 | strace -p <pid> -c |
| 网络连接分析 | ss -tnap | grep <pid> |
当面对突发的性能问题时,保持冷静、系统性地排查是关键。记住这个黄金法则:先整体后局部,先监控后分析,先复现后优化。掌握这些工具和思路,你就能在5分钟内快速定位大多数CPU和内存问题,从被动救火转向主动防御。
