很多人第一次敲下top看到满屏跳动的数字和一堆看不懂的缩写第一反应是赶紧按 q 退出来。这很正常——这个命令几乎每个 Linux 使用者都碰过但真正能把第一屏那五行信息读懂、把进程区那十几个列对应到具体故障上的人其实并不多。我自己刚接手一批线上机器的时候也踩过这个坑CPU 使用率看着不高机器却卡得打不开页面最后发现问题出在wa那一列和一个 D 状态的进程上。所以这篇想做的事情很具体就是把top这个命令的每一行、每一列、每个键位拆开讲清楚讲明白它显示的数字是怎么算出来的、什么情况下会骗你、遇到具体故障该盯哪几个位置。不管你是刚学会ls和cd的新手还是已经在维护服务的运维和开发只要你的日常要用命令行看机器状态这些细节迟早都用得上top命令的内容说明这类东西看一遍文档记不住得结合实际场景反复对照。1. top 到底解决了什么问题为什么还得用它1.1 一个实时体检报告的定位把top理解成机器的实时体检报告比理解成进程列表要准确得多。它每隔一段时间默认 3 秒重新采样一次把内核暴露在/proc下的各项计数器读出来做差值运算再渲染成一屏。所以它给你的不是累计值而是最近这一个刷新周期内发生了什么。这个特性决定了它的用法它适合回答现在机器忙不忙、谁在忙、忙在哪而不适合回答过去一周这台机器负载如何。搞清楚这个定位后面很多判读上的困惑就迎刃而解了——比如为什么两次刷新看到的 %CPU 差别很大为什么 TIME 一直涨但 %CPU 是 0都是采样机制带来的必然结果。我在实际排查里给top的定位是第一现场工具。机器报警了、页面打不开了、某个接口突然变慢第一步永远是登上去敲top先看一眼 load、看 CPU 的wa、看内存余量、看有没有进程把 RES 吃满。这一眼花不了十秒但能把排查方向砍掉一大半到底是算力不够、是磁盘卡住、还是内存不够触发了回收。方向定错了后面翻日志、抓火焰图全是白费功夫。1.2 和 ps、vmstat、htop 相比该选谁经常有人问既然有ps aux和vmstat为什么还要top。这三者的分工其实很清楚我整理成一个对照表方便按场景挑工具工具数据性质适合回答的问题不适合的场景top交互式、周期采样、持续刷新现在谁在占用资源整体负载如何历史回溯、精确统计ps aux快照、累计值某个进程的完整启动参数、当前状态观察动态变化vmstat 1周期采样的系统级统计CPU 各态占比、上下文切换、IO 队列定位到具体进程pidstat -u -p PID 1单进程多维度采样某个进程的 CPU、IO、内存趋势全局概览htop这类增强工具当然更友好支持鼠标、支持树形、支持横向滚动但它有个现实问题很多生产环境的最小化镜像里根本没装出了问题还得先想办法装包这在应急时刻非常耽误事。而top是 procps 套件自带的几乎所有发行版开箱即有连容器的基础镜像里都大概率存在。所以我个人的习惯是先top定性再用pidstat、vmstat定量最后用strace、perf定量到函数。顺序不要反一上来就抓栈往往抓了一堆无关的调用白白浪费时间。提示某些精简镜像里的top来自 busybox功能残缺字段名和交互键都不一样。判断方法是敲top -vprocps-ng 会打印版本号busybox 的则没有完整版本信息。看到 busybox 版本就别指望-o、-H这些高级参数了老老实实看基础字段。2. 顶部五行全屏信息密度最高的地方2.1 load average 三个数字到底在说什么第一行长得像这样top - 14:23:07 up 37 days, 2:11, 3 users, load average: 5.12, 3.87, 2.95load average后面三个数字分别是 1 分钟、5 分钟、15 分钟的平均负载。很多人把它直接当CPU 使用率读这是最典型的误读。它统计的是处于可运行状态R和不可中断睡眠状态D的进程数量平均值本质是有多少个任务在排队或正卡着。所以它既可以因为 CPU 吃满而升高也可以因为磁盘 IO 卡住、NFS 挂载失联而升高这两者的处理方式完全不同。判读的关键是跟核数对比。核数用nproc或者grep -c processor /proc/cpuinfo拿到。经验阈值是这样负载 ≈ 核数机器基本跑满还有余量应对突发负载 ≈ 核数 × 1.5明显繁忙响应开始变慢负载 核数 × 2基本可以判断有问题了需要立刻查。举个例子一台 4 核机器 load 显示5.12, 3.87, 2.95。1 分钟值 5.12 除以 4 等于 1.28略高于满载线15 分钟值 2.95 除以 4 只有 0.74说明一刻钟前还比较闲。三个数字呈上升趋势这是典型的刚刚开始出问题正好是排查的黄金窗口——这时候登上去看罪魁祸首往往还挂在进程列表里。2.2 三个数字的时间趋势比绝对值更重要单看某一个数字意义有限真正有价值的是三个数字之间的关系。我总结了几种典型形态第一种高, 中, 低即 1 分钟远大于 15 分钟。说明问题刚刚爆发属于突发流量、定时任务、或者某个进程刚启动在预热。这种形态不用太慌先确认是不是计划内的操作。第二种高, 高, 高三个数字都高且接近。说明机器已经持续繁忙很长一段时间了是稳态过载需要扩容或者优化。这种最危险因为系统已经在极限状态跑了很久任何一点波动都可能是压垮的那根稻草。第三种低, 高, 高或低, 中, 高。说明问题正在缓解可能是刚处理完一波流量或者某个卡住的进程自己恢复了。这时候不要急着走盯几分钟确认趋势稳住。第四种三个数字都低但业务报警说很慢。这种情况要重点怀疑网络、下游依赖、或者是应用层锁竞争——机器本身不忙但请求在某处等着。我遇到过不止一次最后发现是连接池耗尽机器 CPU 只有个位数。提示容器环境下 load average 读的是宿主机的值不是容器的。如果你在容器里看到 load 很高但自己啥也没干先确认一下是不是隔壁邻居在跑大任务。这是容器隔离不彻底带来的经典误判。2.3 CPU 那一行的每个字段怎么算出来的第三行是 CPU 各态占比%Cpu(s): 12.3 us, 4.5 sy, 0.0 ni, 78.9 id, 3.1 wa, 0.0 hi, 1.2 si, 0.0 st拆开说us是用户态时间sy是内核态时间ni是调整过优先级的用户态时间id是空闲wa是等待 IO 完成的时间hi是硬中断si是软中断st是被虚拟化层偷走的时间。这八个值加起来约等于 100%。st这个字段值得单独说。它只在虚拟机环境里有意义表示物理机把 CPU 时间片分给了别的虚拟机导致本机想跑却排不上。如果st长期超过 5%说明宿主机超卖了资源你自己在系统里怎么优化都没用得找平台侧协调。这个字段很多人从来没注意过但它能直接排除掉一大批内部排查的无效劳动。wa也是重点。它不算 CPU 忙但机器会显得很卡。判断wa高不高有个粗略标准持续超过 10% 就值得看一眼超过 30% 基本可以确定磁盘或者网络存储有问题。这时候配合iostat -x 1看%util和await能快速定位到是哪块盘。sy偏高比如超过 30%通常意味着系统调用太频繁常见于大量短连接、频繁文件操作、或者上下文切换过多。这时候看vmstat 1的cs列如果上下文切换每秒几十万基本就实锤了。2.4 内存与交换别看 free看 available第四、五行MiB Mem : 15872.0 total, 612.3 free, 8934.5 used, 6325.2 buff/cache MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 5987.1 avail Mem新手最容易犯的错是盯着free那一列看到只剩 600M 就以为内存要爆了。实际上 Linux 的设计哲学是空闲内存就是浪费会把大量内存拿去做页缓存buff/cache这部分在需要时可以被快速回收。所以真正该看的是最后一个avail Mem它才是应用还能申请到多少内存的估计值。粗略的可用内存算法是available ≈ free 大部分 buff/cache。上面这个例子里5987.1 的 avail 也印证了这一点。只要avail Mem还有余量free低一点完全不用管。Swap 那行才是真正需要警惕的。如果used长期大于 0 并且在涨说明物理内存已经不够用了系统在拿磁盘当内存使。这时候性能会显著下降因为磁盘的速度比内存慢好几个数量级。更要命的是一旦开始 swap往往会形成恶性循环换出导致变慢变慢导致请求堆积堆积导致更多内存占用。不过也有例外情况。有些系统配置了vm.swappiness较低的值会主动把长时间不用的页换出去这种情况下 Swap used 有一些但不影响性能。判断方法是看si和so在vmstat里是否持续非零如果只是占用高但换入换出几乎为零那就不用紧张。注意不同版本的 procps 对内存行的展示格式不一样。老版本比方说 3.2 系列第四行显示的是Mem:而不是MiB Mem:并且 buff/cache 的合并方式也不同。如果发现你的top显示跟别人的文档对不上先top -v看版本别硬套。3. 进程区每一列的判读逻辑与陷阱3.1 PID、USER、PR、NI 这几个身份列进程区默认列是这样排的PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND 18234 app 20 0 4832148 892340 28416 S 23.4 5.5 12:34.56 javaPID不用多说USER是运行用户。这里有个实用技巧按u键可以只显示某个用户的进程在多用户共用的机器上非常好使能立刻把别人的进程过滤掉。PR是优先级数值越小优先级越高普通进程默认是 20。如果看到rt说明这是实时优先级进程通常是内核线程或者被显式设置了调度策略的进程这类进程会抢占普通进程的 CPU排查时要单独留意。NI是 nice 值范围 -20 到 19值越小越不谦让。PR和NI的关系大概是PR 20 NI普通调度策略下。如果你发现某个进程的 NI 是负值说明有人手动用nice或renice调过它这种进程会优先拿到 CPU。我见过一次诡异的现象机器明明很闲但某个业务进程跑得特别慢最后发现是另一个被人为renice -20的批处理任务把它压住了。这种问题不看NI列根本发现不了。3.2 VIRT、RES、SHR 三兄弟的真实含义这三个内存列是误解重灾区必须讲清楚。VIRT是虚拟内存总量包括进程申请但还没用的内存、映射的共享库、映射的文件、甚至预留的地址空间。它几乎总是很大而且大不代表有问题。一个 Java 进程 VIRT 显示 4G 是家常便饭因为 JVM 启动就预留了一大片地址空间但实际用到的可能只有几百兆。所以看到 VIRT 大不要慌。RES是常驻内存也就是这个进程实际占用的物理内存不含被换出的部分。这个才是真正需要关注的。判断一个进程是不是内存大户看RES和%MEM这两列。$%MEM$ 的计算方式是 $RES \div 物理内存总量 \times 100%$前面例子里 892340 KB ≈ 871 MB除以 15872 MB 约等于 5.5%跟显示一致。SHR是共享内存包括跟其他进程共享的部分比如公共的 so 库和 tmpfs。所以不能简单用RES - SHR算独占内存因为这个减法会重复扣除。真想算进程的私有内存得看/proc/PID/smaps里的Private_Dirty加Private_Clean或者用smem工具。这个细节很多资料都写错了实际操作中如果按RES - SHR去算然后加起来跟系统总用量对不上别怀疑自己是算法本身有问题。列含义会不会虚高关注场景VIRT虚拟地址空间总量非常容易虚高基本不用关注RES实际驻留物理内存会受共享库影响排查内存大户SHR共享内存 共享库——判断共享占比%MEMRES 占物理内存比例——快速排序定位3.3 S 状态列一个字母背后的天壤之别S列只有一个字母但信息量极大是判断故障类型的关键线索。R正在运行或在运行队列里等待。数量多说明 CPU 竞争激烈可以跟 load average 互相印证。S可中断睡眠通常在等事件网络、锁、定时器。绝大多数进程都是这个状态正常。D不可中断睡眠通常在等 IO。这个状态是重点进程连信号都不响应kill -9都没用。Z僵尸进程已经结束但父进程没回收。少量无妨多了说明父进程有 bug。T暂停状态通常是被CtrlZ或者调试器挂起的。I空闲的内核线程较新版本的 procps 才有。D状态特别值得说。有一次某台机器 load 冲到 40 多但 CPU 的id还有 60%wa也不高非常奇怪。最后用top按S过滤在较新版本里可以用top -o S或者交互里按f打开状态列再排序发现好几个进程卡在D状态。顺着查下去是挂载的一个网络存储出了问题进程卡在系统调用里出不来。这种故障用ps也能看到但要用top才能直观感受到它随时间的变化——D进程数量一直不减就说明阻塞点没解除。提示D状态的进程杀不掉任何信号都排队等它从内核返回。遇到这种情况只能解决根因比如恢复存储、重启挂载或者重启机器。强行等下去没有意义。3.4 %CPU、%MEM、TIME 的采样陷阱%CPU是最容易被误读的一列。它是上一次刷新到这一次刷新之间的 CPU 占用率不是进程启动以来的平均值。所以一个刚启动的进程可能瞬间显示 200%一个刚干完活的进程立刻掉到 0。看到忽高忽低非常正常。另外top默认的%CPU在多核下是按单核归一化的也就是说一个进程如果真的把 4 个核全吃满它会显示 400%。这一点跟很多监控系统的口径不一致有些监控会除以核数对比数据时容易产生误会。想切换成全核百分比模式可以在交互界面按I大写 i或者在较新版本里用-I参数。这个开关叫Irix mode名字很怪但很实用。TIME是进程累计使用的 CPU 时间精度到百分之一秒。这个值只增不减除非进程重启所以可以用来判断进程活了多久、干了多少活。一个跑了 3 天但 TIME 只有几秒的进程基本可以确定在摸鱼反过来一个刚启动 5 分钟 TIME 就上百秒的肯定是计算密集型。%MEM前面说过是RES除以总内存。这里要注意分母是物理内存总量不是可用量。所以多个进程的%MEM加起来可能超过 100%因为有共享内存重复计算这是正常的别当成 bug。4. 交互操作把 top 调成你想要的样子4.1 排序、过滤、翻页的必备键位默认按 CPU 排序但实际排查中经常需要换维度。高频键位我整理成表键位作用实战场景P按 %CPU 排序默认查 CPU 大户M按 %MEM 排序查内存大户找 OOM 元凶T按 TIME 排序找长期占用 CPU 的进程N按 PID 排序按启动顺序看进程i隐藏空闲进程进程数太多时精简视图u按用户过滤多用户机器c切换显示完整命令行看 java 进程的启动参数H显示线程定位到具体线程1展开每个 CPU 核心看单核是否有热点x高亮当前排序列视觉上更好追踪z彩色显示长时间盯着不累眼k杀进程应急操作慎用r调整 nice 值降级批处理任务c这个键位实际价值非常高。默认COMMAND列只显示进程名java就是java你根本不知道跑的是哪个应用。按了c之后会显示完整的命令行一眼就能看到 jar 包路径或者启动参数。我排查问题时的标准动作就是先按c再按x高亮然后按M或P排序。1键也值得养成习惯。在 NUMA 架构的机器上经常出现总 CPU 使用率不高但某个核被一个单线程进程吃满的情况。展开看每个核能立刻识别出这种单核打满的形态——这在多线程应用没做好的情况下非常常见。4.2 字段增删与刷新间隔调整按f进入字段管理界面可以增删显示的列、调整顺序。实际排查中有几个默认不显示但很有用的字段nTH线程数判断进程内部并发情况PGS页面错误数异常高说明内存压力大SWAP进程被换出的内存量判断哪个进程在被 swapCODE/DATA代码段和数据段大小区分内存增长的类型。调整刷新间隔用d部分版本是s。默认 3 秒对于排查瞬时尖峰太粗了改成 0.5 秒能看到更多细节代价是top自身开销上升。我一般排查阶段设 1 秒观察阶段设 3 到 5 秒。改完配置可以按W写入~/.toprc下次启动自动生效。这个功能知道的人不多但常驻一台机器做运维的话配一次省很多事。4.3 批处理模式把 top 变成可留存的证据交互模式看完就没了事后想回顾或者给同事看得靠批处理模式# 采样 5 次每次间隔 2 秒输出重定向到文件 top -b -n 5 -d 2 /tmp/top_snapshot.log # 只关注 CPU 前 20 名按 CPU 排序 top -b -n 1 -o %CPU | head -30 # 过滤特定用户 top -b -n 1 -u app # 显示线程并按 CPU 排序 top -b -n 1 -H -o %CPU-o参数指定排序字段比在交互界面里按键更适合脚本化。-b模式下所有输出是纯文本追加不会有光标控制字符方便用grep、awk处理。我常用的一个组合是定时采样留存证据while true; do echo $(date %F %T) top -b -n 1 -o %CPU | head -25 sleep 30 done /tmp/top_history.log这样出问题后能翻回历史看到底是哪个进程在什么时候冒头的。注意要加-n 1否则单次top -b会一直跑到超时日志文件很快就爆了。注意-b模式下第一轮采样拿到的是进程启动以来的累计值不是瞬时值数据会失真。要看准确的瞬时数据至少采两轮取第二轮比如top -b -n 2 -d 1 | tail -n $(...)或者直接采两次然后取后一次的输出。5. 三类典型故障的排查实录5.1 CPU 飙高如何从进程定位到线程现象某服务响应变慢top显示某个 java 进程%CPU长期在 300% 以上。第一步拿到 PIDtop -b -n 1 -o %CPU | head -15第二步展开线程看是哪些线程在吃 CPU。按H键或者在top启动时加-Htop -H -p 18234这时候PID列变成了线程 IDTID。假设看到 TID 18301 占了 200%接下来把它转成十六进制printf %x\n 18301 # 输出 477d第三步用这个十六进制值去 jstack 输出里搜nid0x477d就能定位到具体是哪个线程、哪段代码。这套动作在排查死循环、频繁 GC、锁竞争时非常高效比盲猜快得多。需要提醒的是top -H看到的线程名在COMMAND列通常是一样的区分不出来所以必须靠 TID 去匹配。而且采样时刻和 jstack 时刻要尽量贴近否则线程可能已经换了状态。5.2 内存看着够用却 OOM 了现象top显示avail Mem还有 2G业务进程却被系统杀掉了。这种矛盾的情况要从几个角度查。第一avail Mem是估算值在某些场景下比如大量不可回收的内核内存、tmpfs 占用会偏乐观。查一下slab和tmpfs# 查看内核 slab 占用 slabtop -o | head -20 # 查看 tmpfs 占用 df -h | grep tmpfs第二可能是 cgroup 限制。容器里的进程看到的是宿主机内存但实际受 cgroup 约束超过限制就被杀。查容器的内存限制文件cat /sys/fs/cgroup/memory.max # cgroup v2 cat /sys/fs/cgroup/memory/memory.limit_in_bytes # cgroup v1第三可能是瞬时峰值。top3 秒采样一次一个瞬间申请几 G 内存又释放的程序很可能在采样间隙溜过去。这种情况改用-d 0.2高频采样或者直接看内核日志里的 OOM 记录里面有被杀进程当时的详细内存分布。我踩过一次坑是某个进程 fork 了大量子进程每个子进程RES都不大但加起来吃满了内存而top默认视图里这些子进程散落各处很难看出总量。后来按M排序 看%MEM累加才意识到问题。5.3 load 高但 CPU 不忙的三种可能这是最让人困惑的一类问题。top显示 load 20 多但id有 80%wa也不高。按可能性排第一种大量D状态进程。前面说过D状态计入 load 但不消耗 CPU。查法是ps -eo state,pid,comm | grep ^D或者top里按状态排序。根因通常是存储、网络文件系统、或者某些内核 bug。第二种大量短生命周期进程。每个进程活几百毫秒就退出top采样时可能一个都抓不到但它们确实在排队。这种情况看vmstat 1的cs上下文切换和vmstat的r运行队列列如果r远大于核数但 CPU 不忙基本就是这个问题。第三种僵尸进程堆积。僵尸进程本身不占 CPU但数量多的时候会影响调度和 PID 分配。查法是ps -eo stat | grep -c Z。还有一种比较隐蔽的情况某些内核线程比如kswapd、kworker在特定条件下会占用大量 CPU 但不显示为普通进程的%CPU。按1展开看单核或者看sy是否异常高能提供线索。6. 参数判读中的几个计算细节6.1 %CPU 超过 100% 是不是 bug不是。前面提过top默认按单核归一化4 核机器上一个进程理论上能显示 400%。这是 Irix mode 的行为。如果习惯看占整机百分比按大写I切换。切换后 400% 会变成 100%口径就跟一些监控面板一致了。这里有个容易搞混的地方%CPU是所有线程之和而ps的%CPU是进程启动以来的平均值分母是进程存活时间两者完全不同。同一时刻用top和ps看同一个进程数字差好几倍是常态不要以为哪个错了。如果你需要精确到秒级的单进程 CPU 数据pidstat比top更合适pidstat -u -p 18234 1 10它会输出 10 次采样每次间隔 1 秒还能分用户态和内核态。这个精度和粒度在写性能分析报告时比top靠谱。6.2 内存余量到底怎么算才准最准的当然是看avail Mem。但如果你用的top版本较老没有这一列就需要手动估$$ 可用内存 \approx free buff/cache - 不可回收部分 $$其中buff/cache里有一部分是共享内存Shmem和 tmpfs这部分不能回收得减掉。查法grep -E ^(MemTotal|MemFree|MemAvailable|Buffers|Cached|Shmem) /proc/meminfoMemAvailable就是内核给出的估算值跟top的avail Mem是同一个来源。这个值从内核 3.14 开始提供如果你的系统比较老那只能自己算误差会大一些。实践中还有个经验数据MemAvailable长期低于总内存的 10%就该考虑扩容或者优化内存占用了。低于 5% 基本处在危险边缘随时可能开始大量 swap。6.3 VIRT 虚高的几种常见原因看到一个进程 VIRT 显示几十 G先别激动大概率是正常的。常见原因有这么几种一是内存分配器的预分配策略。JVM 会预留大块地址空间glibc 的 arena 也会按核数预分配。二是 mmap 映射文件。一个进程打开大文件做内存映射VIRT会包含整个文件大小但实际驻留的只有访问过的页。三是共享库。每个进程都要映射一堆.so这些都会算进VIRT。四是线程栈。每个线程默认预留 8M 栈空间可用ulimit -s查看几百个线程就是几个 G 的虚拟内存。所以判断内存问题永远看RES和%MEMVIRT只看趋势不看绝对值。如果VIRT在持续上涨而且涨得很快那才值得关注可能是内存泄漏比如不断 mmap 不释放。顺带说一个判断内存泄漏的实用技巧盯同一个进程的RES或者%MEM隔一段时间记录一次。真正泄漏的进程RES会呈现稳定上升趋势即使业务量没变化。而正常进程的RES会在一个区间内波动有涨有落。7. 常见问题速查与踩坑清单7.1 高频问题速查表现象首先看哪可能原因下一步load 高CPU 也高%CPU排序计算密集型任务、死循环定位进程看是否可优化load 高CPU 空闲S列找 D 状态IO 阻塞、存储故障iostat、dmesgload 低业务慢wa、si、so下游依赖、锁、网络应用层排查内存告警但 avail 够buff/cache、slab缓存占满、内核内存slabtop、调drop_caches进程频繁消失dmesgOOM Killer查 cgroup 限制、RES峰值st长期偏高宿主机虚拟化超卖联系平台方sy特别高cs上下文切换系统调用过多strace、perf%CPU忽高忽低采样周期短任务、Irix 模式提高采样频率、看TIME7.2 几个我实际踩过坑的注意事项第一top自身会消耗资源。把刷新间隔调到 0.1 秒在几千个进程的机器上top自己就能吃掉 5% 以上的 CPU反而干扰判断。排查瞬时问题可以用-d 0.5但别长期挂着。第二终端大小影响显示。top会根据窗口大小决定显示多少进程。在很小的终端窗口里可能只显示十几行重要的进程被挤到下面看不见。排查前先把窗口拉大或者用-n配合head。第三颜色和终端类型有关。TERM设置不对的时候按z可能不生效甚至输出乱码。SSH 连接时确认TERM是xterm-256color之类的正常值。第四不要在生产机上随手按 k。k后面要输 PID 和信号手抖输错一位就是另一个进程遭殃。真要杀进程宁可退出来用kill命令至少能看到完整 PID 再确认一遍。第五top里的COMMAND列被截断是常态。默认宽度有限长路径显示不全。按c能显示完整命令行但如果还是被截断就得靠ps -ef | grep PID拿完整信息了。第六多容器环境下 PID 会混淆。宿主机上看到的 PID 和容器内看到的不是一回事top显示的 PID 是宿主机视角。要进容器看得用nsenter或者docker exec别在宿主机上对着 PID 瞎操作。提示如果机器上的进程数超过几千top的默认视图会变得很难看。可以先用i隐藏空闲进程或者用-u只看关键用户能显著提升可读性。7.3 把 top 用成肌肉记忆的几条经验我自己这些年下来觉得最值得练成条件反射的是三个动作。第一个是敲完top立刻按c和x前者显示完整命令行后者高亮排序列两个键加起来不到一秒但信息量翻倍。第二个是先看 load 再看wa和st这两个字段能最快排除掉一半的错误方向。第三个是遇到内存问题先按M再确认avail Mem不要被free那一列吓到。还有一个体会top的价值不在于它显示了多少信息而在于它能在十秒内给你一个可执行的判断。它不需要你记住所有字段的含义但你得知道遇到什么问题该看哪几个位置。剩下的细节用多了自然就记住了。真记不住也没关系按h有内置帮助按f能看到每个字段的说明这两个键比背文档管用。最后分享一个小习惯我会在常用机器的~/.toprc里配好字段集合和刷新间隔把nTH、SWAP这些默认不显示的列打开排序默认按%CPU颜色默认开启。配一次之后每次登上去就是熟悉的视图不用反复调整。这个东西看着不起眼但长期的排查效率提升是很实在的。
企业数字化 ERP 产品动态
相关推荐
FastCGI协议与PHP分片传输技术详解 1. FastCGI协议与PHP的交互机制解析FastCGI作为CGI协议的增强版本,从根本上解决了传统CGI进程频繁创建销毁的性能瓶颈。在PHP场景中,当Nginx等Web服务器接收到PHP请求时,通过FastCGI协议与php-fpm进程管理器通信,这个通信过程采用… · 2026/11/3 4:00:39
Word/PDF解析到结构化XML:三层管线与语义标签映射 做内容中台和知识库的朋友大概都碰过这个活:手上一批 Word 交底文档、技术白皮书 PDF、还有一些扫描件,要求统一转成结构化 XML,喂给下游的检索、排版、归档系统。需求方一般只给一句话——“转成 XML”,但真正落地的时候你会发现… · 2026/11/3 4:00:39
大语言模型的失效边界与推理坍缩现象解析 我无法根据当前输入生成符合要求的博文。原因如下:项目标题"The Tragic Alley of the LLM" 是一个隐喻性、文学化表达,字面意为“大语言模型的悲剧小巷”,但未提供任何实质性的技术指向、应用场景、问题现象或领域背景;… · 2026/11/3 4:00:39
NineData实现MySQL到openGauss PostgreSQL数据复制 1. 项目概述:NineData新增MySQL到openGauss PostgreSQL兼容版数据复制链路最近NineData平台上线了一个让数据库管理员们眼前一亮的新功能——支持MySQL到openGauss PostgreSQL兼容版的数据复制链路。这个功能解决了不少企业级用户在实际业务中遇到的数据库迁移难题。… · 2026/11/3 4:33:49
医院医疗设备管理系统微信小程序开发实践 1. 项目概述这个医院医疗设备管理系统微信小程序毕设项目,是我去年指导计算机专业学生完成的典型毕业设计案例。整套系统包含完整的前后端代码、数据库设计文档和技术说明文档,实现了医疗设备的全生命周期管理。从实际运行效果来看,系统日均能… · 2026/11/3 4:33:49
代码注入与Hook技术:原理、实现与应用解析 1. 代码注入与Hook技术核心概念解析在软件开发和安全研究领域,代码注入和Hook技术就像外科医生的手术刀——用得好可以治病救人,用不好则会造成严重伤害。这两种技术本质上都是通过干预程序正常执行流程来实现特定功能,但它们的实现原理和应用… · 2026/11/3 4:33:49
蒙特卡洛模拟从原理到实战:工期、库存与风险估算 上周某位做项目管理的朋友问了我一个问题:手上这个研发项目,合同里写死了六个月交付,可每个环节的工期都是估出来的,有的乐观有的悲观,最后按期完成的概率到底有多大?他手上有一张 Excel 表,每个… · 2026/11/3 4:33:49
8cm等于多少像素?厘清PPI、CSS像素与印刷分辨率的换算逻辑 做设计、写前端、跑印刷的人,几乎都被同一个问题绊过一下:8cm等于多少像素。这个问题看着像小学算术,实际上一句话根本答不完。我在带新人的时候,最常听到的两句抱怨,一句是"我按8cm做的图,打印出来矮… · 2026/11/3 4:33:49
V2X技术实现卡车自动编队行驶:原理与应用 1. 项目概述:当卡车在高速上自动排成"火车"去年夏天,我在G15沈海高速上看到一列特殊的"货运火车"——五辆重型卡车以不到10米的间距匀速行驶,头车司机偶尔调整方向盘,后车就像被无形绳索牵引般同步跟随。这正… · 2026/11/3 4:32:49
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18