多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Linux系统性能监控:TOP命令从入门到实战排查指南

Linux系统性能监控:TOP命令从入门到实战排查指南 1. 从“黑盒子”到“仪表盘”为什么我们需要TOP命令如果你刚开始接触Linux服务器管理或者只是偶尔登录到一台远程机器上查看情况你可能会觉得它像一个沉默的“黑盒子”。你敲入命令它给你结果但机器内部此刻正在发生什么哪个程序最耗CPU内存快用完了吗是哪个“坏小子”进程在背后捣乱这些问题如果没有一个直观的“仪表盘”你只能靠猜或者用一堆零散的命令如ps、free去拼凑一个模糊的图景。这就是top命令存在的根本价值。它不是一个简单的命令而是一个实时的、交互式的系统性能监控器。想象一下汽车的仪表盘你不需要停车、打开引擎盖、用万用表一个个测量就能一眼看到车速、转速、油量和水温。top为Linux系统提供了同样的“驾驶舱视图”。它能动态刷新持续告诉你CPU在忙什么内存被谁占用有哪些进程在运行以及它们的健康状态。这对于系统管理员、开发人员乃至任何需要了解系统负载的人来说都是第一手的、至关重要的情报。尤其在服务器环境top往往是故障排查的起点。网站响应变慢登录服务器第一件事就是top程序莫名卡死top看看是不是内存泄漏怀疑被恶意挖矿top检查可疑的高CPU进程。它直接、高效几乎预装在所有Linux发行版中是你命令行工具箱里最值得信赖的“瑞士军刀”之一。2. 首次运行TOP解读默认信息面板在终端中输入top并回车你会看到一个充满数字和列表的界面。别被吓到我们把它拆开来看。整个top界面主要分为两大块上部汇总信息区和下部进程信息列表。2.1 汇总信息区系统的“生命体征”第一行top行top - 15:30:28 up 45 days, 2:15, 1 user, load average: 0.08, 0.03, 0.0515:30:28 当前系统时间。up 45 days, 2:15 系统已连续运行uptime45天2小时15分钟。这个数字是系统稳定性的一个直观体现长时间运行的服务器这个值会很大。1 user 当前有1个用户登录。这里的“用户”指的是登录的终端会话TTY或PTS同一个用户打开多个终端也算多个。load average: 0.08, 0.03, 0.05系统平均负载这是关键指标。三个数字分别代表过去1分钟、5分钟、15分钟的平均负载。简单理解对于单核CPU1.00表示刚好满负荷。低于1.00表示有空闲高于1.00表示有进程在排队等待CPU。对于多核CPU需要将负载值除以核心数来看。例如4核CPU负载为4.00才表示满负荷。上面例子中负载很低系统非常空闲。第二行Tasks行Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie215 total 当前系统总共有215个进程。1 running 1个进程正在运行即正在使用CPU或等待运行。214 sleeping 214个进程处于睡眠状态通常是在等待某个事件如I/O操作。0 stopped 0个进程被暂停例如通过CtrlZ发送了SIGTSTP信号。0 zombie0个僵尸进程。这是需要关注的健康指标。僵尸进程是已经终止但其退出状态尚未被父进程回收的进程。少量僵尸通常无害但如果数量持续增长可能表明程序有缺陷需要检查。第三行%Cpu(s)行%Cpu(s): 1.7 us, 0.3 sy, 0.0 ni, 97.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st这是CPU使用率的详细分解百分比总和为100%。us(user): 运行用户空间进程所花的CPU时间百分比。你的应用程序如Java、Python、Nginx消耗的CPU就在这里体现。sy(system): 运行内核空间进程所花的CPU时间百分比。系统调用、中断处理等。ni(nice): 运行调整过优先级nice值的用户进程所花的CPU时间。id(idle):CPU空闲时间百分比。这个值高是好事表示系统CPU资源充足。wa(I/O wait):CPU等待I/O完成的时间百分比。这是一个非常重要的故障排查指标。如果这个值持续很高比如超过20%很可能意味着磁盘速度跟不上或存在大量磁盘读写系统性能瓶颈在I/O上。hi(hardware interrupt): 处理硬件中断所花时间。si(software interrupt): 处理软件中断所花时间。st(steal time): 在虚拟化环境中被宿主机“偷走”的时间。如果你的虚拟机性能不佳而st值很高说明宿主机资源紧张。第四、五行内存MiB Mem和交换分区MiB SwapMiB Mem : 7852.2 total, 102.4 free, 4567.8 used, 3182.0 buff/cache MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2984.4 avail MemMem行显示物理内存使用情况。关键是要理解Linux的内存管理哲学尽量利用内存做缓存cache/buffer来提升性能。所以“used”内存高不一定代表内存不足。total 总物理内存。free 完全空闲的内存。这个值通常很小因为Linux会把空闲内存拿来做缓存。used 已使用的内存包括应用程序和部分缓存。buff/cache 用于内核缓冲区buffer和页面缓存cache的内存。这部分内存在应用程序需要时可以被快速释放所以它算作“可用”资源。Swap行显示交换分区虚拟内存使用情况。当物理内存不足时不活跃的内存页会被移到Swap。如果used值持续增长甚至接近total说明物理内存严重不足系统在频繁使用磁盘做内存性能会急剧下降。avail Mem这是一个比free更有参考价值的指标。它估算的是在不进行Swap的情况下可以分配给新启动的应用程序的内存总量。它包含了free内存和可回收的buffer/cache内存。2.2 进程信息列表谁在消耗资源这是top的主体部分默认按CPU使用率降序排列。每一列代表一个属性PID: 进程ID操作进程的唯一标识。USER: 进程所有者。PR(Priority) NI(Nice Value): 进程优先级。PR是内核看到的动态优先级NI是用户可调整的静态优先级范围-20到19值越小优先级越高。top中PR NI 20。VIRT(Virtual Memory): 进程使用的虚拟内存总量。包括代码、数据、共享库、已申请但未使用的内存等。这个值可能很大。RES(Resident Memory): 进程实际使用的、未被换出的物理内存大小单位通常是KiB。这是判断进程内存占用的关键指标。SHR(Shared Memory): 进程使用的共享内存大小。可能是共享库等。S(Status): 进程状态。常见的有R(Running): 运行中或可运行在运行队列中。S(Sleeping): 睡眠中通常是在等待事件完成。D(Uninterruptible Sleep): 不可中断的睡眠。进程通常在等待I/O无法用kill命令杀死需要等待I/O完成。Z(Zombie): 僵尸进程。%CPU: 进程自上次刷新后使用的CPU时间百分比。注意对于多核CPU这个百分比可以超过100%。例如一个进程完全占满两个核心就会显示200%。%MEM: 进程使用的物理内存RES占总物理内存的百分比。TIME: 进程自启动后使用的总CPU时间。COMMAND: 启动该进程的命令行。注意默认的%MEM计算是基于总物理内存但在有大量缓存buff/cache的系统上这个比例可能显得虚高。更务实的做法是关注RES列的绝对值并结合avail Mem来评估内存压力。3. 交互操作让TOP成为你的定制化监控工具top的强大之处在于其交互性。在top运行界面按下键盘上的特定键可以实时改变显示内容、排序方式等。以下是最常用的一些交互命令3.1 进程排序快速定位资源消耗者默认按%CPU排序。在top界面按下M 按%MEM内存使用率降序排序。当怀疑内存泄漏或内存不足时这是第一选择。P 按%CPU降序排序默认。T 按TIMECPU累计时间降序排序。有助于发现长期占用CPU的进程。N 按PID进程ID降序排序。R切换排序方向升序/降序。比如先按M排内存再按R可以变成升序看到内存占用最小的进程。3.2 显示字段管理只看你想看的f 进入字段管理界面。这里可以用上下箭头选择字段按d或空格键来显示/隐藏该字段按s键可以指定该字段为排序键按右箭头可以移动字段位置。例如你可以增加PPID父进程ID字段来查看进程树关系或者隐藏SHR字段以简化视图。o/O 可以交互式地输入一个过滤条件来临时改变字段顺序或筛选。例如输入%CPU10.0会让CPU使用率低于10%的进程不参与排序但仍在列表中。3.3 进程操作不退出TOP的管理能力k杀死进程。按下k后会提示输入要杀死的进程PID然后提示输入发送的信号默认为15SIGTERM即友好终止。如果需要强制杀死可以输入9SIGKILL。慎用kill -9因为它不给进程清理现场的机会可能导致数据丢失或状态不一致。r调整进程的Nice值优先级。输入PID后会提示输入新的nice值-20到19。降低nice值如从0调到-10可以提高进程优先级但这通常需要root权限。3.4 刷新与显示控制d/s 改变刷新间隔默认3秒。按下后输入新的秒数例如1表示每秒刷新一次。在排查快速变化的性能问题时很有用。1数字1展开显示所有CPU核心的单独使用情况。在多核服务器上这能让你看清负载是否均匀分布在所有核心上还是某个核心被单个进程打满。b 切换高亮显示正在运行R状态的进程。x 高亮显示排序的列。z 切换彩色/黑白显示。W大写 将当前的top配置如字段顺序、排序方式等保存到用户家目录下的.toprc文件中。下次启动top时会自动加载这个配置。3.5 多视图模式与筛选A大写 进入交替显示模式。屏幕会被分成四个独立的窗口每个窗口可以显示不同的字段、排序和进程列表。按a或w可以在不同窗口间切换焦点并对每个窗口单独配置。这对于同时监控不同类型的进程如高CPU进程、高内存进程、特定用户的进程非常有用。u 然后输入用户名只显示属于该用户的进程。c切换COMMAND列的显示模式在只显示命令名和显示完整命令行之间切换。查看Java应用时完整命令行能看到主类和JVM参数非常关键。实操心得我习惯在登录一台新服务器后先按1看CPU核心分布再按M看内存占用排序快速对系统健康状况有个底。然后按W保存一个我喜欢的视图配置比如显示PPID、USER、%CPU、%MEM、RES、COMMAND以后每次运行都是这个视图效率高很多。4. 命令行参数启动前的精准控制除了在交互界面操作top在启动时也可以通过参数进行精细控制。这些参数在写监控脚本或一次性查看时特别有用。-d 指定刷新间隔。top -d 5表示每5秒刷新一次。-n 指定刷新次数后退出。top -n 2 -d 1表示以1秒间隔刷新2次后自动退出。这在脚本中捕获某个时间点的状态非常方便。-p 监控特定PID。top -p 1234,5678只监控PID为1234和5678的进程。可以监控多个用逗号分隔。-u 监控特定用户的进程。top -u nginx只显示nginx用户运行的进程。-b批处理模式。这个模式会将输出打印到标准输出stdout而不是全屏交互界面。通常与-n结合使用用于将top的输出重定向到文件或通过管道传递给其他命令处理。例如top -b -n 1 system_snapshot.txt这条命令将top的一次性输出保存到文件。-H显示线程信息。在top中默认以进程为单位。加上-H选项会列出所有线程在Linux中线程是轻量级进程LWP。此时PID列显示的是线程IDTID并且可以配合-p参数来查看某个进程内部所有线程的资源消耗情况。这对于分析多线程Java应用如Tomcat的CPU热点非常有用。top -H -p java_pid一个综合性的例子假设你想写一个监控脚本每10秒记录一次系统中最耗CPU的前5个进程并记录完整命令行持续监控1小时360次。你可以这样写#!/bin/bash for i in {1..360}; do echo $(date) top_monitor.log top -b -n 1 -c | head -20 top_monitor.log # -c显示完整命令head取前20行包含汇总信息 sleep 10 done5. 实战排查用TOP诊断常见性能问题理论说再多不如实战。我们模拟几个经典场景看看如何用top定位问题。5.1 场景一CPU使用率100%系统卡顿现象 应用响应极慢top显示某个或多个进程%CPU接近或超过100%多核下可能到几百。排查步骤启动top按P确认CPU排序。找到最顶部的进程记下PID和COMMAND。按c切换完整命令行。如果是一个Java进程你会看到类似java -Xms2g -Xmx4g -jar app.jar的信息。如果是Python可能是python3 app.py。按H大写切换到线程视图或者启动时用top -H。现在列表显示的是线程。再次按P对线程按CPU排序。观察高CPU线程。如果是Java线程名通常有提示如http-nio-8080-exec-1Web请求处理线程、GC task thread垃圾回收线程。如果是[cpu]或类似内核线程可能是系统调用频繁。结合其他工具深入 记下高CPU线程的PID其实是TID。使用jstack java_pid thread_dump.txt针对Java导出线程栈然后在栈文件中搜索这个TID的十六进制表示例如TID 12345的十六进制是0x3039就能定位到正在执行的代码行。对于非Java程序可以用perf top -p pid或strace -p pid进行动态跟踪。避坑提示 有时你会发现%CPU很高的进程是ksoftirqd或kworker内核线程。这通常意味着硬件中断如网络包、磁盘I/O处理压力大可能指向网络流量激增或磁盘故障。此时应结合vmstat或sar命令查看中断次数和上下文切换频率。5.2 场景二内存不足频繁使用Swap现象 系统变慢top中%CPU的waI/O等待值偏高MiB Swap行的used值在持续增长avail Mem值很低。排查步骤启动top按M按内存排序。查看RES和%MEM最高的进程。关注COMMAND列。常见的内存消耗大户有Java应用JVM堆内存、数据库如MySQL的InnoDB缓冲池、缓存服务如Redis、Memcached。检查进程状态 如果某个进程RES很大且持续增长而S状态是S睡眠或D不可中断睡眠它可能正在从Swap换入/换出数据导致高wa。计算真实内存压力 不要只看free内存。用这个公式估算真实已用 ≈ used - buff/cache。或者更简单地看avail Mem是否接近0。处理建议如果是应用配置问题如JVM的Xmx设置过大调整配置并重启。如果是内存泄漏进程RES只增不减需要结合pmap -x pid或valgrind等工具分析内存分布。如果确实是业务需要大量内存考虑扩容物理内存。临时缓解可以尝试清理缓存echo 3 /proc/sys/vm/drop_caches需要root权限且可能影响性能生产环境慎用。5.3 场景三发现可疑或僵尸进程现象Tasks行显示zombie数量大于0或者COMMAND列出现不认识的奇怪进程名。排查步骤对于僵尸进程Z状态 僵尸进程本身不消耗资源CPU、内存但占用进程表项。其父进程有责任回收它。用pstree -aps zombie_pid可以查看进程树找到其父进程。通常需要重启父进程来清理僵尸。如果父进程是initPID 1系统可能会自动回收。对于可疑进程查看完整命令行按c。查看进程所有者USER列。查看进程启动时间在top中按t和m可以切换显示模式有些版本会显示STARTED时间。更精确的可以用ps -p pid -o lstart,cmd。查看进程打开的文件lsof -p pid。查看网络连接netstat -tunap | grep pid或ss -tunap | grep pid。如果确认是恶意进程如挖矿程序先用kill -STOP pid暂停它防止其继续作恶然后调查入侵路径最后再kill -9杀死。6. 超越基础高级技巧与替代工具当你熟练使用top后可以探索一些进阶用法和互补工具构建更强大的监控体系。6.1 使用htop更友好的增强版htop是top的一个现代化替代品功能更强大界面更友好。它默认支持彩色输出更易读。鼠标操作可以直接点击选择进程、排序。横向柱状图直观显示CPU和内存使用率。树状视图按F5清晰展示父子进程关系。更容易的进程操作杀进程、调整优先级等。支持搜索过滤。在大多数系统上可以通过包管理器安装sudo apt install htopDebian/Ubuntu或sudo yum install htopRHEL/CentOS。6.2 使用atop记录历史与详细资源分析top和htop看的是实时瞬间。atop则像一个飞行数据记录仪它可以以固定的时间间隔如10秒采样系统数据并记录到日志文件中。当问题发生后你可以回放atop日志查看问题发生前后精确到进程级别的资源使用变化历史这对于诊断间歇性故障至关重要。6.3 使用pidstat针对特定进程的详细统计pidstat是sysstat工具包的一部分它可以提供比top更详细的单个进程的统计信息并且可以按需输出易于集成到脚本中。# 每2秒采样一次统计PID为1234的进程的CPU、内存、IO等信息共采样5次 pidstat -p 1234 2 5 # 查看所有进程的IO使用情况磁盘读写 pidstat -d 1 # 查看所有进程的上下文切换情况 pidstat -w 16.4 编写监控脚本与告警将top或pidstat与Shell脚本结合可以构建简单的自定义监控。#!/bin/bash # 监控CPU使用率超过80%的进程并发送告警 THRESHOLD80 while true; do # 使用top的批处理模式获取除第一行外的进程信息检查%CPU top -b -n 1 | sed 1,/^$/d | awk -v threshold$THRESHOLD $9 threshold {print 警报: PID $1 ($12) CPU使用率$9%} sleep 30 done6.5 理解top与ps的异同psprocess status是另一个查看进程的命令但它提供的是瞬间快照。top提供的是动态实时视图。ps aux 查看系统所有进程的静态信息。适合获取进程列表、查找特定进程。top 持续监控进程动态观察资源变化趋势。ps可以定制更丰富的输出格式-o选项top则胜在交互和实时。选择哪个取决于你的需求是要找一个进程的PID还是要看谁现在最耗资源。top命令的深度远不止于初次见面时那几行跳动的数字。从读懂默认界面到熟练运用交互命令进行精准排序、筛选和操作再到结合命令行参数将其融入自动化脚本最后上升到用它来系统性诊断CPU、内存、I/O等各类性能问题这是一个从“看热闹”到“看门道”的过程。它不产生数据却是理解系统数据最直接的窗口。掌握top就像是获得了服务器运维的“内视”能力任何风吹草动都尽在掌握。当你再遇到系统变慢、服务异常时相信你第一个敲下的命令一定会是top。
返回列表