如何诊断占用过多 CPU、内存和 IO 等资源的神秘进程?
下图说明了 Linux 系统中的有用工具。
图片
01 初步排查
1. 查看系统总体状态
- top 或 htop:实时查看 CPU、内存使用情况。
- iotop:查看 IO 使用情况(需要 root 权限)。
- vmstat:检查 CPU、内存、磁盘 IO 等性能指标。
2. 找出占用资源的主要进程
- 使用 ps 查找占用最多资源的进程:
ps aux --sort=-%cpu | head -n 10 # 按 CPU 使用排序
ps aux --sort=-%mem | head -n 10 # 按内存使用排序
- 使用 pidstat 查看进程的 CPU、内存和 IO 使用:
pidstat -p ALL 1
- 使用 lsof 查看特定进程打开的文件描述符
lsof -p <PID>
02 具体分析问题进程
确定高资源使用进程后,进一步诊断其行为。
1. 检查进程是否存在高 CPU 占用
- 使用 perf top 或 perf record(Linux)分析 CPU 热点。
- 使用 strace 查看进程的系统调用:
strace -cp <PID>
- 检查是否存在线程死循环:
top -H -p <PID>
- 查看堆栈信息:
gstack <PID> # Linux
2. 检查内存泄漏或异常
- 使用 pmap 查看进程内存分布:
pmap -x <PID>
- 使用 smem 分析进程的内存使用:
smem -P <ProcessName>
- 检查内存增长趋势:
watch -n 1 cat /proc/<PID>/status
3. 分析 IO 使用
- 使用 iotop 或 iostat 查看磁盘 IO:
iotop -o # 查看 IO 活跃的进程
iostat -x 1 # 查看详细的磁盘 IO 性能
- 使用 strace 查看进程是否频繁调用 IO 系统调用:
strace -p <PID> -e trace=open,read,write,fsync
4. 网络活动分析
- 使用 netstat 或 ss 查看网络连接:
netstat -plant | grep <PID>
- 使用 tcpdump 捕获网络流量:
tcpdump -i eth0 port <PORT>
- 使用 iftop 实时监控网络带宽占用