一、课程介绍
本课程聚焦于 Linux 系统性能监控与分析,主要围绕 CPU、内存、网络和磁盘等硬件资源的监控指令及相关概念展开。通过学习,初学者能够掌握使用top、free、sar等指令查看系统资源使用状况,理解系统性能指标的含义,为系统优化和故障排查提供帮助。
二、CPU 性能监控
(一)top 指令基础
指令概述:top指令是 Linux 系统中常用的性能分析工具,可实时展示系统中各个进程的资源占用情况,类似 Windows 的任务管理器,在终端直接输入top即可运行。输出内容如下类似:
top - 09:36:31 up 1 day, 21 min, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 98 total, 1 running, 97 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1967.5 total, 822.8 free, 315.4 used, 991.6 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1652.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 22888 14728 10248 S 0.0 0.7 0:07.05 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 第一行显示当前时间、服务器运行时长、登录用户数以及 CPU 1/5/15 分钟的平均负载
第二行展示总进程数、正在运行的进程数、睡眠进程数、停止进程数和僵尸进程数
第三行展示CPU使用情况
0.0 us:用户空间占用 CPU 的百分比为 0.0%,即用户进程使用 CPU 的时间占总 CPU 时间的比例。
0.0 sy:系统内核空间占用 CPU 的百分比为 0.0% ,代表系统内核执行任务所占用的 CPU 时间比例。
0.0 ni:改变过优先级的用户进程占用 CPU 的百分比为 0.0% 。
100.0 id:CPU 空闲时间百分比为 100.0%,说明目前 CPU 没有被任何进程占用,处于空闲状态。
0.0 wa:等待输入输出(I/O)的 CPU 时间百分比为 0.0% ,如果该值较高,说明系统可能存在 I/O 瓶颈。
0.0 hi:硬中断(Hardware IRQ)占用 CPU 的百分比为 0.0% ,硬中断是由硬件设备产生的中断请求。
0.0 si:软中断(Software Interrupts)占用 CPU 的百分比为 0.0% ,软中断是由软件触发的中断,用于处理一些特定的系统任务。
0.0 st:被虚拟机偷走的 CPU 时间百分比为 0.0% ,在虚拟机环境中,如果宿主机资源紧张,可能会出现虚拟机占用过多 CPU 资源的情况。第四行展示内存的使用情况
1967.5 total:系统的总内存大小为 1967.5MiB。
822.8 free:空闲内存为 822.8MiB,这部分内存未被任何进程使用。
315.4 used:已使用的内存为 315.4MiB,即当前被进程占用的内存量。
991.6 buff/cache:用于缓存和缓冲区的内存为 991.6MiB ,缓存主要用于加速文件系统的访问,缓冲区用于存储内核和磁盘 I/O 的数据。
1652.0 avail Mem:可用内存为 1652.0MiB,这是系统认为可以立即分配给进程使用的内存量,它不仅仅包括空闲内存,还包含了部分可回收的缓存和缓冲区内存。第五行展示SWAP分区的使用情况
0.0 total:Swap分区总大小
0.0 free:空闲Swap分区容量
0.0 used:已使用Swap分区容量第六行开始显示进程信息,进程 ID(PID)、所有者用户名(USER)、任务优先级(PR)、NICE 值(NI)、虚拟内存总量(VIRT)、物理内存总量(RES)、共享内存大小(SHR)、进程状态(S)、CPU 利用率(% CPU)、内存利用率(% MEM)、总 CPU 占用时间(TIME+)以及命令行(COMMAND)
其中进程状态分类: S-睡眠;R-运行;D-不可中断的睡眠;T-停止;Z-僵尸进程
进程信息:包括。例如,8347 root 20 0 304948 46544 21040 S 12.3 2.3 0:00.37 node,表示进程 ID 为 8347,所有者是 root,优先级 20,NICE 值 0,使用虚拟内存 304948KB,占用物理内存 46544KB 等信息。
常用参数
top -H -p [PID]:用于查看特定 PID 进程的详细信息。
top -n [NUM]:设定输出top信息的次数,默认会持续输出。
top -d [Second]:指定输出的时间间隔,单位为秒。
交互参数
P:按 CPU 利用率从高到低排序。
M:按 Memory 利用率从高到低排序。
T:按累计时间排序。
f/F:添加或删除进程相关信息的显示。
m:切换内存显示方式。
t:切换进程和 CPU 状态的显示方式。
b:打开或关闭运行时进程的高亮显示。
l:查看所有逻辑 CPU 的信息。
q:退出top程序。三、内存使用情况查看
(一)free 指令详解
指令基础:free指令用于显示系统内存的使用情况,数据来源于/proc/meminfo文件,直接在终端输入free即可获取系统内存信息。
root@hk1-133-20-101:~# free
total used free shared buff/cache available
Mem: 2014700 323056 842292 1008 1015640 1691644
Swap: 0 0内存指标:默认单位为 KByte,包括总内存量(total)、已使用内存量(used)、空闲内存量(free)、共享内存量(shared)、缓存内存量(buff/cache)和可用内存量(available),它们之间的关系为[total] = [used] + [free] + [buff/cache]。
注意:[avaliable]值一般情况下会大于[free],小于[free]+[buffer/cache],因为在计算[available]时包含了可回收的缓存,但并不是所有的[buffer/cache]都可以回收。
Swap 分区指标:显示总 Swap 分区大小、已使用 Swap 分区大小和空闲 Swap 分区大小,关系为[total] = [used] + [free]。
常用参数
free -h/--human:以人类可读的方式显示内存信息,如将字节数转换为 GB、MB 等单位。
free -c [count]:指定显示free信息的次数。
free -k/-m/-g:分别以 KB、MB、GB 为单位显示内存信息。
(二)Swap 分区与 OOM
Swap 分区:Swap 分区本质上是磁盘上的空间,类似于 Windows 的虚拟内存,用于解决内存容量不足的问题。当内存不足时,系统会将部分数据虚拟成内存使用。不过,Swap 被使用通常意味着程序性能下降。可使用swapoff -a指令关闭 Swap 分区,此时其中的数据会回写
OOM,全称Out Of Memory:在程序运行时,若申请内存空间却无法获得足够内存,就会出现 OOM 错误。
发生 OOM 后,内核会采取 kill 进程的方式来释放内存,以维持系统的稳定运行。一般会优先 kill 掉内存占用量大的进程,但具体的策略与系统版本、配置等因素有关。如果 kill 的是用户态进程,通常会导致业务错误,但系统还能继续运行;然而,如果 kill 的是内核进程,那么系统可能会出现宕机的严重情况 。在某些系统中,可能会根据进程的优先级、运行时间等因素综合判断要 kill 的进程,以尽量减少对系统运行的影响。
OOM出现的几种情况:
有 Swap 分区且使用部分 Swap:当系统有 Swap 分区时,如果内存不足,系统会使用一部分 Swap 空间。此时程序性能会下降,但系统仍能继续运行 。比如在一些内存需求突然增加的场景中,系统会先尝试使用 Swap 分区来满足内存需求,不过由于磁盘读写速度远低于内存,程序的运行速度会明显变慢。
有 Swap 分区且使用全部 Swap 后:若内存持续不足,使用完整个 Swap 空间后,系统将发生 OOM 错误。这表明系统的内存资源已极度匮乏,无法满足程序的运行需求。
无 Swap 分区:当系统没有配置 Swap 分区时,一旦内存不足,会直接发生 OOM 错误 。这种情况下,系统没有额外的虚拟内存空间来缓冲,程序更容易出现异常。
四、IO性能
(一)什么是 IO
在 Linux 系统里,IO 代表输入 / 输出,涵盖内存 IO、网络 IO 和磁盘 IO 这三种类型。通常情况下,大家说的 IO 主要指网络 IO 和磁盘 IO,特别是磁盘 IO。比如我们日常使用网络下载文件,这涉及网络 IO;从硬盘读取数据,就涉及磁盘 IO 。
(二)吞吐和时延的概念
吞吐:指的是单位时间内系统处理的信息量,常用字节 / 秒(B/s)、千字节 / 秒(KB/s)等作为单位。举例来说,磁盘的吞吐量就是在单位时间内磁盘读写的数据量,如果在 1 秒内磁盘读取了 100KB 的数据,那它的吞吐量就是 100KB/s。
时延:是指从发出请求到收到响应的时间间隔,其中包含处理时延、排队时延、传输时延等。就像网络请求,从客户端发送请求开始,到服务器返回响应所经历的时间就是网络请求的时延。
(三)网络IO性能监控
1.ifconfig是net-tools工具包里的一个工具,它能帮助我们查看网络相关信息。
安装net-tools工具包
sudo apt-get install net-tools查看所有网卡信息,如MAC地址、IP地址、收发包数量等。
ifconfig -a#第一个以太网接口:接口已启用(UP)、支持广播(BROADCAST)、正在运行(RUNNING)且支持多播(MULTICAST);mtu 1500表示最大传输单元为 1500 字节 。
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
#inet 10.133.20.101是分配给该接口的 IPv4 地址,netmask 255.255.255.0是子网掩码,broadcast 10.133.20.255是广播地址;
#inet6 fe80::d8:efff:fecc:3531是该接口的 IPv6 地址,prefixlen 64表示前缀长度,scopeid 0x20<link>表示作用域为链路本地 。
inet 10.133.20.101 netmask 255.255.255.0 broadcast 10.133.20.255
inet6 fe80::d8:efff:fecc:3531 prefixlen 64 scopeid 0x20<link>
#ether 02:d8:ef:cc:35:31是以太网硬件地址(MAC 地址),txqueuelen 1000表示传输队列长度为 1000 。
ether 02:d8:ef:cc:35:31 txqueuelen 1000 (Ethernet)
#RX packets 768618表示接收的数据包数量为 768,618 个,bytes 1622467688 (1.6 GB)表示接收的字节数为 1.6GB ;
#RX errors 0表示接收过程中无错误,dropped 0表示没有数据包被丢弃,overruns 0表示无超限错误,frame 0表示无帧错误 。
RX packets 768618 bytes 1622467688 (1.6 GB)
RX errors 0 dropped 0 overruns 0 frame 0
#TX packets 560755表示发送的数据包数量为 560,755 个,bytes 37491415 (37.4 MB)表示发送的字节数为 37.4MB;
#TX errors 0表示发送过程中无错误,dropped 0表示没有数据包被丢弃,overruns 0表示无超限错误,carrier 0表示无载波错误,collisions 0表示无冲突 。
TX packets 560755 bytes 37491415 (37.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#本地回环地址接口:flags=73<UP,LOOPBACK,RUNNING>表明该接口已启用、是回环接口且正在运行;mtu 65536表示最大传输单元为 65,536 字节 。
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
#inet 127.0.0.1是 IPv4 回环地址,netmask 255.0.0.0是子网掩码;
#inet6 ::1是 IPv6 回环地址,prefixlen 128表示前缀长度,scopeid 0x10<host>表示作用域为主机本地
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
#loop表示这是一个回环接口,txqueuelen 1000表示传输队列长度为 1000 。
loop txqueuelen 1000 (Local Loopback)
#RX packets 22009和TX packets 22009都表示数据包数量为 22,009 个,bytes 3519427 (3.5 MB)表示接收和发送的字节数均为 3.5MB;
#接收和发送的错误、丢弃、超限、载波及冲突统计均为 0,说明回环接口的通信正常 。
RX packets 22009 bytes 3519427 (3.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22009 bytes 3519427 (3.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 02.sar是一个强大的系统监控工具,可用于监控 CPU、内存、磁盘、网络等硬件资源的指标。
安装sar
sudo apt install sysstat监控所有网口的流速,以两秒的间隔
sar -n DEV 2输出信息中的IFACE表示网口,rxpck/s是收包数量,txpck/s是发包数量,rxkB/s是收包字节数,txkB/s是发包字节数等。当进行数据传输,如下载代码时,网络流量会明显增加,我们可以通过这些指标来实时观察网络的使用情况 。
Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: eth0 1.36 1.33 0.12 0.49 0.00 0.00 0.00 0.00
Average: docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00sar还有很多其他参数,比如-u用于查看 CPU 相关指标,-r用于查看内存相关指标 。
例如,sar -u -s [start time] -e [end time](时间格式为hh:mm:ss)可以查看指定时间段内 CPU 的使用情况,包括用户空间(% user)、系统内核空间(% system)、空闲(% idle)等占比。
#假设你要统计当天上午 4 点到 10 点这一时间段内 CPU 的使用情况,可以使用以下命令
#时间是UTC时间
sar -u -s 04:00:00 -e 10:00:00
Linux 6.11.0-19-generic (hk1-133-20-101) 03/17/25 _x86_64_ (1 CPU)
04:00:02 CPU %user %nice %system %iowait %steal %idle
04:10:02 all 0.04 0.00 0.03 0.00 0.00 99.94
04:20:02 all 0.16 0.00 0.05 0.00 0.00 99.78
04:30:02 all 0.05 0.00 0.04 0.00 0.00 99.91
Average: all 0.08 0.00 0.04 0.00 0.00 99.88
#第一部分:系统基本信息
Linux 6.11.0-19-generic:表明系统使用的 Linux 内核版本为 6.11.0,“19-generic” 是该内核的具体构建版本,通常用于通用硬件平台。
(hk1-133-20-101):这可能是主机名,用于标识这台特定的计算机。
03/17/25:代表统计数据的日期是 2025 年 3 月 17 日。
x86_64:说明系统采用的是 64 位的 x86 架构处理器。
(1 CPU):意味着系统中只有一个 CPU 核心。
#第二部分:CPU使用情况统计
#
# 时间列:
# 04:00:02、04:10:02、04:20:02、04:30:02 为统计数据的采样时间点。
# Average 表示这些采样时间段内的平均 CPU 使用情况。
#
# CPU 列:
# all 表示统计的是所有 CPU 核心的综合使用情况。由于系统只有一个 CPU 核心,这里实际上就是该核心的使用情况。
#
# 百分比列:
# %user:表示 CPU 在用户态下的使用时间占比。例如在04:10:02时,用户态使用时间占比为 0.04%,说明用户程序对 CPU 的占用非常少。
# %nice:表示 CPU 在低优先级(经过nice值调整)用户态进程的使用时间占比。这里所有采样点该值都为 0.00%,表明没有低优先级的用户进程在运行。
# %system:表示 CPU 在内核态下的使用时间占比。例如在04:20:02时,内核态使用时间占比为 0.05%,说明系统内核的活动也很少。
# %iowait:表示 CPU 等待 I/O 操作完成的时间占比。所有采样点该值均为 0.00%,意味着系统基本没有因 I/O 操作而导致 CPU 空闲等待的情况。
# %steal:该指标用于虚拟化环境,代表虚拟机的 CPU 时间被宿主机 “偷走”(即宿主机将原本分配给虚拟机的 CPU 时间用于其他任务)的占比。这里为 0.00%,说明没有发生这种情况。
# %idle:表示 CPU 的空闲时间占比。从数据来看,空闲时间占比非常高,例如平均空闲时间占比达到了 99.88%,这表明系统的 CPU 资源大部分处于闲置状态,负载很低。
#
# 根据上面信息可以得出结论,该系统在统计时间段内 CPU 负载极低,几乎没有被充分利用,可能是系统处于空闲状态或者运行的任务对 CPU 资源需求极小。(四)磁盘IO性能监控
每秒采集一次磁盘 I/O 数据,共采集 5 次。
sar -d 1 5Average: DEV tps rkB/s wkB/s dkB/s areq-sz aqu-sz await %util
Average: loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: sda 0.40 0.00 2.40 0.00 6.00 0.00 0.00 0.00
Average: sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
#DEV:磁盘设备名称,如sda。
#tps:每秒的传输次数,包括读和写操作。数值越高,说明磁盘的繁忙程度越高。
#rd_sec/s:每秒从磁盘读取的扇区数(一个扇区通常为 512 字节)。
#wr_sec/s:每秒写入磁盘的扇区数。
#avgrq-sz:平均每次 I/O 操作传输的扇区数,反映了 I/O 请求的大小。
#avgqu-sz:平均 I/O 队列长度,即等待处理的 I/O 请求数量。数值过大可能表示磁盘处理能力不足。
#await:平均每次 I/O 操作的等待时间,包括在队列中等待的时间和实际处理的时间。该值越大,说明 I/O 操作响应越慢。
#svctm:平均每次 I/O 操作的服务时间,即实际处理 I/O 请求的时间。
#%util:磁盘的利用率,即磁盘忙于处理 I/O 请求的时间百分比。接近 100% 表示磁盘已经达到饱和状态。查看指定时间段内的磁盘 I/O 统计信息
#显示从 4:00:00 到 5:00:00 之间的磁盘 I/O 统计信息
sar -d -s 04:00:00 -e 05:00:00Linux 6.11.0-19-generic (hk1-133-20-101) 03/17/25 _x86_64_ (1 CPU)
04:00:02 DEV tps rkB/s wkB/s dkB/s areq-sz aqu-sz await %util
04:10:02 loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:10:02 sda 0.33 0.00 1.64 0.00 4.99 0.00 0.23 0.00
04:10:02 sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:20:02 loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:20:02 sda 0.34 0.03 1.78 0.07 5.50 0.00 0.46 0.00
04:20:02 sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:30:02 loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:30:02 sda 0.26 0.00 1.31 0.00 4.99 0.00 0.45 0.00
04:30:02 sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:40:02 loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:40:02 sda 0.23 0.00 1.12 0.00 4.94 0.00 0.35 0.00
04:40:02 sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: sda 0.29 0.01 1.46 0.02 5.13 0.00 0.37 0.00
Average: sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00显示每个物理磁盘的统计信息
#此命令每秒采集一次数据,共采集 5 次,并显示每个物理磁盘的详细信息
sar -d -p 1 5Average: tps rkB/s wkB/s dkB/s areq-sz aqu-sz await %util DEV
Average: 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 loop0
Average: 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda
Average: 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sr0
#tps:如果tps持续很高,说明磁盘的 I/O 负载较大。
#avgqu-sz:当avgqu-sz的值持续大于 1 时,表明磁盘 I/O 队列中有请求在等待处理,可能存在磁盘瓶颈。
#await 和 svctm:如果await远大于svctm,说明 I/O 请求在队列中等待的时间较长,可能是磁盘处理能力不足或者 I/O 请求过于频繁。
#%util:%util接近 100% 时,磁盘处于高负载状态,可能需要考虑升级磁盘或者优化 I/O 操作。五、ps命令概述
在 Linux 系统中,ps(Process Status)命令是一个非常实用的工具,它用于报告当前系统的进程状态。通过ps命令,用户可以获取有关进程的各种信息,如进程 ID(PID)、用户、CPU 使用率、内存使用率、启动时间等。这有助于用户监控系统的运行状况,排查问题,以及管理进程。
常用选项及示例
- 简单输出信息
ps:不带任何选项时,ps命令会显示当前终端会话中运行的进程的简略信息,包括进程 ID(PID)、终端(TTY)、时间(TIME)和命令(CMD)。
ps示例输出:
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
5678 pts/0 00:00:00 ps解释:这里显示了两个进程,一个是bash进程(PID 为 1234),另一个是当前执行的ps进程(PID 为 5678),它们都在pts/0终端上运行。
- 显示所有进程
ps -A 或 ps -e:这两个选项的作用相同,都会显示系统中所有的进程信息。
ps -A示例输出会包含系统中所有正在运行的进程,包括系统进程、守护进程等,信息会比较多。
- 显示详细信息
ps -l:使用-l选项可以显示进程的详细信息,包括进程的状态(S)、UID、PPID(父进程 ID)、CPU 使用率(% CPU)、内存使用率(% MEM)等。
ps -l示例输出:
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1000 1234 1111 0 80 0 - 4567 wait pts/0 00:00:00 bash
0 R 1000 5678 1234 0 80 0 - 3456 - pts/0 00:00:00 ps
#解释:
# F:进程标志,用于显示进程的权限和状态信息。
# S:进程状态,常见的状态有R(运行中)、S(睡眠中)、D(不可中断的睡眠)、Z(僵尸进程)等。
# UID:进程所有者的用户 ID。
# PID:进程 ID。
# PPID:父进程 ID。
# C:CPU 使用率。
# PRI:进程的优先级。
# NI:进程的 nice 值,用于调整进程的优先级。
# ADDR:进程的内存地址。
# SZ:进程占用的内存大小(以页为单位)。
# WCHAN:进程正在等待的内核函数名。
# TTY:进程所在的终端。
# TIME:进程使用 CPU 的时间。
# CMD:启动进程的命令。- 自定义输出格式
ps -o:使用-o选项可以自定义输出的列,多个列之间用逗号分隔。
ps -o pid,user,%cpu,%mem,cmd示例输出:
PID USER %CPU %MEM CMD
1234 user1 0.0 0.1 bash
5678 user1 0.0 0.0 ps -o pid,user,%cpu,%mem,cmd这里只显示了进程 ID、用户、CPU 使用率、内存使用率和命令。
- 显示进程树
ps -axjf:这个选项组合可以以树形结构显示进程之间的父子关系。ps -axjf示例输出:
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 1 1 1 ? -1 Ss 0 0:01 /sbin/init splash
1 200 200 200 ? -1 S 0 0:00 \_ /lib/systemd/systemd-journald
1 300 300 300 ? -1 S 0 0:00 \_ /lib/systemd/systemd-udevd可以清晰地看到进程之间的层次关系,_表示子进程。
- 实时监控进程
ps -aux:-a表示显示所有用户的进程,-u表示以用户为中心输出详细信息,-x表示显示没有控制终端的进程。这个组合常用于实时监控系统中所有进程的资源使用情况。ps -aux示例输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 16892 2420 ? Ss Mar20 0:01 /sbin/init splash
root 2 0.0 0.0 0 0 ? S Mar20 0:00 [kthreadd]这里显示了每个进程的用户、PID、CPU 使用率、内存使用率等信息,方便用户实时了解系统中进程的资源占用情况。