linux内存相关命令的尝试

前言

菜就多练,昨天看了一篇有关剖析 RocksDB 内存超限问题的文章,里面用了多种内存分析工具,看到那些貌似熟悉的名字,却一时也想不起怎么来用,当然像 free 和 top 这种命令还是比较熟的,但是像 vmstat 和 pidstat 这些就比较模糊了,翻了翻之前的总结也简单的描述过使用方法,但是对于这种已经忘记的实时也是不可回避的,菜就多练,今天就再练一练。

俗话说熟能生巧,有时候见的多了自然而然的就能发现规律了,比如 stat 这个词可是Linux命令中常见的面孔,它是单词 statistics 的缩写,也就统计的意思,所以就会出现类似 iostatvmstatnetstatpidstatmpstat 等命令,相似的还有各种 ps 和 各种 top 相关的命令,今天此文因内存而起,我们就先看看内存相关的 freevmstatpidstatsar 这几个命令。

free

free 命令是我最常用的内存命令,通常我使用时会加上 -h 参数更易读一些,命令虽简单,但是想完全理解却不易,并且不同的系统对于各列的参数实现还不完全相同,而我作为实用派,不愿想个学究一样去深挖各个参数的含义,还是以实用主义为主,明白各参数的基本含义即可

1
2
3
4
$ free -h
total used free shared buff/cache available
Mem: 7.3Gi 5.8Gi 377Mi 40Mi 1.1Gi 1.2Gi
Swap: 9.0Gi 5.2Gi 3.7Gi

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
2
3
4
5
6
7
8
$ vmstat 2 5 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 5351 526 152 1062 0 0 11 21 2 2 3 1 96 0 0
0 0 5351 526 152 1062 0 0 0 0 14509 35013 2 1 97 0 0
0 0 5351 525 152 1063 0 0 0 86 14671 35064 2 1 97 0 0
0 0 5351 525 152 1062 0 0 0 68 14692 35164 2 1 97 0 0
2 0 5351 525 152 1063 0 0 0 122 14504 35142 2 1 96 0 0

这个命令表示每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
2
3
4
5
6
7
8
9
10
$ pidstat -p 242285 -r 2 5
Linux 5.4.0-200-generic (ThinkPad-X390) 2024年12月14日 _x86_64_ (8 CPU)

15时10分47秒 UID PID minflt/s majflt/s VSZ RSS %MEM Command
15时10分49秒 1000 242285 0.00 0.00 302184 79776 1.05 Game10010601
15时10分51秒 1000 242285 0.00 0.00 302184 79776 1.05 Game10010601
15时10分53秒 1000 242285 0.00 0.00 302184 79776 1.05 Game10010601
15时10分55秒 1000 242285 0.00 0.00 302184 79776 1.05 Game10010601
15时10分57秒 1000 242285 0.00 0.00 302184 79776 1.05 Game10010601
Average: 1000 242285 0.00 0.00 302184 79776 1.05 Game10010601

这个命令监控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/smajflt/s 均为 0.00,表示没有发生缺页错误,内存访问性能良好。虚拟内存大小 (VSZ) 和驻留内存大小 (RSS) 都是恒定的,说明该进程的内存使用稳定。

sar

sar(System Activity Report)命令是一个用于收集、报告和保存系统活动信息的工具,通常在 Linux 和 Unix 系统中使用。它是 sysstat 软件包的一部分,提供了对系统性能的详细监控和分析。

1
2
3
4
5
6
7
8
9
10
$ sar -r 2 5
Linux 5.4.0-200-generic (ThinkPad-X390) 2024年12月14日 _x86_64_ (8 CPU)

15时26分06秒 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
15时26分08秒 455724 1363580 5547036 72.86 160416 859272 23892108 140.53 4759984 1552228 428
15时26分10秒 455684 1363544 5547052 72.86 160416 859280 23886860 140.50 4760760 1552232 436
15时26分12秒 455456 1363320 5547276 72.87 160416 859284 23890572 140.53 4760420 1552236 476
15时26分14秒 455456 1363324 5547272 72.87 160416 859288 23890572 140.53 4760476 1552240 480
15时26分16秒 454700 1362572 5548028 72.88 160420 859284 23873744 140.43 4762228 1552244 480
Average: 455404 1363268 5547333 72.87 160417 859282 23886771 140.50 4760774 1552236 460

这个命令表示每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%,表明内存使用率较高。
  • kbbufferskbcached 的值相对较小,这可能表示系统正在利用可用内存缓存数据,从而优化性能。
  • 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

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客