记一次内存占用高的分析

首先查询系统占用

[root@ ~]# free -g
              total        used        free      shared  buff/cache   available
Mem:            510         488          11           0          11          19
Swap:             0           0           0

然后查看下内存压力,0.65%,也很低

[root@ ~]# sar -r 1
Linux 4.19.0-1.0.0.14   02/17/2025  _x86_64_    (64 CPU)

07:49:51 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
07:49:52 PM  11758324 523925116     97.80   1121476   9257832   3490700      0.65   4426740   6346840         0
07:49:53 PM  11758324 523925116     97.80   1121476   9257832   3490700      0.65   4426740   6346840         0
07:49:54 PM  11758600 523924840     97.80   1121476   9257832   3490700      0.65   4426744   6346840         0
^C

07:49:55 PM  11757824 523925616     97.81   1121476   9257832   3490700      0.65   4426440   6346840         0
Average:     11758268 523925172     97.80   1121476   9257832   3490700      0.65   4426666   6346840         0

查看进程占用内存,进程占用都很低

[root@ ~]# ps aux | head -n 1
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
[root@ ~]# ps aux | sort -k4nr | head -n 10  
dbus     32889  0.0  0.0  58204  4188 ?        Ss   Feb14   0:27 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
ntp      32923  0.0  0.0  25740  4424 ?        Ss   Feb14   0:00 /usr/sbin/ntpd -u ntp:ntp -g
polkitd  32880  0.0  0.0 612284 10788 ?        Ssl  Feb14   0:11 /usr/lib/polkit-1/polkitd --no-debug
root        10  0.0  0.0      0     0 ?        S    Feb14   0:00 [ksoftirqd/0]
root         1  0.0  0.0  52120  5324 ?        Ss   Feb14   1:11 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root       101  0.0  0.0      0     0 ?        I<   Feb14   0:00 [kworker/17:0H-k]
root       102  0.0  0.0      0     0 ?        S    Feb14   0:00 [cpuhp/18]
root       103  0.0  0.0      0     0 ?        S    Feb14   0:00 [migration/18]
root     10317  0.0  0.0      0     0 ?        I<   Feb14   0:00 [kworker/54:1H-k]
root       104  0.0  0.0      0     0 ?        S    Feb14   0:00 [ksoftirqd/18]

然后分析/proc/meminfo

cat /proc/meminfo 
MemTotal:       535683440 kB   # 系统总内存 ≈ 510.92 GB
MemFree:        11747840 kB    # 当前完全空闲的内存 ≈ 11.20 GB
MemAvailable:   20659952 kB    # 实际可用内存(含缓存回收)≈ 19.70 GB
Buffers:         1123940 kB    # 内核缓冲区(临时块设备读写)≈ 1.07 GB
Cached:          9270536 kB    # 文件缓存(可回收)≈ 8.84 GB
SwapCached:            0 kB    # 交换缓存(当前未使用交换空间)≈ 0.00 GB
Active:          4421184 kB    # 最近活跃内存 ≈ 4.22 GB
Inactive:        6358736 kB    # 最近不活跃内存 ≈ 6.06 GB
Active(anon):     367824 kB    # 活跃匿名内存(进程堆栈等)≈ 0.35 GB
Inactive(anon):     1148 kB    # 不活跃匿名内存 ≈ 0.00 GB
Active(file):    4053360 kB    # 活跃文件缓存 ≈ 3.87 GB
Inactive(file):  6357588 kB    # 不活跃文件缓存 ≈ 6.06 GB
Unevictable:           0 kB    # 不可回收内存(如mlock锁定)≈ 0.00 GB
Mlocked:               0 kB    # mlock锁定的内存 ≈ 0.00 GB
SwapTotal:             0 kB    # 交换空间总量(未启用)≈ 0.00 GB
SwapFree:              0 kB    # 剩余交换空间 ≈ 0.00 GB
Dirty:              4108 kB    # 等待写回磁盘的内存 ≈ 0.00 GB
Writeback:           272 kB    # 正在写回磁盘的内存 ≈ 0.00 GB
AnonPages:        384732 kB    # 匿名页(进程私有内存)≈ 0.37 GB
Mapped:           337752 kB    # 文件映射内存(如库文件)≈ 0.32 GB
Shmem:             10284 kB    # 共享内存(如tmpfs)≈ 0.01 GB
Slab:            1706436 kB    # 内核Slab缓存 ≈ 1.63 GB
SReclaimable:     723796 kB    # 可回收的Slab缓存 ≈ 0.69 GB
SUnreclaim:       982640 kB    # 不可回收的Slab缓存 ≈ 0.94 GB
KernelStack:       20096 kB    # 内核栈使用量 ≈ 0.02 GB
PageTables:        14632 kB    # 页表内存 ≈ 0.01 GB
NFS_Unstable:          0 kB    # NFS不稳定页(未使用)≈ 0.00 GB
Bounce:                0 kB    # 回弹缓冲区(旧内核特性)≈ 0.00 GB
WritebackTmp:          0 kB    # FUSE写回缓存 ≈ 0.00 GB
CommitLimit:    14086328 kB    # 系统承诺内存上限 ≈ 13.43 GB
Committed_AS:    3457604 kB    # 已分配内存总量 ≈ 3.30 GB
VmallocTotal:   34359738367 kB # 虚拟内存地址空间总量(理论值)≈ 32,768.00 GB
VmallocUsed:           0 kB    # 已用虚拟内存 ≈ 0.00 GB
VmallocChunk:          0 kB    # 虚拟内存最大连续块 ≈ 0.00 GB
Percpu:            46592 kB    # Per-CPU内存(如调度器数据)≈ 0.04 GB
HardwareCorrupted:     0 kB    # 硬件损坏内存(ECC错误)≈ 0.00 GB
AnonHugePages:         0 kB    # 透明大页(THP)≈ 0.00 GB
ShmemHugePages:        0 kB    # 共享内存大页 ≈ 0.00 GB
ShmemPmdMapped:        0 kB    # 共享内存PMD映射 ≈ 0.00 GB
HugePages_Total:       0       # 大页总数(未配置)≈ 0
HugePages_Free:        0       # 空闲大页 ≈ 0
HugePages_Rsvd:        0       # 预留大页 ≈ 0
HugePages_Surp:        0       # 大页溢出计数 ≈ 0
Hugepagesize:       2048 kB    # 单个大页大小 = 2 MB
Hugetlb:        507510784 kB   # 大页内存池总量 ≈ 483.84 GB
DirectMap4k:     1346072 kB    # 4KB页映射内存 ≈ 1.28 GB
DirectMap2M:    15341568 kB    # 2MB页映射内存 ≈ 14.63 GB
DirectMap1G:    520093696 kB   # 1GB页映射内存 ≈ 496.00 GB

