行业资讯
📅 2026/8/13 6:50:24
Ubuntu系统资源监控实战指南:CPU、内存、网络核心命令解析
1. 项目概述为什么我们需要监控Ubuntu系统资源在服务器运维、软件开发或者日常使用Ubuntu桌面系统时我们经常会遇到一些“卡顿”或“异常”。比如一个后台服务突然响应变慢一个编译任务耗时远超预期或者风扇狂转但不知道是哪个程序在作祟。这时候光靠感觉是没用的我们需要确凿的证据来定位问题根源。这就是系统资源监控的价值所在——它像给系统做了一次全面的“体检”让你清晰地看到CPU、内存、网络等核心部件的实时工作状态。对于Ubuntu用户无论是新手还是老手掌握一套高效、准确的资源查看命令是一项必备的生存技能。这不仅能帮助你在问题发生时快速响应更能让你在日常使用中优化系统性能理解应用程序的行为模式。网络上虽然有很多零散的教程但往往只介绍单个命令缺乏从需求出发、由浅入深的系统性梳理。今天我就结合自己多年的运维和开发经验为你整理一份从基础到进阶的Ubuntu系统资源监控实战指南。我们将聚焦于最核心的CPU、内存和网络三大指标使用系统自带的强大工具不依赖任何第三方图形界面软件让你在终端里就能掌控全局。2. 核心监控工具全景与选型思路在深入具体命令之前我们先来了解一下Ubuntu系统为我们提供了哪些“听诊器”和“仪表盘”。这些工具大致可以分为几类实时动态监控、历史数据统计、进程级细粒度分析以及网络专用工具。选择哪个工具取决于你的具体场景是想看实时滚动的全景如top还是想看某个时间点的快照如ps或是想分析过去一段时间的性能趋势如sar。实时监控三剑客top, htop, glancestop是元老所有Linux发行版都预装功能强大但界面古朴。htop是top的增强版彩色界面支持鼠标操作直观性大幅提升通常需要手动安装。glances则更现代化用Python写成能以Web服务方式提供监控面板。对于绝大多数场景我推荐优先掌握top因为肯定有然后安装并使用htop以获得更好的体验。快照与查询工具ps, free, vmstat, netstat/ss当你不需要持续监控只想看一眼当前状态时这些命令是首选。ps查看进程列表free看内存使用vmstat看系统整体性能概览。网络方面传统的netstat正在被更高效的ss命令取代它们能告诉你哪些端口在监听哪些连接已建立。性能分析利器sar, iostat, pidstat这些命令来自sysstat工具包它们强大的地方在于能收集和报告历史性能数据。比如你想知道昨天下午3点CPU为什么飙高sar保存的历史日志就能派上用场。pidstat则可以针对特定进程输出其CPU、内存、IO等详细统计信息是深度排查的利器。网络流量监控iftop, nethogs, bmonifconfig或ip addr只能看到网卡收发数据包的总量而iftop可以像top一样实时显示每个网络连接的带宽占用。nethogs更进一步能按进程来统计网络流量直接揪出“流量小偷”。bmon提供了更丰富的图表化展示。提示对于新手我建议的入门路径是先用htop或top和free -h建立对系统资源的整体感知然后用ps或pidstat定位具体进程最后在需要分析网络问题时使用iftop或nethogs。sar等工具更适合搭建长期监控体系时使用。3. CPU资源占用深度解析与实战CPU是系统的大脑其使用率是判断系统是否“繁忙”的首要指标。但CPU使用率本身也有多个维度理解它们才能做出正确判断。3.1 使用 top/htop 进行全局监控打开终端直接输入top你会看到一个不断刷新的界面。最上面几行是系统概要信息第一行系统当前时间、运行时间、登录用户数、系统平均负载load average。这里的平均负载如0.05, 0.10, 0.15需要特别注意它代表过去1、5、15分钟内系统处于可运行状态和不可中断状态的平均进程数。对于单核CPU1.00表示刚好满负荷对于4核CPU4.00才表示满负荷。如果15分钟负载远高于CPU核心数说明系统持续繁忙。第二行任务Tasks统计包括总数、运行中的、休眠的、停止的、僵尸进程数。僵尸进程zombie过多可能意味着有程序没有正确回收子进程。第三行这是CPU使用率的精髓所在以百分比显示us(user): 用户空间进程占用CPU时间百分比。你的应用程序如Python脚本、Java服务的计算就属于这里。sy(system): 内核空间进程占用CPU时间百分比。系统调用、中断处理等开销在这里。ni(nice): 被调整过优先级的用户进程占用时间。id(idle): CPU空闲时间百分比。这是你最希望看到的数字越高说明系统越“清闲”。wa(iowait): CPU等待I/O通常是磁盘I/O完成的时间百分比。如果这个值持续很高比如超过20%说明磁盘可能是性能瓶颈CPU在空等数据。hi(hardware irq): 处理硬件中断的时间。si(software irq): 处理软件中断的时间。st(steal): 在虚拟化环境中被宿主机“偷走”的时间。如果你的虚拟机感觉慢可以看看这个值是否很高。在top界面中按下数字1可以展开显示每个CPU核心的独立使用情况对于多核CPU的负载均衡分析非常有用。htop的界面更友好。安装命令sudo apt update sudo apt install htop。运行htop后顶部用彩色条状图直观展示了CPU每个核心的使用情况中间是进程列表底部显示了功能键。你可以用F5键以树状图形式显示进程父子关系用F6键选择按CPU%、内存%等排序用鼠标直接点击选中进程并按F9发送信号如终止进程。3.2 使用 mpstat 查看多核CPU细节top和htop给出了整体视图但如果你想看每个CPU核心的详细统计或者需要更精确的采样数据mpstat是更好的选择。它来自sysstat包需要安装sudo apt install sysstat。查看所有CPU核心的实时统计每2秒刷新一次mpstat -P ALL 2输出会显示每个核心的%usr,%nice,%sys,%iowait,%irq,%soft,%steal,%guest,%gnice,%idle分类比top更细致。-P ALL表示所有处理器2表示间隔2秒。这个命令在诊断多核CPU负载不均问题时特别有用。你可能发现某个核心的%sys异常高这或许意味着某个进程或中断被固定在了该核心上。3.3 使用 pidstat 进行进程级CPU追踪当top告诉你CPU使用率很高时下一步就是找出是哪个或哪些进程导致的。pidstat可以完美胜任它也来自sysstat包。每2秒报告一次所有进程的CPU使用情况pidstat -u 2输出列中%usr和%system分别对应进程在用户态和内核态的CPU使用率。CPU列显示该进程在哪个核心上运行。如果你想监控某个特定进程比如PID为1234的进程可以这样pidstat -u -p 1234 2实操心得排查CPU间歇性飙高的问题时单纯靠top实时看可能抓不到瞬间峰值。一个更有效的方法是使用pidstat进行一段时间的高频率采样并将结果重定向到文件事后分析。例如pidstat -u 1 60 cpu_log.txt这会对所有进程每秒采样一次持续60秒。4. 内存使用情况全面剖析内存管理是Linux系统的强项但也因此变得复杂。我们常说的“内存快满了”可能是一种误解需要正确理解free命令的输出。4.1 理解 free 命令的输出奥秘直接运行free输出单位是KB可读性差。我们通常用free -h人类可读格式或free -m以MB为单位。$ free -h total used free shared buff/cache available Mem: 7.7Gi 2.1Gi 1.5Gi 345Mi 4.1Gi 5.0Gi Swap: 2.0Gi 0.0Ki 2.0Gi这里的关键是理解每一列的含义尤其是used,free,buff/cache,availabletotal: 物理内存总量。used: 已使用的内存。注意这个值包含了buffers和cached所以它往往很大不代表应用程序实际占用了这么多。free: 完全未被使用的内存。在Linux系统运行一段时间后这个值通常会很小这完全是正常且健康的因为Linux会利用空闲内存来做磁盘缓存cache和缓冲区buffer以提升性能。shared: 主要是tmpfs内存文件系统如/dev/shm使用的内存。buff/cache: 这是核心所在。buffers是内核缓冲区用于存储磁盘块的元数据等cache是页缓存用于缓存从磁盘读取的文件内容。这部分内存在应用程序需要时可以被立即回收。所以它算作“已用”但实际上是“可用的”。available:这是你最应该关注的指标。它估算的是在不进行Swap交换的情况下可以分配给新启动的应用程序的内存大小。它包含了free内存和大部分可回收的buff/cache内存。只要available内存还充足系统就不会因为内存压力而变慢。所以判断内存是否紧张不要看free是否接近0而要看available是否充足。当available内存很低时系统会开始频繁地使用Swap。4.2 使用 top/htop 和 ps 查看进程内存在top或htop的进程列表中关于内存的列主要有VIRT(Virtual Memory): 虚拟内存大小。进程申请的总地址空间包括代码、数据、共享库、以及申请了但未使用的如malloc未实际写入内存。这个值可能很大参考意义有限。RES(Resident Memory): 常驻内存大小。进程实际使用的物理内存不含Swap。这个值包含了该进程独占的内存和与其他进程共享的内存如共享库。这是判断一个进程消耗多少物理内存的主要指标。SHR(Shared Memory): 共享内存大小。RES中可以被其他进程共享的部分主要是共享库。%MEM: 进程使用的物理内存RES占总物理内存的百分比。一个更精确的查看进程内存的命令是psps aux --sort-%mem | head -10这条命令按内存使用率降序排列显示前10个进程。aux选项列出了所有用户的进程详细信息。4.3 深入排查/proc/meminfo 与 slabtop如果你对内存细节有极致追求可以查看/proc/meminfo文件cat /proc/meminfo这个文件提供了free命令数据的原始来源并且信息量巨大包括各种内存细项活动/非活动匿名页缓存、脏页、写回页、Slab内存内核对象缓存等。当遇到特殊的内存泄漏问题尤其是内核模块或驱动导致时这里的数据是重要的排查依据。Slab是内核用于缓存常用数据结构如inode, dentry的机制。使用slabtop命令可以像top一样实时查看Slab缓存的使用情况sudo slabtop -o-o表示按当前占用大小排序。如果发现某个对象如dentry数量异常庞大可能意味着文件系统缓存了过多的目录项在某些场景下需要关注。5. 网络资源监控与连接分析网络问题排查往往更复杂因为它涉及本地状态、远程主机、协议和流量。我们从连接状态和流量监控两个层面来看。5.1 使用 ss 命令替代 netstat 分析连接netstat命令历史悠久但在处理大量连接时效率较低。ss(socket statistics) 是它的现代替代品速度更快信息更直接。基本语法也类似。查看所有已建立的TCP连接ss -t state established查看所有监听中的端口ss -tuln-t: TCP协议-u: UDP协议-l: 仅显示监听中的套接字-n: 以数字形式显示地址和端口不进行DNS解析和服务名查询速度更快-p: 显示使用该套接字的进程信息需要sudo权限一个非常实用的组合是查看所有TCP连接及其对应的进程sudo ss -tunap输出中Local Address:Port和Peer Address:Port显示了本地和远端的地址端口对users:后面则显示了进程ID和名称。这对于找出“谁在连接我的哪个端口”或者“我的程序在连接谁”至关重要。5.2 实时网络流量监控iftop 与 nethogsifconfig或ip -s link可以查看网卡收发数据包的总字节数但无法知道流量具体流向。iftop可以实时显示网络带宽的使用情况按主机对进行排序。安装sudo apt install iftop使用sudo iftop -i eth0将eth0替换为你的网卡名可以用ip addr查看iftop界面分为三部分顶部是刻度条中间是当前流量最大的主机对列表显示发送/接收速率和累计流量底部是统计信息。你可以按h键查看帮助按p切换显示端口号。iftop告诉你流量在哪些IP之间流动而nethogs则告诉你流量是由哪个进程产生的。这对于发现后台进程偷偷上传下载非常有效。安装sudo apt install nethogs使用sudo nethogs eth0nethogs界面类似top按进程显示实时的下载和上传速率KB/s。你可以按m在KB/s、KB、B、MB等不同单位间切换。5.3 网络性能基准测试iperf3当你怀疑网络带宽或质量有问题时需要进行实测。iperf3是一个专业的网络性能测试工具。测试需要两台机器一台作为服务器一台作为客户端。在服务器端假设IP为192.168.1.100运行sudo apt install iperf3 iperf3 -s在客户端运行iperf3 -c 192.168.1.100这会进行默认的TCP带宽测试。你可以添加参数进行更复杂的测试例如测试UDP性能并指定带宽iperf3 -c 192.168.1.100 -u -b 100M。测试结果会显示带宽、抖动、丢包率等关键指标。6. 综合监控与自动化脚本实践掌握了单个工具后我们可以将它们组合起来形成更强大的监控方案或者制作成自动化脚本用于定期检查或故障排查。6.1 使用 glances 进行一站式监控glances是一个跨平台的、基于 curses 库或 Web 界面的综合监控工具。它在一个屏幕上集成了CPU、内存、交换分区、负载、网络、磁盘I/O、文件系统、传感器温度等几乎所有信息。安装sudo apt install glances运行glances在终端界面你可以用c键按CPU排序m键按内存排序d键显示/隐藏磁盘I/O。更强大的是它支持以Web服务器模式运行glances -w然后你就可以在浏览器中访问http://你的机器IP:61208来查看监控面板了这对于远程监控非常方便。6.2 编写一个简单的资源监控脚本我们可以写一个Bash脚本定期收集关键指标并记录到日志文件便于事后分析。#!/bin/bash # 文件名system_monitor.sh LOG_FILE/var/log/system_monitor.log INTERVAL5 # 采集间隔单位秒 while true; do TIMESTAMP$(date %Y-%m-%d %H:%M:%S) # 1. 获取CPU负载1分钟平均 LOAD1$(uptime | awk -Fload average: {print $2} | cut -d, -f1 | tr -d ) # 2. 获取内存可用量 (MB) AVAIL_MEM$(free -m | awk /^Mem:/ {print $7}) # 3. 获取根文件系统使用率 DISK_USAGE$(df -h / | awk NR2 {print $5} | tr -d %) # 4. 获取最耗CPU的进程前1个 TOP_PROCESS$(ps aux --sort-%cpu | head -2 | tail -1 | awk {print $11, $3%}) # 5. 获取总TCP连接数 TCP_CONN$(ss -t state all | wc -l) # 连接数需要减去第一行标题行 TCP_CONN$((TCP_CONN - 1)) echo [$TIMESTAMP] Load1:$LOAD1, AvailableMem:${AVAIL_MEM}MB, DiskUsage:${DISK_USAGE}%, TopProcess:$TOP_PROCESS, TCPConn:$TCP_CONN $LOG_FILE sleep $INTERVAL done这个脚本每5秒采集一次系统负载、可用内存、磁盘使用率、最耗CPU的进程和TCP连接总数并追加记录到日志文件中。你可以使用nohup ./system_monitor.sh 让它在后台运行。请注意这个脚本比较简单实际生产环境中可能需要更严谨的错误处理和更丰富的指标。6.3 利用 watch 命令动态观察如果你不想写脚本只是想临时、动态地观察某个命令的输出变化watch命令是你的好朋友。它定期执行指定的命令并全屏刷新显示结果。例如每2秒刷新一次内存使用情况watch -n 2 free -h动态观察网络连接数的变化watch -n 1 ss -t state all | tail -n 2 | wc -l-n指定间隔秒数。按CtrlC退出。这是一个快速进行现场诊断的轻量级方法。7. 常见问题排查与性能优化思路掌握了监控工具最终目的是解决问题。下面是一些典型场景的排查思路。7.1 CPU使用率100%问题排查流程定位进程使用top或htop按P按CPU%排序找到占用最高的进程。记下其PID。分析进程类型如果是java,python,node等应用进程可能是业务逻辑陷入死循环、算法复杂度高、或频繁GC。如果是ksoftirqd,kworker等内核线程可能硬件中断过多或者有内核模块bug。如果是dd,gzip等工具属于正常的高CPU占用。深入进程内部对于Java应用使用jstack PID打印线程栈查看哪些线程在运行。通常CPU高的线程会在栈顶显示其正在执行的方法。对于C/C等原生程序可以使用perf工具进行性能剖析sudo perf top -p PID。使用pidstat查看该进程的用户态和内核态CPU占比。如果%system异常高说明系统调用频繁可能涉及大量I/O或锁竞争。检查I/O等待在top中观察%wa值。如果很高说明CPU在等待磁盘瓶颈在I/O。此时应使用iotop命令查看是哪个进程在进行大量磁盘读写。7.2 内存不足与Swap频繁使用当available内存很少且siswap in和soswap out在vmstat或top中持续不为0时说明系统正在频繁使用交换分区这会严重拖慢性能。确认罪魁祸首使用htop按M按内存RES排序或ps aux --sort-%mem找到消耗物理内存最多的进程。分析内存使用对于可疑进程可以查看其更详细的内存映射sudo pmap -x PID。输出末尾的total kB大致对应RES。你也可以查看/proc/PID/smaps文件了解其内存的具体分布匿名页、文件映射页等。检查内存泄漏如果某个进程的RES或VIRT随时间持续增长且没有合理的业务逻辑对应可能存在内存泄漏。可以使用valgrind针对开发测试或持续监控/proc/PID/status文件中的VmRSS和VmSize字段来观察。调整Swappiness内核参数vm.swappiness0-100控制系统使用Swap的倾向。值越高越倾向于使用Swap。对于数据库服务器或追求性能的桌面可以尝试调低如设置为10。临时修改sudo sysctl vm.swappiness10永久修改在/etc/sysctl.conf中添加vm.swappiness10后执行sudo sysctl -p。7.3 网络连接数过多或端口占用遇到“Address already in use”错误或怀疑有服务异常占用端口时查找端口占用者sudo ss -tlnp | grep :端口号例如sudo ss -tlnp | grep :80。-l表示监听-n数字显示-p显示进程。分析大量连接如果连接数异常多如ss -t state all | wc -l返回数万使用sudo ss -t state established -p查看已建立连接的进程。可能是程序没有正确关闭连接连接泄漏或是正在遭受网络攻击如CC攻击。监控异常连接使用iftop查看是否有异常的IP在产生大量流量。使用sudo netstat -natp | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -n可以统计出每个远程IP建立了多少到本机的TCP连接快速找出连接数最多的IP。7.4 磁盘I/O成为瓶颈系统响应慢但CPU和内存都不高很可能是磁盘I/O瓶颈。全局监控使用iostat命令来自sysstat包iostat -dx 2。关注%util列它表示设备带宽利用率。如果持续接近100%说明磁盘I/O饱和。同时观察await列它表示I/O请求的平均等待时间毫秒如果很高如超过20ms说明磁盘响应慢。定位进程使用iotop命令需安装sudo apt install iotop来查看是哪些进程在进行磁盘读写以及它们的读写速率。分析类型是大量随机小IO常见于数据库还是顺序大IO常见于日志写入、文件拷贝可以使用pidstat -d命令查看进程的IO统计数据。解决方案优化程序逻辑减少IO、使用更快的存储如SSD、增加内存以提供更大的磁盘缓存、或者对磁盘进行RAID配置提升性能。工具是死的思路是活的。真正的排查过程往往是多个工具组合使用根据初步线索层层深入。记住一个核心原则先从全局top,htop,glances把握系统整体健康状况再根据异常指标使用专项工具pidstat,iotop,iftop进行下钻分析最终定位到具体的进程、线程甚至代码行。这套方法论远比死记硬背命令参数更重要。