本文将围绕问题,介绍如何通过标准 Linux 工具快速查找、分析系统错误、资源饱和度(指资源负载超过其处理能力),全文涉及的命令输出都很容易理解,有助于快速评估系统性能和资源利用率。
指令
描述

uptime
报告系统正常运行时间;
dmesg | tail
显示系统内核的日志信息;
vmstat
报告虚拟内存统计信息;
mpstat -P ALL 1
报告处理器静态数据;
pidstat 1
报告全部/指定 进程 CPU、内存等统计信息;
iostat -xz 1
报告 CPU、磁盘 I/O 和 NFS 统计信息;
free -m
显示系统可用/已用内存;
sar -n DEV 1
系统运行状态统计工具;
sar -n TCP,ETCP 1
/
top
显示系统各个进程资源占用;
其中一些命令需要安装 sysstat 软件包(ubuntu:apt-get install sysstat)。
下文将总结这些命令,并通过示例,解释如何通过指标进行性能分析。
2. 性能分析工具集2.1 uptimeuptime 是一个查看系统负载平均值的快速方法,当用于分析 Linux 性能瓶颈时,主要关注系统的运行时间、当前登录用户数量以及负载平均值。负载平均值是关键指标,它显示系统在过去 1 分钟、5 分钟和 15 分钟内的平均负载。
root@jpzhang-dev:~# uptime 10:55:34 up 17 days, 1:30, 2 users, load average: 0.18, 0.07, 0.02
输出解释
10:55:34:当前时间;up 17 days, 1:30:系统已运行的时间,这里表示系统已经连续运行了 17 天 1 小时 30 分钟;2 users:当前登录到系统的用户数量;load average: 0.18, 0.07, 0.02:系统的负载平均值,分别表示最近 1 分钟、5 分钟和 15 分钟的平均负载。负载分析
单核系统(假设系统有 1 个 CPU 核心):load average: 1.0 表示系统完全忙碌;load average: >1.0 表示系统超负荷运行,可能存在性能瓶颈;多核系统(假设系统有 4 个 CPU 核心):load average: 4.0 表示系统完全忙碌;load average: >4.0 表示系统超负荷运行,可能存在性能瓶颈;负载趋势:如果 1 分钟的负载明显高于 5 分钟和 15 分钟的负载,表示系统负载最近增加;如果 1 分钟的负载明显低于 5 分钟或者 15 分钟,表示系统负载降低,可以查看过去一段时间系统情况分析瓶颈;如果 5 分钟和 15 分钟的负载都很高,表示系统长时间负载过高;2.2 dmesg | tail通常用于查看启动信息、硬件错误和内核调试消息;
root@jpzhang-dev:~# dmesg | tail[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0[...][1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP counters.
如果存在内核日志,通过上述命令可查看最近 10 条系统信息,用于查找可能导致性能问题的错误,例如上述输出包括 oom-killer 和 TCP 丢弃请求。
2.3 vmstatvmstat 是虚拟内存统计(virtual memory stat)的简称, 显示系统各种性能指标,包括内存使用情况、CPU、进程、块 I/O 等。
可以指定间隔时间(秒)和报告次数。例如,每秒报告一次,共报告五次:
root@jpzhang-dev:~# vmstat 1 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b 交换 空闲 缓冲 缓存 si so bi bo in cs us sy id wa st 0 0 0 10905632 222008 11675420 0 0 0 3 1 1 1 0 99 0 0 0 0 0 10905632 222008 11675420 0 0 0 0 2992 3643 1 0 99 0 0 0 0 0 10905560 222008 11675420 0 0 0 0 1273 2433 0 0 100 0 0 0 0 0 10905560 222008 11675420 0 0 0 1400 1409 2512 0 0 99 0 0 0 0 0 10905560 222008 11675420 0 0 0 0 1248 2397 0 0 100 0 0
关键指标分析
procs(进程)r:运行队列中的进程数(等待运行的进程数)如果这个数值大于系统的 CPU 核心数,说明系统 CPU 过载;b:不可中断睡眠状态的进程数,高值可能表示 I/O 问题或资源争用;memory(内存)swpd:已使用的交换内存,高值表示物理内存不足,系统正在使用交换内存;free:空闲内存,低值可能表示内存使用过高;buff & cache:用作缓冲区和缓存的内存。一般情况下,系统会尽量使用可用内存进行缓存,以提高性能;swap(交换)si:从磁盘交换到内存的交换输入量(swap in);so:从内存交换到磁盘的交换输出量(swap out); si 和 so:非零值表示系统正在使用交换内存,由于物理内存不足导致。高的 si 或 so 值表示内存不足,需要增加物理内存或减少内存消耗。io(I/O)bi:块设备的块输入量(块读取);bo:块设备的块输出量(块写入); 高值表示大量的磁盘 I/O 操作,可能存在磁盘瓶颈;system(系统)in:每秒的中断数,包括时钟中断,高值可能表示硬件或驱动程序问题;cs:每秒的上下文切换数,高值可能表示进程间的频繁切换,通常与高 r 值有关;cpuus:用户态的 CPU 时间百分比,高值表示用户进程消耗大量 CPU 资源,如果系统整体运行良好,这不一定是问题;sy:内核态的 CPU 时间百分比,高值表示内核进程消耗大量 CPU 资源,如果超过 20%,需要进一步分析内核的 I/O 处理效率,可能需要优化内核配置或硬件;id:空闲的 CPU 时间百分比,低值表示 CPU 使用率高;wa:等待 I/O 的 CPU 时间百分比,恒定高值表示 CPU 大部分时间在等待 I/O 操作,可能存在磁盘瓶颈,这意味着 CPU 大部分时间处于空闲状态,因为任务在等待磁盘 I/O 时被阻塞;st:被虚拟机使用的 CPU 时间百分比,高值表示虚拟化环境中,宿主机的资源不足;2.4 mpstat -P ALL 1用于监控和报告各个 CPU 的使用情况。使用 mpstat -P ALL 1 命令,可以每秒打印一次所有 CPU 的详细使用情况,这对于检查 CPU 使用是否存在不平衡以及识别单个 CPU 过热问题非常有帮助。
以下是该命令的具体使用和输出解释:
root@jpzhang-dev:~# mpstat -P ALL 1Linux 5.4.0-186-generic (jpzhang-dev) 07/01/24 _x86_64_ (16 CPU)14:52:45 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle14:52:46 all 0.31 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.6914:52:46 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 8 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.0014:52:46 9 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 11 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 12 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 13 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0014:52:46 15 4.08 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 95.92
输出解释
CPU:CPU ID 及所有 CPU 的总和(all);%usr:用户态 CPU 使用率(不包括 nice 优先级);%nice:nice 优先级用户态 CPU 使用率;%sys:内核态 CPU 使用率;%iowait:CPU 等待 I/O 操作时间百分比;%irq:硬中断处理时间百分比;%soft:软中断处理时间百分比;%steal:虚拟机窃取的 CPU 时间百分比;%guest:虚拟 CPU 时间百分比;%gnice:虚拟机中 nice 优先级 CPU 时间百分比;%idle:CPU 空闲时间百分比;负载分析
检查各 CPU 的使用情况通过比较不同 CPU 的 %usr、%sys 和 %idle 值,可以判断是否存在负载不均衡。例如:如果某个 CPU 的 %usr 或 %sys 明显高于其他 CPU,这可能表示单线程应用程序正在占用该 CPU。高的 %iowait 值表示该 CPU 正在等待 I/O 操作,可能存在磁盘或网络瓶颈。如果某个 CPU 的 %idle 值明显低于其他 CPU,说明该 CPU 比其他 CPU 更忙。识别单个 CPU 过热单个 CPU 使用率高(例如 %usr 或 %sys 高于 80%)可以判断单线程应用程序,对于多核系统,这种情况可能导致该 CPU 过热,从而影响整体性能。系统整体负载情况查看 all 行的数据,可以了解整个系统的平均 CPU 使用情况。结合单个 CPU 的数据,可以更全面地了解系统负载是否均衡。2.5 pidstat 1pidstat 命令有点类似 top,用于报告各个进程的统计信息,但它打印的是滚动摘要而不是清屏。这对观察一段时间内的模式很有用。
pidstat 命令的基本语法如下:
pidstat [options] [interval [count]]
interval:每次采样的时间间隔(以秒为单位);count:采样的次数;
常用选项:
-u:报告 CPU 使用情况;包括用户态、系统态、虚拟机等,关键指标如下:%usr:用户态 CPU 时间百分比;%system:系统态 CPU 时间百分比;%guest:虚拟 CPU 时间百分比;%CPU:总的 CPU 使用时间百分比;-r:报告内存使用情况;关键指标如下:minflt/s:每秒次级页面错误数;majflt/s:每秒主要页面错误数;VSZ:虚拟内存大小;RSS:常驻集大小;%MEM:内存使用百分比;-d:报告 I/O 使用情况;关键指标如下:kB_rd/s:每秒读取的 KB 数;kB_wr/s:每秒写入的 KB 数;kB_ccwr/s:每秒取消的写入 KB 数;-p :指定一个或多个进程 ID;-h:显示柱状图格式的输出;root@jpzhang-dev:~# pidstat -r 1Linux 5.4.0-186-generic (jpzhang-dev) 07/01/24 _x86_64_ (16 CPU)07:41:02 PM UID PID %usr %system %guest %CPU CPU Command07:41:03 PM 0 9 0.00 0.94 0.00 0.94 1 rcuos/007:41:03 PM 0 4214 5.66 5.66 0.00 11.32 15 mesos-slave07:41:03 PM 0 4354 0.94 0.94 0.00 1.89 8 java07:41:03 PM 0 6521 1596.23 1.89 0.00 1598.11 27 java07:41:03 PM 0 6564 1571.70 7.55 0.00 1579.25 28 java07:41:03 PM 60004 60154 0.94 4.72 0.00 5.66 9 pidstat07:41:03 PM UID PID %usr %system %guest %CPU CPU Command07:41:04 PM 0 4214 6.00 2.00 0.00 8.00 15 mesos-slave07:41:04 PM 0 6521 1590.00 1.00 0.00 1591.00 27 java07:41:04 PM 0 6564 1573.00 10.00 0.00 1583.00 28 java07:41:04 PM 108 6718 1.00 0.00 0.00 1.00 0 snmp-pass07:41:04 PM 60004 60154 1.00 4.00 0.00 5.00 9 pidstat
上面示例,可以分析确认消耗 CPU 的两个 java 进程,%CPU 列是所有 CPU 的总和;1591% 表明该 java 进程消耗了近 16 个 CPU。
2.6 iostat -xz 1用于监控系统输入/输出设备性能统计信息。使用 iostat -xz 1 命令,可以每秒钟输出一次所有设备的详细性能指标。
iostat -xz 1
-x:显示扩展的 I/O 统计信息,包括每个设备的 I/O 速率和延迟等详细信息;-z:忽略所有零活动的设备;1:每秒钟刷新一次输出;
root@jpzhang-dev:~# iostat -xz 1Linux 5.4.0-186-generic (jpzhang-dev) 07/01/24 _x86_64_ (16 CPU)avg-cpu: %user %nice %system %iowait %steal %idle 0.56 0.00 0.75 0.00 0.00 98.68Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz aqu-sz %utilvda 0.00 0.00 0.00 0.00 0.00 0.00 12.00 88.00 13.00 52.00 0.33 7.33 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.20
平均 CPU 使用情况:
avg-cpu: %user %nice %system %iowait %steal %idle 0.44 0.00 0.13 0.00 0.00 99.44
指标与上文类似,这里不在继续说明。
设备使用情况:
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz aqu-sz %utilvda 0.00 0.00 0.00 0.00 0.00 0.00 12.00 88.00 13.00 52.00 0.33 7.33 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.20
r/s:每秒读取请求数;w/s:每秒写入请求数;高 r/s 和 w/s 值表示大量的 I/O 活动,可能是由于应用程序高负载或数据库操作引起;rkB/s:每秒读取的千字节数;wkB/s:每秒写入的千字节数;高 rkB/s 和 wkB/s 值表示大量的数据传输,可能是大文件操作或数据备份等;rrqm/s:每秒合并的读取请求数;wrqm/s:每秒合并的写入请求数;r_await:读取请求的平均等待时间(毫秒);w_await:写入请求的平均等待时间(毫秒);高 r_await 和 w_await 值表示 I/O 请求的等待时间较长,可能是磁盘速度慢或 I/O 请求过多阻塞导致的;svctm:请求的平均服务时间(毫秒);%util:设备利用率,即设备在处理 I/O 请求所花费的时间百分比,值大于 60% 通常会导致性能不佳,但这取决于设备,接近 100% 通常表示饱和;
【注意】对于一个逻辑磁盘而言,其面向多个后端物理磁盘,100% 的利用率并不一定表示所有的后端磁盘都已经达到了饱和状态。这是因为逻辑磁盘可以并行地将 I/O 请求分发到多个后端磁盘上,即使一个后端磁盘已经满负荷运行,其他磁盘可能仍有处理能力。
磁盘 I/O 性能不佳不一定是应用程序本身的问题。通常,系统会采用多种技术来优化磁盘 I/O 的处理,这些技术可以显著减少应用程序因为 I/O 操作而发生的阻塞和延迟,例如:异步 I/O、预读取(Prefetching)、写入缓冲(Write Buffering)、文件系统缓存等。
2.7 free -mroot@jpzhang-dev:~# free -m total used free shared buffers cachedMem: 245998 24545 221453 83 59 541-/+ buffers/cache: 23944 222053Swap: 0 0 0
buffers:用于块设备 I/O 的缓冲区缓存;cached:用于文件系统的页面缓存;
buffers 和 cached 接近零:这可能意味着系统正在频繁地从磁盘读取数据,而不是从缓存中读取。这种情况通常会导致更高的磁盘 I/O,从而影响系统性能(使用 iostat 命令确认磁盘 I/O)。
如果系统上使用 ZFS 文件系统,内存使用输出可能会更加复杂。ZFS 有自己的文件系统缓存,free -m 的输出可能无法准确反映这些缓存。
2.8 sar -n DEV 1有效地监控网络接口的吞吐量,并评估是否达到了网络限制;
sar -n DEV 1
该命令每秒钟显示一次网络设备的统计信息,直到你停止它(通常通过按 Ctrl+C)。
root@jpzhang-dev:~# sar -n DEV 1Linux 5.4.0-186-generic (jpzhang-dev) 07/01/24 _x86_64_ (16 CPU)12:00:01 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s12:00:02 AM eth0 3000.00 4000.00 22000.00 28000.00 0.00 0.00 0.0012:00:02 AM eth1 1500.00 1800.00 10000.00 12000.00 0.00 0.00 0.00
IFACE:网络接口名称(例如,eth0,lo);rxpck/s:每秒接收的数据包数;txpck/s:每秒发送的数据包数;rxkB/s:每秒接收的千字节数;txkB/s:每秒发送的千字节数;rxcmp/s:每秒接收的压缩数据包数;txcmp/s:每秒发送的压缩数据包数;rxmcst/s:每秒接收的多播数据包数;
负载分析
计算网络接口吞吐量接收速率(rxkB/s):22000 kB/s发送速率(txkB/s):28000 kB/seth0:换算为 Mbits/sec28000 kB/s = 28000 8 = 224000 Kbits/s = 224 Mbits/s22000 kB/s = 22000 8 = 176000 Kbits/s = 176 Mbits/s接收速率:发送速率:比较与网络限制假设 eth0 接口的最大带宽是 1 Gbit/s:1 Gbit/s = 1000 Mbits/s综上,在这个例子中:eth0 接收速率:176 Mbits/s(远低于 1 Gbit/s),eth0 发送速率:224 Mbits/s(远低于 1 Gbit/s)。
结论:eth0 的接收速率和发送速率都远低于 1 Gbit/s 的限制,因此没有达到网络接口的带宽限制。
2.9 sar -n TCP,ETCP 1监控 TCP 协议和扩展 TCP 统计信息;
root@jpzhang-dev:~# sar -n TCP,ETCP 1Linux 5.4.0-186-generic (jpzhang-dev) 07/01/24 _x86_64_ (16 CPU)16:22:32 active/s passive/s iseg/s oseg/s16:22:33 4.00 0.00 9.00 9.0016:22:32 atmptf/s estres/s retrans/s isegerr/s orsts/s16:22:33 4.00 0.00 0.00 0.00 4.00
关键 TCP 指标:
TCP 统计信息: active/s:每秒本地(主动)启动的 TCP 连接数; passive/s:每秒远程(被动)启动的 TCP 连接数; iseg/s:每秒接收到的 TCP 段数; oseg/s:每秒发送的 TCP 段数;
扩展 TCP 统计信息: atmptf/s:每秒尝试失败的 TCP 连接数; estres/s:每秒重置的 TCP 连接数; retrans/s:每秒重传的 TCP 段数; isegerr/s:每秒接收到的错误 TCP 段数; oseg/s:每秒发送的 TCP 段数;
负载分析
检查 TCP 连接的活跃性(active/s 和 passive/s):active/s 指发起的连接数。如果该值很高,表示有大量的客户端发起连接请求。passive/s 指接收的连接数。如果该值很高,表示服务器处理了大量的连接请求。检查 TCP 传输情况(iseg/s 和 oseg/s)iseg/s 和 oseg/s:高值可能表示有大量的数据在传输,可能会导致网络拥塞。检查 TCP 错误和重传atmptf/s:尝试失败的连接数。如果该值不为零,表示有连接失败的情况,可能是由于网络问题或服务器负载过高。estres/s:被重置的连接数。如果该值很高,表示有大量的连接被重置,可能是由于网络不稳定或防火墙配置问题。retrans/s:重传的 TCP 段数。如果该值很高,可能是网络不可靠(如公共互联网),也可能是服务器负载过重而丢弃数据包。isegerr/s:接收到的错误 TCP 段数。如果该值不为零,表示有错误的 TCP 段被接收,可能是网络问题或硬件故障导致。2.10 toptop - 16:35:41 up 17 days, 7:11, 1 user, load average: 0.01, 0.12, 0.12任务: 433 total, 1 running, 432 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.4 us, 0.2 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stMiB Mem : 32098.5 total, 10438.8 free, 9969.2 used, 11690.5 buff/cacheMiB Swap: 0.0 total, 0.0 free, 0.0 used. 21147.5 avail Mem 进程号 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND 75809 jpzhang 20 0 16.2g 5.4g 591776 S 6.3 17.1 1223:07 java 971 root 20 0 2191672 109964 13420 S 4.0 0.3 633:54.87 sys-layer 175431 jpzhang 20 0 33.4g 560984 342044 S 1.0 1.7 49:51.25 msedge 234474 root 20 0 12836 4512 3400 R 0.7 0.0 0:00.05 top 691 root rt 0 280136 17948 8208 S 0.3 0.1 2:42.47 multipathd 1708 systemd+ 20 0 32528 7240 4600 S 0.3 0.0 54:44.43 redis-server 5486 jpzhang 20 0 1168024 120840 68096 S 0.3 0.4 16:53.62 gnome-terminal- 201216 jpzhang 20 0 85172 69092 18868 S 0.3 0.2 7:07.83 python3.12 226452 root 20 0 0 0 0 I 0.3 0.0 0:00.19 kworker/3:2-events 233760 jpzhang 20 0 1157.3g 108848 72612 S 0.3 0.3 0:07.15 msedge 1 root 20 0 170004 13668 8612 S 0.0 0.0 0:34.54 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.36 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
top 命令整合了我们之前检查过的多个性能指标,缺点是,它不支持滚动输出,这意味着无法持续查看历史数据,而是只能显示当前的系统状态。
感谢您花时间阅读文章!关注公众号不迷路!