从/proc/meminfo看大概是大页占用的内存,Hugetlb显示大约为483G

然后看下大页使用情况。

查看下系统支持的大页格式

[root@ ~]# ll /sys/kernel/mm/hugepages/ 
total 0
drwxr-xr-x 2 root root 0 Feb 11 10:41 hugepages-1048576kB #1GB的大页
drwxr-xr-x 2 root root 0 Feb 11 10:41 hugepages-2048kB #2MB的大页
[root@ ~]# cat /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
484 #显示1G内存大页配置了484个。

查看下numa设置

# numactl --hardware
available: 2 nodes (0-1)        # 系统有2个NUMA节点,编号0和1
node 0 cpus: 0 1 2 3 ... 31    # 节点0管理的CPU核(共32个,0-31)
node 0 size: 261221 MB          # 节点0总内存 ≈ 255.10 GB
node 0 free: 9241 MB            # 节点0剩余内存 ≈ 9.03 GB
node 1 cpus: 32 33 34 ... 63   # 节点1管理的CPU核(共32个,32-63)
node 1 size: 261906 MB          # 节点1总内存 ≈ 255.77 GB
node 1 free: 13255 MB           # 节点1剩余内存 ≈ 12.94 GB
node distances:                 # NUMA节点间访问延迟(数值越大,延迟越高)
node   0   1 
  0:  10  22                    # 节点0访问自身延迟为10,访问节点1延迟为22
  1:  22  10                    # 节点1访问自身延迟为10,访问节点0延迟为22

然后查看下各个numa节点的大页设置:

[root@ hugepages-1048576kB]# grep -H '.' /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/*
/sys/devices/system/node/node0/hugepages/hugepages-1048576kB/free_hugepages:0  #节点0当前空闲的1GB大页数量 = 0(已全部使用)
/sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages:243  #节点0已配置的1GB大页总数 = 243(包括已用和空闲)
/sys/devices/system/node/node0/hugepages/hugepages-1048576kB/surplus_hugepages:0  #节点0临时分配的溢出大页数 = 0(无溢出)
[root@  hugepages-1048576kB]# grep -H '.' /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/*
/sys/devices/system/node/node1/hugepages/hugepages-1048576kB/free_hugepages:0  #节点1当前空闲的1GB大页数量 = 0(已全部使用)
/sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages:241 #节点1已配置的1GB大页总数 = 241(包括已用和空闲)
/sys/devices/system/node/node1/hugepages/hugepages-1048576kB/surplus_hugepages:0 #节点1临时分配的溢出大页数 = 0(无溢出)