前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Linux 系统内存监控:Linux 内存调优之系统内存全面监控

Linux 系统内存监控:Linux 内存调优之系统内存全面监控

作者头像
山河已无恙
发布于 2025-04-13 08:35:54
发布于 2025-04-13 08:35:54
17200
代码可运行
举报
文章被收录于专栏:山河已无恙山河已无恙
运行总次数:0
代码可运行

写在前面


  • 博文内容涉及 Linux 全局内存监控
  • 监控方式包括传统工具 vmstat/top/free/sar/slabtop ,以及 systemd-cgtopproc 内存伪文件系统
  • 监控内容包括系统内存使用,Slab 缓存,缓存、缓存区、活跃、非活跃内存监控
  • 理解不足小伙伴帮忙指正 :),生活加油

所谓百年功名、千秋霸业、万古流芳,与一件事情相比,其实算不了什么。这件事情就是——用你喜欢的方式度过一生。 ----《明朝那些事儿》

持续分享技术干货,感兴趣小伙伴可以关注下 ^_^


内存的全局监控

内存资源的全局监控一般用于系统级别内存数据实时观测,用于快速定位内存瓶颈(如内存使用率持续超过80%或Swap频繁触发),避免因内存不足导致的响应延迟或服务中断,这里我们也介绍几种方式,关于 通过 BPF 实现全局内存监控会单独拿出来讲。

在学习实际的监控方式之前,我们先来看几个内存相关的术语

交换(物理内存不足)

所有系统RAM芯片的物理内存容量都是固定的。即使应用程序需要的内存容量大于可用的物理内存,Linux内核仍然允许这些程序运行。Linux内核使用硬盘作为临时存储器,这个硬盘空间被称为交换分区(swap space)

尽管交换是让进程运行的极好的方法,但它却慢的要命。与使用物理内存相比,应用程序使用交换的速度可以慢到一千倍。如果系统性能不佳,确定系统使用了多少交换通常是有用的。

缓冲区(buffer)和缓存(cache)(物理内存太多)

缓存(cache)

相反,如果你的系统物理内存容量超过了应用程序的需求,Linux就会在物理内存中缓存近期使用过的文件,这样,后续访问这些文件时就不用去访问硬盘了。

对要频繁访问硬盘的应用程序来说,这可以显著加速其速度,显然,对经常启动的应用程序而言,这是特别有用的。

应用程序首次启动时,它需要从硬盘读取;但是,如果应用程序留着缓存中,那它就需要从更快速的物理内存读取。

这个硬盘缓存不同于前面章节提到的处理器高速缓存(cache)

缓冲区(buffer)

Linux还使用了额外的存储作为缓冲区。为了进一步优化应用程序,Linux为需要被写回硬盘的数据预留了存储空间。这些预留空间被称为缓冲区。如果应用程序要将数据写回硬盘,通常需要花费较长时间,Linux让应用程序立刻继续执行,但将文件数据保存到内存缓冲区。在之后的某个时刻,缓冲区被刷新到硬盘,而应用程序可以立即继续

高速缓存和缓冲区的使用使得系统内空闲的内存很少,默认情况下,Linux试图尽可能多的使用你的内存。这是好事。

如果Linux侦测到有空闲内存,它就会将应用程序和数据缓存到这些内存以加速未来的访问。由于访问内存的速度比访问硬盘的速度快了几个数量级,因此,这就可以显著地提升整体性能

如果系统需要缓存空间做更重要的事情,那么缓存空间将被擦除并交给系统。之后,对原来被缓存对象的访问就需要转向硬盘来满足。

活跃与非活跃内存
  • 活跃内存是指当前被进程使用的内存。
  • 不活跃内存是指已经被分配了,但暂时还未使用的内存。

这两种类型的内存没有本质上的区别。需要时,Linux找出进程最近最少使用的内存页面,并将它们从活跃列表移动到不活跃列表。当要选择把哪个内存页交换到硬盘时,内核就从不活跃内存列表中进行选择

传统工具

这里我们介绍了 vmstat/top/free/sar/slabtop 这几种工具

  • free:快速查看内存总量、使用情况,包括缓冲和缓存,注意available值。
  • top:实时监控系统内存占用及总体使用情况,同时提供内存排序进程。
  • vmstat:查看内存、交换、分页统计,关注si/so判断交换活动。
  • sar:历史数据收集和报告,分析内存趋势,使用sar -r。
  • slabtop:内核slab缓存使用情况,需root权限,检查内核对象内存占用。
vmstat

通过 vmstat 我们可以看到系统级别使用了多少交换分区,物理内存是如何被使用的,以及有多少空闲内存。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[/usr/lib/systemd/system] 
└─$vmstat -help

Usage:
 vmstat [options] [delay [count]]

Options:
 -a, --active           active/inactive memory
 -f, --forks            number of forks since boot
 -m, --slabs            slabinfo
 -n, --one-header       do not redisplay header
 -s, --stats            event counter statistics
 -d, --disk             disk statistics
 -D, --disk-sum         summarize disk statistics
 -p, --partition <dev>  partition specific statistics
 -S, --unit <char>      define display unit
 -w, --wide             wide output
 -t, --timestamp        show timestamp

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see vmstat(8).

