前言
菜就多练,昨天看了一篇有关剖析 RocksDB 内存超限问题的文章,里面用了多种内存分析工具,看到那些貌似熟悉的名字,却一时也想不起怎么来用,当然像 free 和 top 这种命令还是比较熟的,但是像 vmstat 和 pidstat 这些就比较模糊了,翻了翻之前的总结也简单的描述过使用方法,但是对于这种已经忘记的实时也是不可回避的,菜就多练,今天就再练一练。
俗话说熟能生巧,有时候见的多了自然而然的就能发现规律了,比如 stat
这个词可是Linux命令中常见的面孔,它是单词 statistics
的缩写,也就统计的意思,所以就会出现类似 iostat
、vmstat
、netstat
、pidstat
、mpstat
等命令,相似的还有各种 ps 和 各种 top 相关的命令,今天此文因内存而起,我们就先看看内存相关的 free
、vmstat
、pidstat
、sar
这几个命令。
free
free 命令是我最常用的内存命令,通常我使用时会加上 -h
参数更易读一些,命令虽简单,但是想完全理解却不易,并且不同的系统对于各列的参数实现还不完全相同,而我作为实用派,不愿想个学究一样去深挖各个参数的含义,还是以实用主义为主,明白各参数的基本含义即可
1 | $ free -h |
free -h
的输出显示了系统内存和交换空间的使用情况,在我看来total≈used+available,buff/cache的空间可能一部分属于used,又有一部分属于available,free应该总是小于available的,大体就是这些规则,精确的公式我是给不出的,对于常用的判断够用了:
Mem 部分的解释
- total: 总的物理内存容量(7.3Gi)。
- used: 已被使用的物理内存,包括应用程序和系统缓存(5.8Gi)。
- free: 尚未分配的空闲物理内存(377Mi)。
- shared: 共享内存,主要用于
tmpfs
和其他共享内存用途(40Mi)。 - buff/cache: 用于缓冲区(buffer)和缓存(cache)的内存(1.1Gi)。
- 缓冲区用于临时存储写入磁盘的数据。
- 缓存用于存储从磁盘读取的数据,以便更快地访问。
- available: 可供应用程序使用的内存(1.2Gi)。
- 这个值是对系统内存的综合估算,它考虑了缓存中可以释放的部分。
Swap 部分的解释
- total: 系统的交换空间总大小(9.0Gi)。
- used: 已被使用的交换空间(5.2Gi)。
- free: 尚未使用的交换空间(3.7Gi)。
vmstat
vmstat 是 Linux 和类 Unix 系统上的一个命令,用于实时监控系统性能,包括 CPU、内存、分页、磁盘 I/O 和上下文切换等信息。它非常适合用于分析系统瓶颈或性能问题。
1 | $ vmstat 2 5 -S M |
这个命令表示每2秒刷新一次,共刷新显示5次,单位用M,接下来以第一行数字为例,解释数据含义:
Procs (进程)
r
: 正在运行队列中等待 CPU 的进程数。0
表示当前没有需要 CPU 的进程在排队。b
: 处于等待 I/O 的阻塞进程数。0
表示没有进程因等待 I/O 阻塞。
Memory (内存)
swpd
: 使用的交换空间大小(单位:MB)。5351
表示已使用 5351 MB 的交换空间。free
: 空闲内存大小(单位:MB)。526
表示当前系统有 526 MB 的空闲内存。buff
: 用于缓冲区的内存大小(单位:MB)。152
表示 152 MB 的内存被用作缓冲区。cache
: 用于缓存的内存大小(单位:MB)。1062
表示 1062 MB 的内存被用作文件缓存。
Swap (交换)
si
: 从磁盘交换到内存的数据速率(单位:MB/s)。0
表示当前没有从交换分区加载到内存的数据。so
: 从内存交换到磁盘的数据速率(单位:MB/s)。0
表示当前没有将内存数据写入交换分区。
IO (磁盘 I/O)
bi
: 每秒从块设备(磁盘等)读取的数据量(单位:块)。11
表示每秒读取了 11 块数据。bo
: 每秒写入块设备的数据量(单位:块)。21
表示每秒写入了 21 块数据。
System (系统)
in
: 每秒中断数(硬件和软件中断)。2
表示每秒发生了 2 次中断。cs
: 每秒上下文切换次数。2
表示每秒进行了 2 次上下文切换。
CPU (处理器)
us
: 用户态进程占用 CPU 时间的百分比。3
表示 CPU 时间的 3% 用于运行用户进程。sy
: 内核态进程占用 CPU 时间的百分比。1
表示 CPU 时间的 1% 用于运行内核进程。id
: CPU 空闲时间的百分比。96
表示 CPU 时间的 96% 是空闲的。wa
: CPU 等待 I/O 完成的时间百分比。0
表示 CPU 没有时间在等待 I/O 操作完成。st
: 被虚拟机(如 KVM)偷走的时间百分比。0
表示没有 CPU 时间被虚拟机消耗。
这个命令可以用来监控系统性能瓶颈:
- 如果 r 的值过高,说明 CPU 短缺。
- 如果 si 和 so 的值大,说明系统内存不足,频繁使用交换空间。
- 如果 wa 的值高,说明 I/O 操作是瓶颈。
pidstat
pidstat 是 Linux 系统中 sysstat 工具集的一部分,用于监控和报告单个进程的性能指标。它可以提供有关 CPU、内存、I/O、线程等的详细信息,帮助分析系统性能瓶颈。
1 | $ pidstat -p 242285 -r 2 5 |
这个命令监控242285这个进程内存情况,每2秒刷新一次,共刷新显示5次,单位用M,接下来以第一行数字为例,解释数据含义:
标题行解释
Linux 5.4.0-200-generic
:运行的内核版本。ThinkPad-X390
:主机名。2024年12月14日
:当前日期。_x86_64_
:处理器架构。(8 CPU)
:系统中有 8 个 CPU 核心。
数据列解释
时间
:采样的时间戳。UID
:用户 ID,显示运行进程的用户(1000
表示非 root 用户)。PID
:进程 ID,这里是242285
。minflt/s
:每秒次要缺页错误数(无需从磁盘加载内存页)。majflt/s
:每秒主要缺页错误数(需要从磁盘加载内存页)。VSZ
:虚拟内存大小(以 KB 为单位)。这里是302184 KB
,即约302 MB
。RSS
:驻留内存大小(以 KB 为单位),即实际使用的物理内存。这里是79776 KB
,即约78 MB
。%MEM
:进程使用的物理内存百分比。这里是1.05%
。Command
:进程的名称或命令,这里是Game10010601
。
这些行展示了每次采样的统计数据。这里看到该进程的 minflt/s
和 majflt/s
均为 0.00
,表示没有发生缺页错误,内存访问性能良好。虚拟内存大小 (VSZ
) 和驻留内存大小 (RSS
) 都是恒定的,说明该进程的内存使用稳定。
sar
sar(System Activity Report)命令是一个用于收集、报告和保存系统活动信息的工具,通常在 Linux 和 Unix 系统中使用。它是 sysstat 软件包的一部分,提供了对系统性能的详细监控和分析。
1 | $ sar -r 2 5 |
这个命令表示每2秒刷新一次内存信息,共刷新显示5次,接下来以第一行数字为例,解释数据含义:
字段含义解释
- 时间戳(如
15时26分08秒
):表示采集数据的时间。 kbmemfree
:可用内存(以 KB 为单位)。表示系统中尚未被使用的内存量。kbavail
:可用内存(即使在缓存和缓冲区中也可用的内存,以 KB 为单位)。这个值通常比kbmemfree
更准确,因为它考虑了系统可以回收的缓存和缓冲区内存。kbmemused
:已使用内存(以 KB 为单位)。计算公式为:总内存 - 可用内存
。%memused
:已使用内存的百分比。计算公式为:(kbmemused / 总内存) * 100
。kbbuffers
:用于文件系统缓存的内存(以 KB 为单位)。这是 Linux 内核用于存储未写入硬盘的数据的缓存。kbcached
:用于缓存的内存(以 KB 为单位)。这些是存储在内存中的文件数据,Linux 会尽量使用这部分内存来加快读取速度。kbcommit
:提交内存(以 KB 为单位)。表示可以分配给进程的内存总量,达到该值时会导致内存不足。%commit
:提交内存的百分比。表示已提交内存与可用内存的比例。kbactive
:活动内存(以 KB 为单位)。表示最近被访问的内存页。kbinact
:非活动内存(以 KB 为单位)。表示不再被访问的内存页。kbdirty
:脏页内存(以 KB 为单位)。表示已被修改但尚未写入硬盘的内存。
示例分析
kbmemfree
在 455724 KB 左右,表示系统还有相当数量的可用内存,说实话也不算多了,才400多M。kbmemused
的值为 5547036 KB,表示大约 5.5 GB 的内存已被使用,且%memused
为 72.86%,表明内存使用率较高。kbbuffers
和kbcached
的值相对较小,这可能表示系统正在利用可用内存缓存数据,从而优化性能。kbcommit
和%commit
的值显示系统的内存承诺也在一个相对健康的范围。
总结
free -h
最常用的内存查看工具,可以方便快捷知晓内存总体情况,查看总量与可用内存值vmstat 2 5 -S M
可用于监控内存,分析系统瓶颈或性能问题,r 的值过高说明 CPU 短缺。si 和 so 的值大,说明系统内存不足,频繁使用交换空间pidstat -p 242285 -r 2 5
可提供单个进程的内存使用信息,分析缺页情况sar -r 2 5
可分析内存总体情况,查看活动内存、非活动内存、脏页内存等信息- 因统计口径的不同,可能会遇到两个命令查出来的值不同,这些不必强求,熟悉各个命令的特点,遇到问题多方比较就可以了
我熬的不是夜,而是短暂的自由。因为我知道,一旦睡着了,再次醒来时我便不再属于我自已~
2024-12-14 16:04:22