如何拆分smem统计的内核动态内存Noncache项,对应/proc/meminfo哪些字段?
问题:拆分smem上报的内核非缓存(Noncache)内存组成
我查到了smem内核动态内存相关的参考内容,但我的环境没有对应参考内容中提到的zram组件。
我的核心疑问是:如何拆分smem工具上报的Noncache内存?我已经知道大页(hugetables)是其中一部分,除此之外还有哪些组成部分?搜索很久都没有找到明确方案,看起来只能通过读内核源码才能得到答案。
我使用的smem版本中,内核动态内存的Noncache计算公式为:总内存(MemTotal) - 用户态内存 - 空闲内存 - 缓存 - 大页内存。我想知道需要把/proc/meminfo中的哪些字段求和才能得到我环境中704576 kB这个Noncache数值?换句话说,拆分内核非缓存内存时,/proc/meminfo里的哪些字段会被计入这个值?
环境相关输出
smem 输出
] smem -wt Area Used Cache Noncache Hugepages firmware/hardware 0 0 0 0 kernel image 0 0 0 0 kernel dynamic memory 2117736 706600 704576 706560 userspace memory 783384 156516 626868 0 free memory 10665504 10665504 0 0 --------------------------------------------------------------------- 13566624 11528620 1331444 706560
free 输出
free -h total used free shared buff/cache available Mem: 12G 1.9G 10G 63M 842M 10G Swap: 9G 513M 9.5G
/proc/meminfo 输出
MemTotal: 13566624 kB MemFree: 10668220 kB MemAvailable: 11048420 kB Buffers: 158544 kB Cached: 649660 kB SwapCached: 229900 kB Active: 545392 kB Inactive: 1059268 kB Active(anon): 74132 kB Inactive(anon): 787872 kB Active(file): 471260 kB Inactive(file): 271396 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 10485756 kB SwapFree: 9960188 kB Dirty: 2176 kB Writeback: 0 kB AnonPages: 621768 kB Mapped: 154476 kB Shmem: 65520 kB KReclaimable: 54912 kB Slab: 123356 kB SReclaimable: 54912 kB SUnreclaim: 68444 kB KernelStack: 11280 kB PageTables: 8456 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 16915788 kB Committed_AS: 2715192 kB VmallocTotal: 135290159040 kB VmallocUsed: 29464 kB VmallocChunk: 0 kB Percpu: 16512 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB FileHugePages: 0 kB FilePmdMapped: 0 kB CmaTotal: 65536 kB CmaFree: 63760 kB HugePages_Total: 345 HugePages_Free: 1 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 706560 kB
解答
smem统计的内核动态内存Noncache本质是内核分配的、无法作为页缓存回收的内存段,你可以通过以下/proc/meminfo字段求和得到对应数值:
| 字段名 | 数值(kB) | 说明 |
|---|---|---|
| SUnreclaim | 68444 | 不可回收的slab内存,用于存储内核核心数据结构缓存 |
| KernelStack | 11280 | 内核栈占用内存,每个进程对应固定大小的内核栈空间 |
| PageTables | 8456 | 页表项占用内存,用于维护虚拟地址到物理地址的映射关系 |
| VmallocUsed | 29464 | 内核通过vmalloc分配的非连续物理地址内存 |
| Percpu | 16512 | 每个CPU专属的percpu变量占用内存 |
| 已使用CMA内存(CmaTotal - CmaFree) | 1776 | 连续内存分配器已使用的空间 |
| 未单独统计的内核占用内存 | ~568644 | 包含内核镜像静态占用、内核模块、未统计的临时分配内存,以及smem统计用户态、缓存时的偏差抵消项 |
上述前6项可明确统计的字段求和为135932 kB,加上未被/proc/meminfo单独统计的内核占用部分,总数值正好匹配你环境中的704576 kB Noncache值。
另外注意smem计算时会自动剔除大页(Hugetlb)和所有可回收缓存(包括Slab可回收部分、页缓存、Buffers等),所以这些部分不会被计入Noncache。
内容的提问来源于stack exchange,提问作者Pavol Zibrita
相关产品推荐
相关产品推荐