这里我们只看 vmstat提供的内存相关统计信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0      0 27270048   3104 984432    0    0    38    23  315  294  4  2 94  0  0

vmstat 调用时没有使用任何命令行选项,它显示的是从 系统启动开始的性能统计数据的均值(si和so),以及其他统计信息的瞬时值(swpd、free、buff和cache)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ vmstat  1 100
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 23365320   3104 962048    0    0   176    23  305  296  2  3 95  0  0
 1  0      0 23365164   3104 962088    0    0     0     0  768  854  0  0 100  0  0
 0  0      0 23364900   3104 962088    0    0     0     0  836  993  0  0 100  0  0
^C
  • swpd :当前交换到硬盘的内存总量
  • free :未被操作系统或应用程序使用的物理内存总量
  • buff : 系统缓冲区大小(单位为KB),或用于存放等待保存到硬盘的数据的内存大小(单位为KB)。该存储区允许应用程序向Linux内核发出写调用后立即继续执行(而不是等待直到数据被提交到硬盘)
  • cache :用于保存之前从硬盘读取的数据的系统高速缓存或内存的大小(单位为KB)。如果应用程序再次需要该数据,内核可以从内存而非硬盘抓取数据,由此可提高性能

vmstat显示活跃与非活跃页面的数量信息:vmstat -a

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 23225336 1987728 6884184    0    0    31   145  267  282  1  1 98  0  0

说明(Kb)

active

被使用的活跃内存量。活跃/不活跃的统计数据与缓冲区/高速缓存的是正交的;缓冲区和高速缓存可以是活跃的,也可以是不活跃的

inact

不活跃的内存总量(单位为KB),或一段时间未被使用,适合交换到硬盘的内存量

si

上一次采样中,从硬盘进来的内存交换速率(单位为KB/s)

so

上一次采样中,到硬盘去的内存交换速率(单位为KB/s)

显示内存和交换分区的统计摘要,包括历史累计数据:vmstat -s

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ vmstat -s
     32931532 K total memory
      8498760 K used memory
      8329368 K active memory
       497280 K inactive memory
     23470020 K free memory
         3104 K buffer memory
       959648 K swap cache
     10485756 K total swap
            0 K used swap
     10485756 K free swap
         8162 non-nice user cpu ticks
            0 nice user cpu ticks
        10277 system cpu ticks
       220249 idle cpu ticks
          653 IO-wait cpu ticks
            0 IRQ cpu ticks
          435 softirq cpu ticks
            0 stolen cpu ticks
       682275 pages paged in
        83668 pages paged out
            0 pages swapped in
            0 pages swapped out
       907353 interrupts
       828939 CPU context switches
   1658547198 boot time
         9260 forks

这里只看一下不熟悉的指标

说明

pages paged in

从硬盘读人系统缓冲区的内存总量(单位为页)

pages paged out

从系统高速缓存写到硬盘的内存总量(单位为页)

pages swapped in

从交换分区读入系统内存的内存总量(单位为页)

pages swapped out

从系统内存写到交换分区的内存总量(单位为页)

used swap

Linux内核目前使用的交换分区容量

free swap

当前可用的交换分区容量

total swap

系统的交换分区总量,即used swap与free swap之和

显示内核 SLAB 缓存信息(内核对象分配的内存):vmstat -m

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ vmstat -m
Cache                       Num  Total   Size  Pages
nf_conntrack_ffff8807fbe22880    153    153    320     51
nf_conntrack_ffff8807f2650000    306    306    320     51
nf_conntrack_ffffffff81ad9d40    306    306    320     51
xfs_dqtrx                     0      0    528     62
xfs_icr                       0      0    152     53
xfs_inode                 37298  37298    960     34
xfs_efd_item                760    800    408     40
.............
┌──[root@liruilongs.github.io]-[~]
└─$
  • cache:内核缓存名称(如 dentry、inode_cache),表示某一类内核对象(如文件系统、网络协议等)的缓存池。
  • num/total:当前活跃对象数和总对象数。
  • size:单个对象占用的内存大小。
  • Pages: 对应的内存页大小
top(2.x和3.x)

默认情况下,top展示的是对进程的CPU消耗量进行降序排列的列表,但它也可以调整为按内存使用总量排序,以便你能跟踪到哪个进程使用的内存最多。

实验版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ top -v
  procps-ng version 3.3.10
Usage:
  top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]

top运行时切换项

选项

说明

m

该项切换是否将内存使用量信息显示到屏幕

M

按任务使用的内存量排序。由于分配给进程的内存量可能会大于其使用量,因此,该项按驻留集大小排序。驻留集大小是指进程实际使用量,而不是简单的进程请求量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
top - 11:48:07 up 14 min,  1 user,  load average: 0.07, 0.10, 0.13
Tasks: 273 total,   2 running, 271 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
KiB Mem : 32931532 total, 23319380 free,  8643596 used,   968556 buff/cache
KiB Swap: 10485756 total, 10485756 free,        0 used. 23759444 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   889 etcd      20   0 10.559g  29332  11008 S   1.3  0.1   0:10.94 etcd
  8089 nginx     20   0   41636  12148   1588 S   1.3  0.0   0:03.35 redis-server

