You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分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)说明
SUnreclaim68444不可回收的slab内存,用于存储内核核心数据结构缓存
KernelStack11280内核栈占用内存,每个进程对应固定大小的内核栈空间
PageTables8456页表项占用内存,用于维护虚拟地址到物理地址的映射关系
VmallocUsed29464内核通过vmalloc分配的非连续物理地址内存
Percpu16512每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:15:01