ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux top命令从入门到精通:运维排查实战指南

Linux top命令从入门到精通:运维排查实战指南 1. 为什么每个运维人都绕不开 top 这个命令刚入行那会儿服务器一卡带我的师傅第一句话永远是先 top 看一眼。当时觉得这命令界面花花绿绿、数字跳来跳去完全看不懂只会盯着最上面那行 load average 发呆。后来踩的坑多了才明白top是 Linux 系统里少数几个能让你在三十秒内判断出这台机器到底怎么了的工具。它不像ps那样只给你一张静态快照也不像htop那样需要额外安装几乎任何一台 Linux 机器——从你本地跑的虚拟机、云上的服务器到嵌入式设备——敲下去就能用。这篇文章我想把top从里到外讲透。不是那种把 man 手册翻译一遍的讲法而是结合我这些年排查线上问题、处理服务器 OOM、定位 CPU 飙高进程的真实经验把每一列数字背后的含义、每一个交互按键的用途、以及那些文档里不会写的坑都摊开来说。适合刚接触 Linux 的新手建立完整的认知框架也适合有一定基础的运维、后端、嵌入式开发者拿来当速查手册。看完之后你至少能做到机器一卡不用慌top一开问题定位方向心里有数。需要先说明一点top的界面在不同发行版、不同版本procps 和 procps-ng之间会有细微差异字段名称、排序方式、颜色高亮都可能不一样。我下面讲的内容以主流的 procps-ng 版本Ubuntu 20.04、CentOS 7、Debian 11 默认带的那个为准遇到差异我会单独点出来。2. top 的整体设计思路与界面拆解2.1 它到底在监视什么top的本质是一个周期性采样的进程查看器。它默认每 3 秒刷新一次从/proc文件系统里读取内核暴露出来的运行状态然后重新计算、排序、渲染到终端上。这里有个关键点很多人没意识到top自己并不知道系统状态它只是个搬运工真正的数据源是/proc/stat、/proc/meminfo、/proc/[pid]/stat这些虚拟文件。理解了这一点你就能明白为什么top的某些数值和free、vmstat对不上——因为采样时刻和计算口径不同。它解决的问题很直接在一个屏幕上同时看到系统整体负载和具体是哪个进程在捣乱。uptime只告诉你负载高ps只给你进程列表而top把这两者揉在一起还支持实时排序和交互操作。这就是它几十年不倒的原因。2.2 界面从上到下分五块第一次打开top界面其实分成五个区域我按从上到下的顺序拆第一行是系统概览包含当前时间、系统已运行时长、登录用户数、以及三个 load average 值1 分钟、5 分钟、15 分钟平均负载。这三个数字是判断系统压力的第一手资料后面会专门讲怎么读。第二行是进程统计告诉你总共有多少个进程、多少个在运行running、多少个在睡眠sleeping、多少个已停止stopped、多少个僵尸zombie。僵尸进程数量是个重要信号非零就值得警惕。第三行是 CPU 状态这是信息量最大的一行。它把 CPU 时间拆成 us用户态、sy内核态、ni低优先级用户态、id空闲、wa等待 IO、hi硬中断、si软中断、st被虚拟化偷走的时间几个部分。每个值的含义和排查用途我在第 3 章详细展开。第四行和第五行是内存和交换分区分别显示物理内存和 swap 的总量、已用、空闲、缓存大小。这里最容易踩的坑就是把已用内存当成真实占用其实 buff/cache 那部分是可以被回收的。再往下就是进程列表默认按 CPU 占用降序排列每行一个进程包含 PID、用户、优先级、CPU 占用、内存占用、运行时间、命令等字段。2.3 为什么默认按 CPU 排序而不是内存很多人第一次用会疑惑服务器明明是内存爆了为什么top默认按 CPU 排这其实是历史设计取舍。top诞生于 CPU 资源远比内存稀缺的年代默认按 CPU 降序能让管理员最快发现谁在吃 CPU。但实际排查中内存问题同样常见所以你必须学会用交互键切换排序——按M按内存排序按P回到 CPU 排序按T按运行时间排序。这个切换动作是我用得最频繁的操作没有之一。3. 核心字段逐个拆解与实操要点3.1 load average 到底该怎么读load average 这三个数字是新手最容易误读的地方。它表示的是在最近 1、5、15 分钟内处于可运行状态和不可中断睡眠状态的进程平均数。注意它统计的不只是正在跑 CPU 的进程还包括那些卡在磁盘 IO 上、处于 D 状态不可中断睡眠的进程。所以判断负载高不高不能只看数字大小要结合 CPU 核心数。经验公式是load average 除以 CPU 核心数结果持续大于 1 就说明有压力大于 2 就说明明显过载。比如一台 4 核机器load 是 8那就是 2 倍过载得赶紧查。反过来一台 64 核的机器 load 是 10其实很轻松。怎么快速知道核心数在top界面里按1CPU 那行会展开成每个核心单独一行数一下就知道。或者直接nproc命令。注意load average 高但 CPU 空闲率高这种情况十有八九是 IO 瓶颈。因为 D 状态进程被算进了负载但它们不消耗 CPU。这时候你要看的是 waIO 等待那一列而不是 us。3.2 CPU 那行每个百分比的含义CPU 行的字段是排查性能问题的核心我逐个说ususer用户态进程消耗的 CPU 时间。正常业务进程跑起来这个值高是正常的。sysystem内核态消耗。如果 sy 异常高比如超过 30%通常意味着系统调用过于频繁可能是某个程序在疯狂做 IO 或者上下文切换。ninice被调整过优先级的用户进程消耗。一般很低除非你手动 nice 过。ididle空闲。这个值低说明 CPU 忙。waiowait等待 IO 完成的时间。这个值高说明磁盘或网络存储是瓶颈。我处理过好几次服务器卡死的案例最后都是 wa 飙到 80% 以上一查是某块盘快满了或者有坏道。hi/sihardirq/softirq硬中断和软中断。网络流量大的服务器si 会偏高因为网卡收包会产生大量软中断。ststeal这个值只在虚拟机里才有意义表示 CPU 时间被宿主机偷走了。如果你在云服务器上看到 st 很高说明你的邻居在抢资源这种情况你本地怎么优化都没用得找云厂商。3.3 内存和 swap 行的正确解读内存行里有个buff/cache这是被内核用来做文件缓存的内存。很多人看到已用内存很高就慌了其实要减掉 buff/cache 才是真实占用。判断内存是否真的紧张看available那一列新版 top 有它才是还能给新程序用多少的准确估计。swap 行更关键。swap 使用量持续增长是内存不足的明确信号。一旦系统开始大量使用 swap性能会断崖式下跌因为磁盘比内存慢几个数量级。我见过最惨的案例是一台数据库服务器 swap 用了 8G查询响应从毫秒级变成秒级最后定位到是一个没加索引的查询把内存吃光了。实操心得如果 swap 的 used 在持续上涨同时 si/soswap in/out有数值基本可以确定内存不够了。这时候按M排序找出内存占用最大的进程看是哪个业务在漏内存。3.4 进程列表里那些容易忽略的列进程列表默认显示的列里有几个特别值得关注PR 和 NI优先级和 nice 值。PR 越小优先级越高RT 表示实时进程。如果看到某个进程 PR 是 RT说明它是实时调度策略会抢占普通进程的 CPU。VIRT / RES / SHR虚拟内存、常驻内存、共享内存。判断进程真实内存占用要看 RES不是 VIRT。VIRT 包含了进程申请但还没实际使用的内存虚高很正常。RES 才是真正占着物理内存的部分。S状态R 运行、S 睡眠、D 不可中断睡眠、Z 僵尸、T 停止。D 状态进程多说明 IO 有问题Z 状态进程多说明父进程没正确回收子进程。TIME进程累计使用的 CPU 时间精确到百分之一秒。这个值能帮你判断一个进程是一直很忙还是刚启动就飙高。4. 交互操作与实战排查流程4.1 必须掌握的交互按键top的强大之处在于交互。下面这些键我几乎每天都会用到建议你直接背下来按键作用使用场景P按 CPU 占用排序默认排序查 CPU 飙高M按内存占用排序查内存泄漏、OOMT按运行时间排序找长期运行的进程1展开/收起每个 CPU 核心看单核是否跑满c切换显示完整命令行看进程启动参数H切换显示线程定位具体是哪个线程在忙k杀死进程紧急处理需输入 PIDr调整进程 nice 值临时降优先级f进入字段管理自定义显示列z彩色显示视觉上快速区分状态d或s修改刷新间隔高频监控时调小q退出别用 CtrlC会留下终端问题其中H这个键我要特别强调。很多性能问题进程级别看不出来因为一个进程开了几十个线程CPU 被平摊了。按H之后top会把每个线程单独列出来你就能看到到底是哪个线程在疯狂吃 CPU。我之前排查一个 Java 应用的 CPU 问题就是靠H定位到某个 GC 线程异常。4.2 一次完整的线上排查流程假设现在告警说某台服务器 CPU 飙到 90%你怎么用top一步步定位我把我实际的排查顺序写出来第一步看 load average 和 CPU 行。确认是 CPU 真的忙us/sy 高还是 IO 等待wa 高还是被虚拟化偷走st 高。这一步决定了后续方向。第二步看进程列表顶部。默认按 CPU 排序排在最前面的就是嫌疑进程。记下它的 PID。第三步按c看完整命令行。确认这个进程是什么业务启动参数有没有异常。第四步按H看线程。如果进程是多线程的展开看具体哪个线程占用高。第五步结合其他工具深挖。top只能告诉你是谁不能告诉你为什么。这时候要用pidstat、strace、perf等工具进一步分析。比如pidstat -t -p PID 1可以看线程级 CPU 使用strace -p PID可以看系统调用。第六步处理。如果是可以重启的业务先重启止血如果是内存泄漏得改代码。紧急情况下可以用top里按k直接杀进程但生产环境慎用容易丢数据。4.3 服务器 OOM 时怎么用 top 找元凶服务器 OOM内存耗尽是运维最常见的故障之一。内核的 OOM killer 会在内存耗尽时杀掉一个进程但有时候它杀的不是真凶导致业务反复挂。这时候你需要用top提前定位。具体做法按M按内存排序看 RES 最大的几个进程。但要注意单个进程 RES 大不一定是问题要看它是不是在持续增长。你可以每隔几分钟记录一次观察趋势。如果某个进程 RES 一直涨那就是内存泄漏。还有一种情况是大量小进程累积导致 OOM。这时候进程列表里每个进程 RES 都不大但总数很多。你可以按M排序后看整体或者用ps aux --sort-rss | head -20辅助确认。避坑技巧top显示的 RES 不包含被 swap 出去的部分。如果一个进程大量使用 swap它的 RES 会显得很小但实际占用很大。这种情况要结合/proc/[pid]/status里的 VmSwap 字段看。5. 常见问题与排查技巧实录5.1 top 数值和 free、ps 对不上怎么办这是新手最常问的问题。原因有几个采样时刻不同。top是周期性采样free是瞬时读取两者本来就会有差异。而且top第一次显示的 CPU 使用率是从系统启动到现在的平均值不是当前值所以第一次看往往不准等它刷新一两次再看。计算口径不同。top的内存 used 包含了 buff/cache 的一部分而free的 used 不包含。所以top显示的 used 通常比free大。进程统计范围不同。top默认只显示当前用户的进程取决于启动方式而ps aux显示所有。如果你用普通用户跑top看到的进程数会比 root 少。解决办法很简单以同一个工具为准不要交叉对比。排查 CPU 用top排查内存用free配合top排查进程用ps。工具之间数值有差异是正常的关键是理解每个工具的设计目的。5.2 为什么 top 里看不到某个进程有时候你明明知道某个进程在跑top里却找不到。可能的原因进程属于其他用户。普通用户跑top默认看不到 root 的进程需要sudo top或者按u切换用户过滤。进程被过滤了。你可能不小心按了u或o设置了过滤条件按清除所有过滤。进程在 D 状态且被隐藏。极少数情况下某些内核线程不显示。刷新间隔太长。短命进程可能在两次刷新之间就结束了按d把间隔调到 0.5 秒试试。5.3 top 本身占用 CPU 高吗top默认 3 秒刷新一次本身开销很小通常不到 1% CPU。但如果你把刷新间隔调到 0.1 秒或者机器上进程数上万top自身的开销就会明显上升。我见过一台机器有 3 万多个进程top一开 CPU 就飙到 20%这时候应该用d把间隔调大或者改用atop、glances这类更高效的替代品。5.4 僵尸进程怎么处理top第二行如果显示 zombie 数量非零说明有僵尸进程。僵尸进程本身不占资源但会占用 PID数量多了会导致无法创建新进程。处理思路找到僵尸进程的父进程让父进程回收。用ps -ef | grep defunct找到僵尸进程看它的 PPID然后处理父进程。如果父进程是 1init那内核会自动回收不用管。如果父进程是某个业务进程可能需要重启它。注意直接 kill 僵尸进程是没用的因为它已经死了你 kill 的只是它的进程表项。必须处理父进程。5.5 常见问题速查表现象可能原因排查动作load 高但 CPU 空闲IO 瓶颈看 wa 列用 iostat 确认us 高业务代码问题按 P 排序找进程用 perf 分析sy 高系统调用频繁看是否大量 IO 或上下文切换wa 高磁盘瓶颈检查磁盘健康、是否快满si 高网络中断多检查网卡流量、是否被攻击st 高虚拟化资源争抢联系云厂商本地无法解决swap 持续增长内存不足按 M 排序找内存大户大量 D 状态进程IO 阻塞检查存储设备大量 Z 状态进程父进程未回收处理父进程6. 进阶用法与替代工具选型6.1 批处理模式把 top 输出到文件top支持批处理模式适合做监控脚本或者事后分析。命令是top -b -n 1 top_output.txt-b表示批处理模式不进入交互界面-n 1表示只采集一次。如果要持续采集可以-n 10 -d 5表示采集 10 次每次间隔 5 秒。这个用法在排查间歇性故障时特别有用。比如某个问题每隔几分钟出现一次你可以写个脚本持续采集事后分析。6.2 自定义显示字段按f进入字段管理界面可以增删显示的列。我通常会加上CODECPU 编号和SWAPswap 使用量这两列。配置好之后按W保存到~/.toprc下次打开就是你的自定义配置。6.3 top 的替代品怎么选top虽好但不是万能的。根据场景我推荐几个替代品htop界面更友好支持鼠标、树状显示、颜色高亮。适合日常交互使用但需要额外安装。atop能记录历史数据适合事后分析。top只能看当前atop可以回放。glances跨平台支持 Web 界面和 API适合做监控集成。pidstat专注进程级统计能看线程、IO、内存的细分数据是top的强力补充。我的习惯是日常快速查看用top深度分析用pidstatperf长期监控用atop或专门的监控系统。6.4 嵌入式场景下的 top在嵌入式 Linux 设备上top往往是 BusyBox 版本功能被裁剪过交互键少很多甚至不支持H看线程。这时候你可能需要交叉编译一个完整的 procps 包或者用busybox top的有限功能凑合。嵌入式设备资源紧张建议把刷新间隔调大比如 5 秒减少开销。7. 我踩过的那些坑说几个我实际踩过的坑都是文档里不会写的。第一个坑把 top 第一次的 CPU 使用率当真。刚打开top时CPU 那行显示的是从系统启动到现在的平均值不是当前值。我有次看到 us 是 5%以为系统很闲结果等它刷新一次变成 80%差点误判。记住等它刷新至少一次再看。第二个坑用普通用户跑 top 排查 root 进程。有次线上 CPU 飙高我用普通账号跑top怎么都找不到那个吃 CPU 的进程折腾了半小时才想起来要sudo。这个坑很蠢但真的容易犯。第三个坑误读 RES 判断内存。早期我总盯着 VIRT 看觉得某个 Java 进程 VIRT 有 8G 好吓人其实 RES 才 500M。VIRT 是虚的RES 才是真的。第四个坑在 top 里按 CtrlC 退出。top里按 CtrlC 虽然能退出但有时候会留下终端状态异常比如光标不见了、输入不回显。正确做法是按q退出。第五个坑忽略 st 值。有次在云服务器上排查性能问题本地怎么优化都没用最后发现 st 高达 30%是宿主机资源争抢。这种情况你本地做什么都是徒劳只能找云厂商或者换实例。第六个坑僵尸进程直接 kill。前面说过僵尸进程 kill 不掉必须处理父进程。我第一次遇到时对着僵尸进程 kill 了半天毫无反应后来才明白原理。这些坑说到底都是对top底层机制理解不到位导致的。把/proc文件系统、进程状态、内存管理这些基础打牢top的每个数字你都能看懂也就不会再被表象迷惑了。最后分享一个我个人的习惯每次登录一台不熟悉的服务器第一件事就是top看一眼确认 load、内存、swap 都正常心里有个底。这个动作花不了十秒但能帮你避开很多上来就操作结果把问题搞大的尴尬。工具是死的理解是活的top用得好不好本质上取决于你对 Linux 系统运行机制的理解有多深。
返回列表