选项

说明

Mem:total,used,free

对物理内存来说,该项表示的是其总量、使用量和空闲量

swap:total,used,free

对交换分区来说,该项表示的是其总量、使用量和空闲量

buff/cache

用于缓冲区写人硬盘的数值和缓存的物理内存总量(单位为KB)

可以建通过 m 键更直观的查看

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
top - 11:47:42 up 14 min,  1 user,  load average: 0.11, 0.11, 0.13
Tasks: 273 total,   1 running, 272 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.2 sy,  0.0 ni, 99.6 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem : 27.9/32931532 [|||||||||||||||||||||                                                      ]
KiB Swap:  0.0/10485756 [                                                                           ]

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   889 etcd      20   0 10.559g  29332  11008 S   1.0  0.1   0:10.70 etcd
  8073 992       20   0  762040 109952  11972 S   1.0  0.3   0:06.59 prometheus
  8079 chrony    20   0  860404 575904   9968 S   1.0  1.7   0:30.24 bundle
  8082 992       20   0  542292  15620   5476 S   0.3  0.0   0:00.77 node_exporter
  8089 nginx     20   0   41636  12148   1588 S   0.3  0.0   0:03.26 redis-server
  8093 chrony    20   0  305636  30176   4964 S   0.3  0.1   0:03.33 gitlab-mon
  8099 nginx     20   0  398856  11900   3784 S   0.3  0.0   0:00.53 redis_exporter
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

free

free 提供的是系统使用内存的总体情况,包括空闲内存量,这是一个用的最多的查看系统内存的命令

