Skip to content

一、生产排障痛点 ​

在 Linux 生产节点或压测环境中,当收到系统告警或发现某个核心微服务(如 Java 网关、Python 压测客户端、数据库守护进程)响应迟缓时,直接敲 top 会列出成百上千个无关进程,屏幕不断刷新,极难聚焦目标。

掌握针对单一进程的深度资源监控与内存/CPU 状态透视,是精准定位性能瓶颈的必备技能。


二、精准监控单一进程:top -p <PID> ​

通过 ps -ef | grep <service_name> 确定服务的进程 ID(PID)后,使用 -p 参数单独锁定该进程:

bash
top -p 19496

此时终端界面将只刷新该指定进程的资源利用率,按 q 即可退出。

核心列参数深度解读: ​

字段名全称与含义排查指导意义
VIRTVirtual Memory(虚拟内存)进程申请分配的虚拟地址空间总大小(含动态库、未实际分配物理页的申请)。VIRT 很大通常不需要惊慌
RESResident Memory(常驻物理内存)最关键指标! 进程当前物理内存的真实实际占用量(单位通常为 KB/MB),也是排查 OOM 风险的核心标准
SHRShared Memory(共享内存)该进程与其他进程共享的公共动态链接库或内存段大小
%CPUCPU 使用率百分比多核计算机制:单个逻辑 CPU 核心跑满为 100%;在一台 32 核 64 线程的服务器上,多线程程序最大 CPU 上限可达 6400%
%MEM物理内存使用率进程占用的物理常驻内存与服务器总可用物理内存的比值
SProcess Status(进程状态)S(Sleeping 休眠等待)、R(Running 运行中)、Z(Zombie 僵死)

三、静态快照审查:ps aux 与管道过滤 ​

ps aux 提供了瞬间的静态快照,特别适合在自动化巡检脚本中抓取指标:

bash
ps aux | grep 19496
# 输出格式:
# USER       PID %CPU %MEM    VSZ    RSS TTY      STAT START   TIME COMMAND
# deployer 19496 45.2  3.8 4826152 1603360 ?      Sl   08:23 503:15 java -jar app.jar
  • RSS(Resident Set Size):等同于 top 中的 RES,以 KB 为单位显示物理内存占用;
  • STAT 中的修饰符:
    • l:该进程具备多线程(Multi-threaded);
    • s:该进程是会话领导者(Session leader)。

四、最底层的终极透视:/proc/<PID>/status ​

当需要在无任何额外工具包的纯净生产环境(如极简 Docker 镜像)中获取更深度的内存与线程详情时,Linux 的虚拟文件系统 /proc 是终极事实来源:

bash
cat /proc/19496/status

生产排查中最核心关注的字段: ​

text
Name:   java                         # 进程名称
State:  S (sleeping)                 # 进程当前状态
Tgid:   19496                        # 线程组 ID
Threads: 148                         # 当前进程内部创建的真实活跃线程总数(排查线程泄露关键)
VmPeak:  5242880 kB                  # 该进程历史运行中达到的最大虚拟内存峰值
VmSize:  4826152 kB                  # 当前占用的虚拟内存
VmRSS:   1603360 kB                  # 当前实际占用的常驻物理内存(约 1.53 GB)
RssAnon: 1548200 kB                  # 堆内存与匿名页面分配量
VmSwap:        0 kB                  # 关键:被置换到磁盘 Swap 分区的容量。若 > 0 说明物理内存不足

通过定期监控 Threads 与 VmRSS,可以非常直观地识别出 Java 线程池未释放、Python 对象未被 GC 回收所导致的**内存泄露(Memory Leak)**曲线。

测试开发工程师 · 专注自动化与系统架构 | 邮箱: hansblog@atumsoul.win