Linux 进程异常占用资源排查

2次阅读

定位linux异常进程需先查cpu、内存、io占用:用top/htop或ps aux排序找高占比进程,pidstat观察波动;free和smem查内存,proc/pid/status确认真实占用;iostat和iotop定位io瓶颈;再用strace、lsof、proc/pid/stack分析行为根因。

Linux 进程异常占用资源排查

Linux 进程异常占用资源时,需快速定位是哪个进程、占什么资源(CPU、内存、IO)、为什么占用,再针对性处理。关键不是“杀进程”,而是“看懂它在干什么”。

看 CPU 占用最高的进程

tophtop(推荐安装)实时查看:按 P 按 CPU 使用率排序,重点关注 %CPU 列持续 >80% 的进程。注意区分是单核满载还是多核均衡——比如 4 核机器上一个进程占 300%,实际已压满 3 个核。

更精准可执行:

  • ps aux –sort=-%cpu | head -n 11:列出 CPU 占用前 10 的进程,含用户、PID、命令全路径
  • pidstat -u 1:每秒刷新一次各进程 CPU 使用明细,适合观察波动

查内存疯涨的元凶

内存异常常表现为系统变慢、频繁 swap、OOM Killer 启动(dmesg 可见日志)。先看整体:free -h 看可用内存是否持续逼近 0;再聚焦进程:

  • ps aux –sort=-%mem | head -n 11:按内存占比排序,注意 RSS(物理内存占用)和 VSZ(虚拟内存大小)的区别
  • smem -s rss -r | head -n 10:更准确统计实际物理内存占用(考虑共享内存去重),需安装 smem
  • 对可疑 PID,查 cat /proc//status | grep -E “VmRSS|VmSize|MMUPageSize”,确认是否真在吃内存,还是 mmap 大文件未真正加载

揪出卡死磁盘 IO 的进程

系统响应迟缓但 CPU 和内存不高?大概率是 IO 等待(%wa 在 top 中偏高)。用以下方式定位:

  • iostat -x 1:观察 %util(设备忙时百分比)和 await(IO 平均等待毫秒),若 %util 接近 100 且 await >100ms,说明磁盘瓶颈
  • iotop -o:只显示正在做 IO 的进程,按 IO 速率排序,看清是读(READ)、写(WRITE)还是交换(SWAPIN)
  • 对具体进程,cat /proc//io 查读写字节数、sysc 调用次数,判断是否频繁小 IO 或大块顺序写

深入分析进程行为(不重启、不中断)

找到问题进程后,别急着 kill,先采集上下文:

  • strace -p -e trace=write,read,open,close -s 128:抓其系统调用,看在读写哪些文件、是否死循环 open/close
  • lsof -p :列出打开的所有文件、socket、管道,检查是否有大量句柄未释放(如日志轮转失败、连接泄漏)
  • cat /proc//stack:查看内核态调用(需 root),判断是否卡在某个系统调用(如 uninterruptible sleep 状态 D 状态)
  • 结合 journalctl -u –since “1 hour ago” 或应用自身日志,交叉验证行为是否符合预期

排查不是一锤子买卖。同一进程反复异常,往往暴露配置错误、代码缺陷或资源限制不合理。记录下每次的 pidstat/iostat/strace 输出,对比变化,才能从“救火”走向“防火”。

text=ZqhQzanResources