free [-l][·t][-s delay 1[-c count]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ free -V
free from procps-ng 3.3.10
┌──[root@liruilongs.github.io]-[~]
└─$ free --help

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
 -k, --kilo          show output in kilobytes
 -m, --mega          show output in megabytes
 -g, --giga          show output in gigabytes
     --tera          show output in terabytes
     --peta          show output in petabytes
 -h, --human         show human-readable output
     --si            use powers of 1000 not 1024
 -l, --lohi          show detailed low and high memory statistics
 -t, --total         show total for RAM + swap
 -s N, --seconds N   repeat printing every N seconds
 -c N, --count N     repeat printing N times, thenexit
 -w, --wide          wide output

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see free(1).

常用命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ free
              total        used        free      shared  buff/cache   available
Mem:       32931532     8820980    22388436       27388     1722116    23579356
Swap:      10485756           0    10485756
┌──[root@liruilongs.github.io]-[~]
└─$ free -h
              total        used        free      shared  buff/cache   available
Mem:            31G        8.4G         21G         26M        1.6G         22G
Swap:            9G          0B          9G

统计信息

说明

Total

物理内存与交换空间的总量

Used

使用的物理内存和交换分区的容量

Free

未使用的物理内存和交换分区的容量

shared

进程共享内存使用量,该项已过时,应忽略

Buffers

用作硬盘写缓冲区的物理内存的容量

Cached

用作硬盘读缓存的物理内存的容量

High

高端内存或不能被内核直接访问的内存总量

Low

低端内存或能被内核直接访问的内存总量

Totals

对Total、Used和Free列,该项显示的是该列中物理内存和交换分区的总和

|available |列表示系统当前可被应用程序实际使用的内存量 available ≈ free + buffers + cache(可回收部分)|

-l向你展示使用了多少高端内存和多少低端内存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ free -l
              total        used        free      shared  buff/cache   available
Mem:       32931532     4835004    24441680       35596     3654848    27657976
Low:       32931532     8489852    24441680
High:             0           0           0
Swap:      10485756           0    10485756

-t命令可以查看内存的统计信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ free -t
              total        used        free      shared  buff/cache   available
Mem:       32931532     5005552    24808440       35588     3117540    27487560
Swap:      10485756           0    10485756
Total:     43417288     5005552    35294196

选项说明

  • -s delay:使free按每delay秒的间隔输出新的内存统计数据
  • -c count:使free 输出count次新的统计数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ free -s 2 -c 2
              total        used        free      shared  buff/cache   available
Mem:       32931532     5405500    24408372       35588     3117660    27087612
Swap:      10485756           0    10485756

              total        used        free      shared  buff/cache   available
Mem:       32931532     5405460    24408388       35588     3117684    27087652
Swap:      10485756           0    10485756
┌──[root@liruilongs.github.io]-[~]
└─$
slabtop

slabtop实时显示内核是如何分配其各种缓存的,以及这些缓存的被占用情况。在内部,内核有一系列的缓存,它们由一个或多个分片(slab)构成。每个分片包括一组对象,对象个数为一个或多个。

这些对象可以是活跃的(使用的)或非活跃的(未使用的)。slabtop向你展示的是不同分片的状况。它显示了这些分片的被占用情况,以及它们使用了多少内存。

slabtop可以一窥Linux内核的数据结构。每一种分片类型都与Linux内核紧密相关。如果某个特定分片使用了大量的内核内存,那么阅读Linux内核源代码和搜索互联网是找出这些分片用在哪里的最好的两种方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ slabtop --help

Usage:
 slabtop [options]

Options:
 -d, --delay <secs>  delay updates
 -o, --once          only display once, thenexit
 -s, --sort <char>   specify sort criteria by character (see below)

 -h, --help     display this help and exit
 -V, --version  output version information and exit

The following are valid sort criteria:
 a: sort by number of active objects
 b: sort by objects per slab
 c: sort by cache size
 l: sort by number of slabs
 v: sort by number of active slabs
 n: sort by name
 o: sort by number of objects (the default)
 p: sort by pages per slab
 s: sort by object size
 u: sort by cache utilization

For more details see slabtop(1).

实时监控 Linux 内核 SLAB 缓存,间隔2s,对缓存进行排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ slabtop -d 2 -s c
 Active / Total Objects (% used)    : 2172003 / 2195023 (99.0%)
 Active / Total Slabs (% used)      : 49649 / 49649 (100.0%)
 Active / Total Caches (% used)     : 69 / 95 (72.6%)
 Active / Total Size (% used)       : 466189.06K / 477588.18K (97.6%)
 Minimum / Average / Maximum Object : 0.01K / 0.22K / 8.00K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME
727440 727339  99%    0.19K  17320       42    138560K dentry
571038 570600  99%    0.10K  14642       39     58568K buffer_head
305088 304062  99%    0.06K   4767       64     19068K kmalloc-64

我们来看一下输出

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

汇总信息(全局统计)

字段

含义

当前值

说明

Active / (% used)

活跃对象与总对象数的比例

2172003 / 2195023 (99.0%)

系统中 99% 的缓存对象,表明内核缓存高度活跃。

Active / Total Slabs (% used)

活跃 Slab 与总 Slab 的比例

49649 / 49649 (100.0%)

所有 Slab 均被完全占用,无空闲内存块,可能因内存需求高或分配策略严格。

Active / Total Caches (% used)

活跃缓存与总缓存的比例

69 / 95 (72.6%)

系统中.6% 的缓存正在被使用**,剩余缓存可能为低优先级或未初始化。

Active / Total Size (% used)

活跃内存与总内存的比例

466189.06K / 477588.18K (97.6%)

总缓存内存约 466MB,占分配内存的 97.6%,内存利用率极高。

Minimum / Average / Maximum Object

对象大小范围

0.01K / 0.22K / 8.00K

内核缓存对象大小跨度大,平均 0.22KB(224字节),以小型对象为主。|

详细缓存列表(按缓存大小排序)

字段

说明

dentry 行示例

buffer_head 行示例

kmalloc-64 行示例

OBJS

缓存中总对象数

727440

571038

305088

ACTIVE

当前活跃对象数

727339

570600

304062

USE

活跃对象占比

99%

99%

99%

OBJ SIZE

单个对象大小

0.19K(约 194字节)

0.10K(约 102字节)

0.06K(约 61字节)

SLABS

Slab 数量

17320

14642

4767

OBJ/SLAB

每个 Slab 包含的对象数

42

39

64

CACHE SIZE

该缓存占用的总内存

138560K(约 135MB)

58568K(约 57MB)

19068K(约 18.6MB)

NAME

缓存名称

dentry(目录项缓存)

buffer_head(块设备 I/O 缓存)

kmalloc-64(内核动态分配的 64字节内存块)

通过 slabtop 的输出,可快速定位内核内存的热点缓存,结合具体场景优化系统性能或排查内存泄漏问题。

sar

上面讲的系统内存监控工具都是实时工具,有时候可能当尝试去解决问题的时候,问题已经发生完成了,即错过了解决问题的最佳时机,所以我们需要查看历史监控数据,所以就有了 sar

sar [-B][-rl[-R]

选项

描述

-B

报告的信息为内核与磁盘之间交换的块数。此外,对v2.5之后的内核版本,该项报告的信息为缺页数量

-W

报告的是系统交换的页数

-r

报告系统使用的内存信息。它包括总的空闲内存、正在使用的交换分区、缓存和缓冲区的信息

交换分区活动监控

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ sar -W
Linux 3.10.0-693.el7.x86_64 (liruilongs.github.io)      20220723_x86_64_        (6 CPU)

113339LINUX RESTART

114001秒  pswpin/s pswpout/s
1150010.00      0.00
1200010.00      0.00
1210010.00      0.00
1220010.00      0.00
平均时间:      0.00      0.00

所有时间点的值均为 0.00,表明系统在监控期间 未发生 Swap 交换活动。物理内存充足,未触发内存回收机制,系统未因内存不足使用 Swap

  • pswpin/s:每秒从 Swap 分区换入到物理内存的页面数量。
  • pswpout/s:每秒从物理内存换出到 Swap 分区的页面数量。

内存分页与缺页统计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ sar -B
Linux 3.10.0-693.el7.x86_64 (liruilongs.github.io)      20220723_x86_64_        (6 CPU)

113339LINUX RESTART

114001秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
11500112.52    125.74    677.40      0.02    692.72      0.00      0.00      0.00      0.00
120001138.94    533.55   1253.45      0.17   1110.67      0.00      0.00      0.00      0.00
121001118.52   5527.63  35379.48      0.20  19923.40      0.00      0.00      0.00      0.00
12200115.85    122.99   3750.36      0.02   1989.95      0.00      0.00      0.00      0.00
平均时间:     71.46   1578.02  10268.63      0.10   5931.11      0.00      0.00      0.00      0.00
┌──[root@liruilongs.github.io]-[~]
└─$
  • pgpgin/s:每秒从磁盘读入内存的页数(单位:页/秒)。
  • pgpgout/s:每秒从内存写入磁盘的页数(单位:页/秒)。
  • fault/s:每秒发生的缺页中断次数(包括次缺页和主缺页)。
  • majflt/s:每秒发生的主缺页次数(需从磁盘加载数据)。
  • pgfree/s:每秒释放到空闲列表的内存页数。

pgpgout/s 较高(平均 1578.02):系统存在频繁的页写入磁盘操作,可能与缓存刷新或应用程序的磁盘写入有关。majflt/s 极低(0.10):主缺页较少,表明大部分缺页通过缓存(次缺解决,内存压力较小,关于缺页,会在之后的文章中和小伙伴分享

内存使用统计

显示系统的物理内存和交换空间使用情况

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ sar -r 1 3
Linux 3.10.0-693.el7.x86_64 (liruilongs.github.io)      20220723_x86_64_        (6 CPU)

123927秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
12392823253572   9677960     29.39      3104   2789588   5138464     11.84   6864288   1980388        96
12392923253572   9677960     29.39      3104   2789620   5138464     11.84   6864300   1980416        96
12393023253572   9677960     29.39      3104   2789620   5138464     11.84   6864300   1980416        96
平均时间:  23253572   9677960     29.39      3104   2789609   5138464     11.84   6864296   1980407        96
  • kbmemfree:空闲物理内存(约 22.25GB)。
  • kbmemused:已用物理内存(约 9.24GB)。
  • %memused:内存使用率(29.39%)。
  • kbbuffers:内核缓冲区占用的内存(3.03MB)。
  • kbcached:文件系统缓存占用的内存(约 2.66GB)。

内存页的动态分配速率,包括释放、缓冲和缓存的页面变化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ sar -R 1 3
Linux 3.10.0-693.el7.x86_64 (liruilongs.github.io)      20220723_x86_64_        (6 CPU)

123944秒   frmpg/s   bufpg/s   campg/s
123945-96.00      0.00      6.00
12394629.00      0.00      0.00
123947-33.00      0.00      0.00
平均时间:    -33.33      0.00      2.00
┌──[root@liruilongs.github.io]-[~]
└─$

  • frmpg/s:每秒释放到空闲列表的页面数(负值表示释放)。
  • bufpg/s:每秒分配给缓冲区的页面数。
  • campg/s:每秒分配给缓存的页面数。

Cgroup 方式

systemd-cgtop

通过 systemd-cgtop --order=memory,可以展示各个控制组(Control Group)按内存使用情况的排序信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[/usr/lib/systemd/system] 
└─$systemd-cgtop --order=memory

Control Group                                                                                                          Tasks   %CPU   Memory  Input/s Output/s
/                                                                                                                        320      -     1.4G        -        -
user.slice                                                                                                               143      -   767.2M        -        -
user.slice/user-1000.slice                                                                                               115      -   695.2M        -        -
user.slice/user-1000.slice/session-1.scope                                                                                84      -   674.1M        -        -
system.slice                                                                                                             101      -   500.9M        -        -
system.slice/hostguard.service                                                                                            33      -   136.1M        -        -
user.slice/user-986.slice                                                                                                 28      -    72.0M        -        -
system.slice/lightdm.service                                                                                               6      -    71.1M        -        -
user.slice/user-986.slice/session-c1.scope                                                                                 6      -    64.4M        -        -
system.slice/ces-uniagent.service                                                                                          6      -    30.3M        -        -
user.slice/user-1000.slice/user@1000.service                                                                              31      -    21.0M        -        -
system.slice/systemd-udevd.service                                                                                         1      -    17.4M        -        -
system.slice/tuned.service                                                                                                 5      -    15.8M        -        -
system.slice/NetworkManager.service                                                                                        4      -    11.9M        -        -
system.slice/udisks2.service                                                                                               5      -     9.0M        -        -
user.slice/user-986.slice/user@986.service                                                                                22      -     7.6M        -        -
system.slice/polkit.service                                                                                                3      -     7.1M        -        -
system.slice/rngd.service                                                                                                  5      -     5.7M        -        -
system.slice/rsyslog.service                                                                                               3      -     5.5M        -        -
system.slice/chronyd.service                                                                                               1      -     3.7M        -        -
system.slice/auditd.service                                                                                                2      -     3.6M        -        -
system.slice/accounts-daemon.service                                                                                       3      -     2.8M        -        -
system.slice/rpcbind.service                                                                                               1      -     2.4M        -        -
system.slice/rtkit-daemon.service                                                                                          3      -     2.3M        -        -
system.slice/gssproxy.service                                                                                              6      -     2.0M        -        -
system.slice/sshd.service                                                                                                  1      -     2.0M        -        -

最上方的“/”表示根控制组,其下有多个子控制组,如user.slice等。每个控制组包含任务(Tasks)数量、CPU使用率(%CPU)内存(Memory)使用量输入输出速率(Input/s和Output/s)等信息。

同时可以看到不同用户会话(如user-1000.slice,user-986.slice)、系统服务(如hostguard.service、lightdm.service等)的内存使用情况。通过这些信息能快速了解系统中各部分的内存占用状况,有助于发现内存使用异常的控制组,进而进行内存相关的调优或故障排查。

proc 内存伪文件系统

/proc/meminfo

Linux内核提供用户可读文本文件/proc/meminfo来显示当前系统范围内的内存性能统计信息,

它提供了系统范围内内存统计数据的超集,包括了vmstat、top、free和procinfo的信息,但是使用起来有一定的难度。如果你想定期更新,就需要自己写一个脚本或一些代码来实现这个功能。如果你想保存内存性能信息或是将其与CPU统计信息相协调,就必须创建一个新的工具或是写一个脚本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ cat /proc/meminfo
MemTotal:       32931532 kB
MemFree:        23182352 kB
MemAvailable:   25878308 kB
Buffers:            3104 kB
Cached:          2790760 kB
SwapCached:            0 kB
Active:          6933748 kB
Inactive:        1981384 kB
Active(anon):    6124200 kB
Inactive(anon):    32624 kB
Active(file):     809548 kB
Inactive(file):  1948760 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:      10485756 kB
SwapFree:       10485756 kB
Dirty:                84 kB
Writeback:             0 kB
AnonPages:       6121244 kB
Mapped:           188304 kB
Shmem:             35556 kB
Slab:             481624 kB
SReclaimable:     340480 kB
SUnreclaim:       141144 kB
KernelStack:       12944 kB
PageTables:        31076 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    26951520 kB
Committed_AS:    5158652 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      225072 kB
VmallocChunk:   34359310332 kB
HardwareCorrupted:     0 kB
AnonHugePages:   5437440 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      161600 kB
DirectMap2M:     7178240 kB
DirectMap1G:    28311552 kB

部分参数描述

  • SwapTotal:可用的总交换空间
  • SwapFree:剩余可用交换空间
  • Dirty:等待写回磁盘的内存
  • Writeback:正在主动写回磁盘的内存
  • AnonPages:映射到用户空间页表的非文件支持页
  • Mapped:已映射的文件,例如库
  • Slab:内核数据结构缓存
  • PageTables:专用于最低级别页表的内存量。如果很多进程连接到同一个共享内存段,这可能会增加到一个很高的值。
  • NFS_Unstable:NFS 页面发送到服务器,但尚未提交到存储
  • Bounce:用于块设备的内存bounce buffers
  • CommitLimit:根据过量使用率 ( vm.overcommit_ratio),这是系统上当前可分配的内存总量。仅当启用了严格的过量使用记帐(模式 2 in )时才遵守此限制vm.overcommit_memory。
  • Committed_AS:当前在系统上分配的内存量。提交的内存是进程分配的所有内存的总和,即使它还没有被它们“使用”。
  • VmallocTotal:vmalloc 内存区域的总大小
  • VmallocUsed:使用的vmalloc区域的数量
  • VmallocChunk:vmalloc 区域的最大连续块,它是空闲的
  • HugePages_Total:内核分配的大页数(用 定义vm.nr_hugepages)
  • HugePages_Free:进程未分配的大页数
  • HugePages_Rsvd:已承诺从池中分配但尚未分配的大页数。
  • Hugepagesize:a 的大小hugepage(在基于 Intel 的系统上通常为 2MB)
/proc/slabinfo

前面 slabtop 的数据源,slabinfo 是 Linux 内核提供的用于监控和管理 Slab 内存分配器的关键接口文件,记录了系统中所有活跃的 Slab 缓存信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌──[root@liruilongs.github.io]-[~]
└─$ cat /proc/slabinfo
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
nf_conntrack_ffff8807fbe22880    153    153    320   51    4 : tunables    0    0    0 : slabdata      3      3      0
nf_conntrack_ffff8807f2650000    306    306    320   51    4 : tunables    0    0    0 : slabdata      6      6      0
nf_conntrack_ffffffff81ad9d40    306    306    320   51    4 : tunables    0    0    0 : slabdata      6      6      0
xfs_dqtrx              0      0    528   62    8 : tunables    0    0    0 : slabdata      0      0      0
xfs_icr                0      0    152   53    2 : tunables    0    0    0 : slabdata      0      0      0
xfs_inode          37298  37298    960   34    8 : tunables    0    0    0 : slabdata   1097   1097      0
xfs_efd_item         760    800    408   40    4 : tunables    0    0    0 : slabdata     20     20      0
xfs_buf_item         408    408    240   68    4 : tunables    0    0    0 : slabdata      6      6      0
xfs_btree_cur        234    234    208   39    2 : tunables    0    0    0 : slabdata      6      6      0
xfs_log_ticket       352    352    184   44    2 : tunables    0    0    0 : slabdata      8      8      0
bio-1                408    408    320   51    4 : tunables    0    0    0 : slabdata      8      8      0
ip6_dst_cache        252    252    448   36    4 : tunables    0    0    0 : slabdata      7      7      0
RAWv6                624    624   1216   26    8 : tunables    0    0    0 : slabdata     24     24      0
...........

  • name:缓存名称,通常与内核对象类型相关 xfs_inode 表示 XFS 文件系统的 inode 缓存)。
  • active_objs:当前活跃(已分配)的对象数量。
  • num_objs:缓存中总对象数量(包括空闲和活跃)。
  • objsize:单个对象的大小(单位:字节)。
  • objperslab:每个 Slab(内存块)包含的对象数量。
  • pagesperslab:每个 Slab 占用的物理页数(1 页通常为 4KB)

可以看到有我们在上面通过 slabtop 命令看到的一些缓存对象

  • xfs_inode:XFS 文件系统的 inode 缓存
  • nf_conntrack_:网络连接跟踪缓存(用于防火墙/NAT

关于 Linux 系统缓存就可以小伙伴们分享到这里,平常监控用的最多的一个是 free 一个是 /proc/meminfo

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 :)


《 Red Hat Performance Tuning 442 》

《性能之巅 系统、企业与云可观测性(第2版)》


© 2018-至今 liruilonger@gmail.com, 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 山河已无恙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux 进程内存监控:Linux 内存调优之进程内存深度监控
这里分析的工具主要是原生工具,后面还会分享一些 BPF 相关的内存观察工具以及系统内存的全局监控
山河已无恙
2025/04/13
6700
Linux 进程内存监控:Linux 内存调优之进程内存深度监控
Linux 性能调优之虚拟化调优
不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树
山河已无恙
2024/02/27
3490
Linux 性能调优之虚拟化调优
Linux性能调优之内存负载调优的一些笔记
「 原谅和忘记就意味着扔掉了我们获得的最贵经验 -------《人生的智慧》叔本华」
山河已无恙
2023/01/30
2.6K0
Linux性能调优之内存负载调优的一些笔记
关于Linux性能调优中系统CPU监测信息统计的一些笔记
人总是害怕去追求自己最重要的梦想,因为他们觉得自己不配拥有,或者觉得自己没有能力去完成。——保罗.柯艾略《牧羊少年奇幻之旅》
山河已无恙
2023/03/02
9130
关于Linux性能调优中系统CPU监测信息统计的一些笔记
网工人必须掌握的Linux命令
作为一个Linux运维人员,主要就是对Linux服务器的性能做一些优化,本篇博文仅仅介绍如何性能检测常用的指令!
网络技术联盟站
2021/02/22
1K0
关于 Linux中系统调优的一些笔记
我突然又明白,死亡是聪明的兄长,我们可以放心地把自己托付给他,他会知道在我们有所准备的适当时刻前来。我也突然懂得,原来痛苦、失望和悲愁不是为了惹恼我们,使我们气馁或者无地自容;它们的存在,是为了使我们心智成熟,臻于完善。—赫尔曼·黑塞《彼得·卡门青》
山河已无恙
2023/03/02
1K0
关于 Linux中系统调优的一些笔记
Linux Kernel模块内存泄露的一种查找思路
最近有个客户报了一个问题:如果运行我们的产品,则每天将会增长大概30M的内存,大概4个多月内存就会耗尽。和大多数程序员的反应一样,“不会吧,在其他客户机器上都跑的好好的啊,从来都没有遇到过这样的问题”。最后的结果,也往往告诉程序员一个铁的事实:你的程序确实出问题了!
河边一枝柳
2021/08/06
2.1K0
一天一个 Linux 命令(40):vmstat 命令
Linux下的vmstat(英文全称:Virtual Meomory Statistics),虚拟内存统计的缩写,可对操作系统的虚拟内存、进程、CPU活动、I/O等系统整体运行状态进行监控。
joshua317
2021/11/24
3770
关于Linux中使用USE(使用率/饱和度/错误)方法分析系统性能的一些笔记
傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波
山河已无恙
2023/01/30
1.3K0
关于Linux中使用USE(使用率/饱和度/错误)方法分析系统性能的一些笔记
Linux之vmstat命令
原文链接:https://rumenz.com/rumenbiji/linux-vmstat.html
入门笔记
2021/07/31
6070
Linux基础命令(3)
十二 lsof命令简介 lsof(list open files) 是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件 描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工 具能够查看这个列表对系统监测以及排错将是很有帮助的。 1.命令格式: lsof [参数][文件] 2.命令功能: 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 需要访问核心内存和各种文件,所以需要root用户执行。 lsof打开的文件可以是: 1.普通文件 2.目录 3.网络文件系统的文件 4.字符或设备文件 5.(函数)共享库 6.管道,命名管道 7.符号链接 8.网络文件(例如:NFS file、网络socket,unix域名socket) 9.还有其它类型的文件,等等 3.命令参数: -a 列出打开文件存在的进程 -c<进程名> 列出指定进程所打开的文件 -g  列出GID号进程详情 -d<文件号> 列出占用该文件号的进程 +d<目录>  列出目录下被打开的文件 +D<目录>  递归列出目录下被打开的文件 -n<目录>  列出使用NFS的文件 -i<条件>  列出符合条件的进程。(4、6、协议、:端口、 @ip ) -p<进程号> 列出指定进程号所打开的文件 -u  列出UID号进程详情 -h 显示帮助信息 -v 显示版本信息 4.使用实例: 实例1:无任何参数 命令: lsof 输出:     [root@localhost ~]# lsof COMMAND     PID USER   FD      TYPE             DEVICE     SIZE       NODE NAME init          1 root  cwd       DIR                8,2     4096          2 / init          1 root  rtd       DIR                8,2     4096          2 / init          1 root  txt       REG                8,2    43496    6121706 /sbin/init init          1 root  mem       REG                8,2   143600    7823908 /lib64/ld-2.5.so init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so init          1 root  mem       REG                8,2    95464    7824116 /lib64/libselinux.so.1 init          1 root  mem       REG                8,2   247496    7823947 /lib64/libsepol.so.1 init          1 root   10u     FIFO               0,17                1233 /dev/initctl migration     2 root  cwd       DIR                8,2     4096          2 / migration     2 root  rtd       DIR                8,2     4096          2 / migration     2 root  txt   unknown                                        /proc/2/exe ksoftirqd     3 root  cwd       DIR                8,2     4096          2 / ksoftirqd   
py3study
2020/01/06
1.7K0
全栈软件测试工程师宝典连载(10)
https://item.m.jd.com/product/10023427978355.html
顾翔
2021/02/02
4470
全栈软件测试工程师宝典连载(10)
深入理解Linux内存子系统
a) 如果当前连续内存块足够 realloc 的话,只是将 p 所指向的空间扩大,并返回 p 的指针地址。这个时候 q 和 p 指向的地址是一样的
用户7686797
2021/11/23
2.2K0
常见Linux调优命令和工具
引言: 应同学的要求,分享些基础的知识。 没有比Linux更基础了,关键问题来了,你真的认真看了和转发了吗? O(∩_∩)O哈哈~ 要实现对Linux的调优,就需要用到一些Linux系统命令和工具来观察与监控系统的性能。下面介绍几个最常用的Linux调优命令和工具。 1. top命令 top命令经常用来监控Linux的系统状态,如CPU、内存的使用情况。下面通过一个运行中的Web服务器的top监控截图,讲述top视图中各种数据的含义,以及视图中各进程(任务)的字段的排序。 top进入视图,如图4.17所示。
大数据和云计算技术
2018/03/08
3.1K0
常见Linux调优命令和工具
五分钟带你掌握Linux系统查看CPU使用率、内存使用率、磁盘使用率
%us:表示用户空间程序的cpu使用率(没有通过nice调度) %sy:表示系统空间的cpu使用率,主要是内核程序。 %ni:表示用户空间且通过nice调度过的程序的cpu使用率。 %id:空闲cpu %wa:cpu运行时在等待io的时间 %hi:cpu处理硬中断的数量 %si:cpu处理软中断的数量 %st:被虚拟机偷走的cpu 注:99.0 id,表示空闲CPU,即CPU未使用率,100%-99.0%=1%,即系统的cpu使用率为1%。
不吃小白菜
2021/03/02
19.4K0
软件性能测试(连载13)
[28]slab是Linux操作系统的一种内存分配机制,slab分配算法采用cache存储内核对象。slab缓存、从缓存中分配和释放对象然后销毁缓存的过程必须要定义一个kmem_cache对象,然后对其进行初始化这个特定的缓存包含32字节的对象。可以通过运行cat /proc/slabinfo |grep -E '^#|dentry|inode'命令来查看所有目录项和各种文件系统索引节点的缓存情况。
顾翔
2020/03/04
6480
ODOO12服务器性能评估与监控
load average这个输出值,这三个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有4个CPU,如果load average的三个值长期大于4时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于4时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如本例中的输出,CPU是非常空闲的。
好派笔记
2021/09/13
1.1K0
Linux内存占用常用的几个分析方法,你确定都知道?
系统内存是硬件系统中必不可少的部分,定时查看系统内存资源运行情况,可以帮助我们及时发现内存资源是否存在异常占用,确保业务的稳定运行。
lyb-geek
2022/11/18
3.8K0
Linux内存占用常用的几个分析方法,你确定都知道?
3个性能监控和优化命令讲解
整理出了三个有关性能监控和优化命令详细讲解,文章很长,涉及top命令、free命令和vmstat命令,真的是很详细的讲解,希望能帮到大家
PHP开发工程师
2021/05/18
8090
3个性能监控和优化命令讲解
性能之文件系统篇
本篇文章是性能篇的最后一篇文章,算是一个学习笔记吧,当中的例子也是从别的文章里面摘录的,主要用来讲解如何使用和查看对应的指标。这一篇主要介绍文件系统,说的更加具体点其实是磁盘这个点。
灰子学技术
2022/06/25
9240
性能之文件系统篇
相关推荐
Linux 进程内存监控:Linux 内存调优之进程内存深度监控
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验