背景与问题
在 Linux 系统的日常运维中,监控进程资源使用情况是最频繁的工作之一。当服务器 CPU 突然飙高、内存告警、或者业务响应变慢时,运维工程师首先要做的事情就是查看系统资源使用状况。top、ps、free 这三个命令几乎是每个运维人员每天都要敲几十遍的工具。
然而,很多初中级运维人员对这些命令的了解仅限于最基本的用法。看到 top 输出满屏的数据,不知道该关注哪几列;执行 ps aux 输出一大堆进程,不知道如何过滤出关键信息;free 显示的内存数值和实际感受对不上,不知道 buffers 和 cache 有什么区别。本文将从系统原理出发,深入讲解这三个命令的完整功能和正确查看方法,让运维人员能够真正读懂系统资源状态,快速定位性能瓶颈。
1 top 命令详解
1.1 top 的基本运行原理
top 是 Linux 下最常用的实时系统监控工具,它周期性地刷新显示系统进程和资源使用信息。理解 top 的运行机制有助于更好地使用它。
top 默认每 3 秒刷新一次数据,可以通过 -d 参数调整刷新间隔。在交互式界面中,可以按 s 键输入新的刷新间隔,按 q 键退出。
top 的数据来源主要是 /proc 文件系统。它读取 /proc/stat 获取 CPU 统计信息,读取 /proc/meminfo 获取内存信息,读取 /proc/*/stat 获取各个进程的 CPU 和内存使用情况。因此,top 本身也是一个普通进程,它的资源消耗(尤其是 CPU)会计入系统统计。
top 在启动时会尝试确定 CPU 核心数,并根据核心数决定默认的显示模式。在多核系统中,按 1 可以展开显示每个核心的单独使用率,这是排查 CPU 负载分布不均问题时的关键操作。
1.2 top 输出字段解析
执行 top 后,屏幕分为两部分:顶部是系统整体资源使用情况的汇总区,下方是进程列表。理解每个字段的含义是正确分析系统状态的前提。
1.2.1 汇总区字段说明
top 顶部汇总区的典型输出如下:
top - 1415 up 45 days, 3:22, 2 users, load average: 1.25, 0.98, 0.85 Tasks: 287 total, 3 running, 284 sleeping, 0 stopped, 0 zombie %Cpu(s): 15.3 us, 2.1 sy, 0.0 ni, 81.2 id, 1.2 wa, 0.0 hi, 0.2 si, 0.0 st MiB Mem : 32768.0 total, 8192.4 free, 16384.0 used, 8191.6 buff/cache MiB Swap: 8192.0 total, 8192.0 free, 0.0 used, 2097152.0 avail Mem
第一行显示系统运行时间和负载均值。up 后面是系统运行时间(45 天 3 小时 22 分);load average 后面三个数字分别表示 1 分钟、5 分钟、15 分钟的平均负载。负载均值表示系统中处于就绪状态(等待 CPU 或正在运行)的平均进程数量。在单核系统上,load average 为 1.0 表示 CPU 满负荷;在多核系统上,满负荷的 load average 等于 CPU 核心数。4 核 CPU 的 load average 为 4.0 表示 CPU 完全饱和。
理解负载均值需要结合 CPU 使用率一起看。如果 CPU 使用率很低但负载均值很高,说明进程可能在等待 I/O(磁盘或网络);如果 CPU 使用率很高且负载均值也很高,说明 CPU 是瓶颈。
第二行显示进程状态统计。total 是进程总数;running 是正在运行的进程数(包含正在使用 CPU 和等待 CPU 的进程);sleeping 是处于睡眠状态的进程数(通常是等待事件);stopped 是被暂停的进程数(收到 SIGSTOP 信号);zombie 是僵尸进程数(已终止但父进程未回收)。
第三行是 CPU 使用率细分,这是排查 CPU 问题的核心数据。us(user space)是用户空间进程消耗的 CPU 时间百分比,是最常见的 CPU 使用来源;sy(system)是内核空间消耗的 CPU 时间,系统调用和内核内部操作会计入此处;ni(nice)是低优先级用户空间进程消耗的 CPU 时间;id(idle)是空闲时间,100% 表示 CPU 完全空闲;wa(wait)是 CPU 等待 I/O 完成的时间比例,如果这个值很高(比如超过 20%),说明进程在等待磁盘或网络 I/O;hi(hardware interrupt)是硬件中断处理消耗的 CPU 时间;si(software interrupt)是软件中断消耗的 CPU 时间;st(steal)是虚拟化环境中被其他虚拟机抢走的 CPU 时间。
第四行和第五行是内存统计。total 是总内存;free 是真正空闲的内存;used 是已使用的内存;buff/cache 是被 buffers 和 cache 占用的内存,它们会在应用程序需要时自动释放;avail Mem 是可用的内存(包括已分配的 cache 可以释放的部分);Swap 行显示交换分区使用情况,used 不为 0 说明物理内存不足。
1.2.2 进程列表字段说明
top 默认按 CPU 使用率排序显示进程列表,每一行代表一个进程,主要字段包括:
PID 是进程 ID,每个运行中的进程都有唯一的 PID。USER 是进程所有者的用户名。PR 是进程的调度优先级,rt 表示实时进程,数值越小优先级越高。NI 是进程的 nice 值,范围是 -20 到 19,数值越小优先级越高。VIRT 是进程使用的虚拟内存总量,包括代码、数据、共享库、已交换出去的内存等。RES 是进程使用的物理内存(Resident Set Size),这是实际占用的 RAM 大小。SHR 是进程使用的共享内存大小。S 是进程状态:D=不可中断的睡眠,R=运行,S=睡眠,T=跟踪/暂停,Z=僵尸。
%CPU 是进程使用的 CPU 百分比,在多核系统上,一个进程使用一个核心的 100% 会显示为 12.5%(8 核系统)。%MEM 是进程使用的物理内存占总量的百分比。TIME+ 是进程累计使用的 CPU 时间,格式为分:秒。COMMAND 是启动进程的命令名。
1.3 top 交互式操作
top 提供了丰富的交互式操作,熟练使用这些快捷键可以大大提高排查效率:
按 h 或 ? 显示帮助菜单。按 q 退出。按 1 展开或折叠 CPU 核心数显示。按 s 修改刷新间隔。按 d 修改刷新间隔(与 s 相同)。按 z 切换彩色显示,提高可读性。按 x 高亮排序列。按 b 高亮运行中的进程(running)。
按 M 按内存使用率排序。按 P 按 CPU 使用率排序(默认)。按 T 按累计 CPU 时间排序。按 R 反向排序(升序变降序)。
按 u 再输入用户名,只显示指定用户的进程。按 i 切换显示空闲进程。按 n 设置最大显示进程数。按 c 显示完整命令行(包括参数)。
按 k 再输入 PID,杀掉指定进程(需要确认)。按 r 重新设置进程优先级(renice)。
按 W 保存当前配置到 ~/.toprc,下次启动时自动应用。
1.4 top 的批量模式和脚本使用
在自动化监控脚本中,需要使用 top 的批量模式获取数据:
# 批量模式:执行一次后退出,每行一个进程 top -b -n 1 # 指定刷新次数和间隔 top -b -n 5 -d 1 > top_output.txt # 只显示指定用户的进程 top -b -n 1 -u www-data # 只显示指定 PID 的进程 top -b -n 1 -p 1234 # 输出指定的字段 top -b -n 1 -o %CPU -e # 结合 head 提取汇总信息和前 20 个进程 top -b -n 1 -o %CPU | head -30
在脚本中提取特定字段需要使用 awk:
# 获取当前 CPU 使用率
top -b -n 1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1
# 获取内存使用率
top -b -n 1 | grep "Mem" | awk '{print $3}' | cut -d'.' -f1
# 获取 top 5 CPU 占用进程
top -b -n 1 -o %CPU | head -12 | tail -6
# 获取指定进程的 CPU 和内存使用率
pid=1234
top -b -n 1 -p $pid | tail -1 | awk '{print $9, $10}'
1.5 top 的配置保存
top 的显示配置可以通过交互式操作调整后保存:
# 在 top 交互界面中按 W 保存配置 # 配置文件位于 ~/.toprc # 示例:查看现有配置 cat ~/.toprc
保存的配置包括刷新间隔、显示字段、排序方式等。下次启动 top 时会自动加载这些设置。
2 ps 命令详解
2.1 ps 命令的三种语法风格
ps 命令支持三种不同的语法风格,这是很多初学者感到困惑的地方。POSIX 标准语法风格使用单个字母选项,前面加短横线;BSD 风格选项不需要短横线;GNU 长选项风格使用两个短横线。
三种风格可以混合使用,但需要注意兼容性:
# POSIX 风格 ps -eo pid,user,%cpu,%mem,comm # BSD 风格(不需要短横线) ps aux # GNU 长选项风格 ps --pid 1234 --format pid,user,%cpu
ps aux 是 BSD 风格最常用的组合:a 显示所有终端上的进程(包括其他用户的进程);x 显示没有控制终端的进程(守护进程);u 显示面向用户的格式(包含用户名、CPU、内存等详细信息)。
2.2 ps 输出字段详解
ps aux 的输出包含多个字段,每个字段都提供进程的重要信息:
ps aux # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND # root 1234 0.1 0.5 123456 7890 ? Ss Jan15 2:34 /usr/sbin/sshd -D
USER 是进程所有者的用户名。PID 是进程 ID。%CPU 是 CPU 使用百分比。%MEM 是内存使用百分比(相对于物理内存)。VSZ 是虚拟内存大小(单位 KB),包括所有映射的内存。RSS 是实际使用的物理内存大小(Resident Set Size),不包括已交换出去的内存。TTY 是进程关联的终端,? 表示没有控制终端(通常是守护进程)。STAT 或 STATE 是进程状态。START 是进程启动时间。TIME 是累计 CPU 时间。COMMAND 是命令名或命令行。
2.3 ps 常用命令组合
ps 命令的强大之处在于可以根据不同需求组合各种选项和过滤器:
# 查看所有进程,显示完整格式 ps -ef ps aux # 查看特定用户的进程 ps -u www-data ps -u www-data -f # 查看特定 PID 的进程 ps -p 1234 ps -p "1234 5678 9012" # 查看特定命令的进程 ps -C nginx ps -C nginx -f # 查看进程的父子关系(进程树) ps -ef --forest ps aux --forest # 查看命令的完整参数 ps -ef | grep nginx ps -eo pid,args # 查看特定进程的线程 ps -L -p 1234 ps -eLf | grep nginx # 查看进程的文件描述符(需要 root) ls -la /proc/1234/fd # 查看进程的环境变量(需要 root) cat /proc/1234/environ | tr '�' ' '
2.4 ps 格式化输出
ps 的 -o 选项允许自定义输出字段,这是编写监控脚本时的常用功能:
# 基本语法:-o field1,field2,... ps -o pid,user,%cpu,%mem,etime,cmd # 常用字段代码: # pid - 进程 ID # user - 用户名 # %cpu - CPU 使用率 # %mem - 内存使用率 # vsz - 虚拟内存大小 # rss - 物理内存大小 # pmem - 内存使用百分比(精确) # pcpu - CPU 使用百分比(精确) # etime - 进程运行时间 # time - 累计 CPU 时间 # cmd - 命令(不带参数) # args - 命令(带完整参数) # comm - 命令名(不含路径) # tty - 控制终端 # stat - 进程状态 # nice - nice 值 # priority - 调度优先级 # 示例:自定义输出格式 ps -eo pid,user,comm,%cpu,%mem,etime,state # 添加列标题 ps -eo pid,user,comm,%cpu,%mem,etime,state --headers # 只显示指定字段 ps -eo pid,args --no-headers
2.5 ps 与其他命令的结合使用
在日常运维中,ps 经常与其他命令结合使用来完成复杂查询:
# 查找 CPU 使用率最高的前 10 个进程
ps aux --sort=-%cpu | head -11
# 查找内存使用率最高的前 10 个进程
ps aux --sort=-%mem | head -11
# 查找特定用户的所有进程
ps -U www-data -u www-data u
# 查找僵尸进程
ps aux | grep Z
# 查找占用内存最多的 Java 进程
ps aux | grep java | sort -k4 -rn | head -5
# 统计某命令的进程数
ps -C nginx | wc -l
pgrep nginx | wc -l
# 查看进程的启动命令和环境
ps eww -p 1234
# 查找孤进程(父进程已终止)
ps -ef | awk '$3 == 1 {print}'
2.6 pgrep 和 pkill
pgrep 和 pkill 是专门用于进程查找和管理的工具,是对 ps 的便捷封装:
# 查找匹配条件的进程 PID pgrep nginx pgrep -u www-data nginx # 查找进程并显示详细信息 pgrep -a nginx # 查找进程并显示完整命令行 pgrep -f "nginx -g daemon" # 查找指定用户的进程数 pgrep -U www-data | wc -l # 杀死匹配条件的进程(默认发送 SIGTERM) pkill nginx # 强制杀死匹配条件的进程 pkill -9 nginx # 只杀死指定用户的进程 pkill -u www-data nginx # 杀死匹配条件并显示被杀死的进程 pkill -ef "python script.py"
3 free 命令详解
3.1 free 的输出解读
free 命令显示系统内存使用情况的汇总信息,是排查内存问题的首选工具:
free -h
输出示例:
total used free shared buff/cache available Mem: 32Gi 12.5Gi 8.2Gi 128Mi 11.3Gi 18.7Gi Swap: 8.0Gi 0B 8.0Gi
total 是物理内存的总容量。used 是已使用的内存量。free 是完全空闲的内存量。shared 是被 tmpfs 文件系统使用的内存(通常很小)。buff/cache 是被 buffers 和 cache 占用的内存,它们是内核用来缓存磁盘数据的,会在应用程序需要时自动释放。available 是应用程序实际可以使用的内存(包括已分配的 cache 可以释放的部分),这是判断系统是否缺内存的最准确指标。
3.2 buffers 与 cache 的区别
理解 buffers 和 cache 的区别对于正确判断内存状态至关重要。
Cache(页面缓存)是内核为了加速文件读取而缓存的磁盘数据。当应用程序读取文件时,内核会把读取的数据缓存在 RAM 中,下次读取同一文件时可以直接从内存返回,避免磁盘 I/O。写入文件时,内核通常先写入 cache,然后异步刷回磁盘。Cache 包括 page cache、dentries、inodes 等。
Buffers(块设备缓存)是用于缓存原始磁盘块的内存,与具体文件无关,主要用于块设备(如磁盘)的元数据缓存。在现代 Linux 内核中,buffers 和 cache 的界限已经模糊,它们被统一管理在 buff/cache 这一项中。
关键理解:buffers 和 cache 占用的内存不是"丢失"的内存,而是内核为了提高 I/O 性能而主动使用的缓存。当应用程序需要更多内存时,内核会自动释放这些缓存,将内存分配给应用程序。这个过程不需要人工干预,也不应该通过人工释放 cache 来"解决"内存问题。
3.3 free 命令的选项
# 以人类可读的格式显示(自动选择 KB/MB/GB) free -h # 以字节为单位显示 free -b # 以 KB 为单位显示 free -k # 以 MB 为单位显示 free -m # 以 GB 为单位显示 free -g # 显示低内存和高内存的统计(废弃选项,仅保留兼容性) free -l # 持续显示,每隔 N 秒刷新一次 free -s 5 free -s 5 -c 10 # 刷新 10 次后退出 # 显示总计行 free -t # 不显示缓存行 free -o
3.4 理解 available 与 free 的区别
available 是 MemAvailable 的值,这是内核 3.14 版本引入的字段,它更准确地反映了应用程序实际可用的内存数量。free 只是完全空闲的内存,但 available 包含了可以被释放的 cache。
例如,一个 32GB 内存的系统,free 显示 8GB,buff/cache 显示 11GB。表面上看 free 只有 8GB,但实际上应用程序还可以使用约 18.7GB(free + 可释放的 cache)。如果仅看 free 字段判断内存够不够用,会得出错误的结论。
3.5 交换空间(Swap)监控
Swap 的使用情况是判断物理内存是否充足的重要指标:
# 查看 swap 使用情况
free -h
swapon -s
# 查看详细的 swap 使用
cat /proc/swaps
# 关闭所有 swap(不推荐,可能导致 OOM)
swapoff -a
# 开启所有 swap
swapon -a
# 查看哪个进程使用了 swap
for f in /proc/*/status; do awk '/VmSwap/{s+=$2}/Name/{n=$2}END{if(s>0)print n,s}' $f; done | sort -k2 -rn | head
正常的 Swap 使用应该是 0 或接近 0。如果 Swap 使用量持续很高(比如几 GB),说明物理内存不足,操作系统在把不活跃的内存页交换到磁盘,这会严重影响性能。
如果发现系统频繁使用 swap,应该:检查是否有内存泄漏的进程;调整应用程序的内存使用配置;增加物理内存;优化应用程序的内存使用。
3.6 /proc/meminfo 详解
free 命令的数据来源是 /proc/meminfo,深入理解这个文件可以更好地理解内存管理:
cat /proc/meminfo
关键字段说明:
MemTotal 是可用的物理内存总量。MemFree 是完全空闲的内存。MemAvailable 是应用程序可用的内存估计值。Buffers 是用于块设备元数据的内存。Cached 是用于文件内容缓存的内存。SwapCached 是已经存在于 swap 空间但被换入到内存的页面(避免二次 I/O)。Active 是活跃的内存(最近使用过且不立即释放)。Inactive 是不活跃的内存(可以被回收)。Shmem 是共享内存(tmpfs)。SReclaimable 是可回收的 slab 内存。SUnreclaim 是不可回收的 slab 内存。Mlocked 是被 mlock() 锁定的内存。
判断内存是否紧缺应该看 MemAvailable 而不是 MemFree。判断是否需要增加内存应该看 swap 使用情况和 Active vs Inactive 的比例。
4 综合排查场景
4.1 场景一:CPU 使用率高排查
当发现 CPU 使用率持续很高时,按以下步骤排查:
第一步,确认是全局 CPU 高还是某个核心高:
# 展开查看每个核心的使用率 top # 按 1
如果只有一两个核心高,说明是单线程程序瓶颈;如果所有核心都高,说明是多个进程或整体负载高。
第二步,确认是用户空间还是内核空间消耗高:
# 查看 CPU 使用率细分 top # 查看 us(用户空间)和 sy(系统空间)的比例
us 高通常是应用程序的计算负载高;sy 高通常是系统调用频繁或 I/O 操作多。
第三步,找到消耗 CPU 的具体进程:
# 按 CPU 使用率排序 ps aux --sort=-%cpu | head -20 # 查看具体进程的线程 ps -p $(pgrep -f nginx) -L -o pid,tid,%cpu,cmd
第四步,分析进程行为:
# 查看进程的打开文件 ls -la /proc/1234/fd # 查看进程的 syscall strace -p 1234 2>&1 | head -50 # 查看进程的堆栈 pstack 1234
4.2 场景二:内存使用率高排查
当发现内存使用率持续很高时:
第一步,确认是进程使用还是 cache 使用:
free -h # 查看 buff/cache 是否很高
如果 buff/cache 很高但 available 仍然充足,说明只是缓存,不算真正的内存紧缺。
第二步,找到消耗内存的具体进程:
# 按内存使用率排序 ps aux --sort=-%mem | head -20 # 查看进程详细信息 ps -eo pid,user,%mem,%cpu,vsz,rss,cmd --sort=-%mem | head -20
第三步,分析进程的内存使用:
# 查看进程的内存映射 pmap -x 1234 # 查看进程的详细内存状态 cat /proc/1234/status | grep -E "Vm|Rss|Pid"
4.3 场景三:Java 进程内存问题排查
Java 进程(Tomcat、Spring Boot 等)有特殊的内存模型,需要专门分析:
# 查看 Java 进程的内存使用(RSS) ps aux | grep java # 查看 JVM 堆内存使用(需要 jstat 或 jcmd) jstat -gc 1234 # 查看 JVM 内存池 jcmd 1234 GC.heap_info # 分析 heap dump(需要先生成 dump) jmap -dump:format=b,file=heap.bin 1234
4.4 场景四:进程僵死(hung)排查
当进程不响应请求但不消耗 CPU 时:
# 查看进程状态
ps -eo pid,stat,args --sort=stat | grep D
# 查看 D 状态进程(不可中断的睡眠)
ps aux | awk '$8~/D/ {print}'
# 查看进程的等待事件
cat /proc/1234/wchan
# 查看进程的堆栈
cat /proc/1234/stack
D 状态(Uninterruptible Sleep)通常表示进程在等待 I/O(磁盘、网络)或内核事件。这种状态不应该持续很久,如果持续很久(比如几分钟),可能是 I/O 子系统出了问题。
4.5 场景五:僵尸进程排查
僵尸进程是已终止但父进程未回收的进程:
# 查找僵尸进程
ps aux | awk '$8=="Z" {print}'
# 查看僵尸进程的父进程
ps -ef | awk '$3==1234 {print}' # 1234 是僵尸进程的 PID
# 找到所有僵尸进程及其父进程
ps -eo pid,stat,ppid,args | awk '$2~/Z/ {print}'
# 杀死僵尸进程的父进程(谨慎操作)
kill -9 <父进程PID>
僵尸进程本身不消耗资源(已释放所有内存),但会占用 PID 和进程表空间。如果系统中有很多僵尸进程,可能是应用程序有 bug 导致父进程没有正确调用 wait() 回收子进程。
5 自动化监控脚本示例
5.1 系统资源监控脚本
#!/bin/bash
# system_monitor.sh - 系统资源监控脚本
LOG_DIR="/var/log/monitor"
DATE=$(date +%Y%m%d)
LOG_FILE="${LOG_DIR}/monitor_${DATE}.log"
# 创建日志目录
mkdir -p $LOG_DIR
# 记录时间戳
echo "=== System Monitor Report: $(date) ===" >> $LOG_FILE
# CPU 使用情况
echo "" >> $LOG_FILE
echo "--- CPU ---" >> $LOG_FILE
top -bn1 | grep "Cpu(s)" >> $LOG_FILE
echo "Top 5 CPU processes:" >> $LOG_FILE
ps aux --sort=-%cpu | head -6 >> $LOG_FILE
# 内存使用情况
echo "" >> $LOG_FILE
echo "--- Memory ---" >> $LOG_FILE
free -h >> $LOG_FILE
echo "Top 5 Memory processes:" >> $LOG_FILE
ps aux --sort=-%mem | head -6 >> $LOG_FILE
# 磁盘 I/O 情况
echo "" >> $LOG_FILE
echo "--- Disk I/O ---" >> $LOG_FILE
iostat -x 1 1 2>/dev/null >> $LOG_FILE || echo "iostat not available" >> $LOG_FILE
# 网络连接情况
echo "" >> $LOG_FILE
echo "--- Network Connections ---" >> $LOG_FILE
netstat -an | awk '/^tcp/ {s[$NF]++} END {for(k in s) print k, s[k]}' >> $LOG_FILE
# Load Average
echo "" >> $LOG_FILE
echo "--- Load Average ---" >> $LOG_FILE
uptime >> $LOG_FILE
echo "Log saved to: $LOG_FILE"
5.2 告警脚本
#!/bin/bash
# alert.sh - 资源告警脚本
# 告警阈值
CPU_THRESHOLD=80
MEM_THRESHOLD=85
DISK_THRESHOLD=90
# 检查 CPU
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
echo "ALERT: CPU usage is ${CPU_USAGE}% (threshold: ${CPU_THRESHOLD}%)"
fi
# 检查内存
MEM_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100}')
if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
echo "ALERT: Memory usage is ${MEM_USAGE}% (threshold: ${MEM_THRESHOLD}%)"
fi
# 检查磁盘
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1)
if [ "$DISK_USAGE" -gt "$DISK_THRESHOLD" ]; then
echo "ALERT: Disk usage is ${DISK_USAGE}% (threshold: ${DISK_THRESHOLD}%)"
fi
# 检查 swap
SWAP_USED=$(free | grep Swap | awk '{print $3}')
if [ "$SWAP_USED" -gt 0 ]; then
echo "WARNING: Swap is being used (${SWAP_USED} KB)"
fi
5.3 进程分析脚本
#!/bin/bash # process_analyzer.sh - 进程资源分析脚本 TARGET_PID=$1 if [ -z "$TARGET_PID" ]; then echo "Usage: $0" exit 1 fi if [ ! -d "/proc/$TARGET_PID" ]; then echo "Process $TARGET_PID not found" exit 1 fi echo "=== Process Analysis: PID $TARGET_PID ===" # 基本信息 echo "" echo "--- Basic Info ---" ps -p $TARGET_PID -o pid,ppid,user,%cpu,%mem,time,cmd # 内存详情 echo "" echo "--- Memory Details ---" pmap -x $TARGET_PID | tail -1 # 线程数 echo "" echo "--- Thread Count ---" ps -p $TARGET_PID -o nlwp # 打开的文件描述符 echo "" echo "--- Open Files Count ---" ls /proc/$TARGET_PID/fd 2>/dev/null | wc -l # 环境变量(部分) echo "" echo "--- Key Environment Variables ---" cat /proc/$TARGET_PID/environ 2>/dev/null | tr '�' ' ' | grep -E "HOME|PATH|JAVA_HOME|NGINX" | head -10 # 内存映射 echo "" echo "--- Memory Mappings ---" cat /proc/$TARGET_PID/maps | awk '{print $6}' | sort -u | head -20
6 结论
top、ps、free 是 Linux 运维工程师最常用的三个监控命令,每个命令都有其特定的使用场景和优势。top 适合实时监控和交互式分析,可以持续观察系统状态的变化;ps 适合获取特定时刻的进程快照,便于脚本化和精确查找;free 适合分析内存使用状况。
理解这些命令输出字段的含义是正确判断系统状态的前提。特别需要注意:top 和 ps 的 CPU 使用率是采样瞬间的值,不完全等同于 CPU 的平均使用率;free 的 buff/cache 不是"浪费"的内存,而是内核主动管理的缓存;available 是判断应用程序可用内存的最准确指标,而不是 free。
实际排查中,应该综合使用这三个命令,结合 /proc 文件系统提供的信息,形成对系统状态的完整判断。养成良好的监控和分析习惯,才能在系统出现问题时快速定位根因。
参考资料:
man top
man ps
man free
/proc/meminfo 文档
man proc(proc 文件系统说明)
全部0条评论
快来发表一下你的评论吧 !