Home [草稿] 关于各种各样的 memory
Post
Cancel

[草稿] 关于各种各样的 memory

(诈尸氵一篇 meminfo)

文章还处于 work in progress 状态,先直接从 OneNote 上复制过来吧

示例

meminfo 的分类有:

	MemTotal:       16642364 kB
	MemFree:         9337232 kB
	Buffers:           34032 kB
	Cached:           188576 kB
	SwapCached:            0 kB
	Active:           167556 kB
	Inactive:         157876 kB
	Active(anon):     103104 kB
	Inactive(anon):    17440 kB
	Active(file):      64452 kB
	Inactive(file):   140436 kB
	Unevictable:           0 kB
	Mlocked:               0 kB
	SwapTotal:      26214396 kB
	SwapFree:       26120500 kB
	Dirty:                 0 kB
	Writeback:             0 kB
	AnonPages:        102824 kB
	Mapped:            71404 kB
	Shmem:             17720 kB
	Slab:              13868 kB
	SReclaimable:       6744 kB
	SUnreclaim:         7124 kB
	KernelStack:        2848 kB
	PageTables:         2524 kB
	NFS_Unstable:          0 kB
	Bounce:                0 kB
	WritebackTmp:          0 kB
	CommitLimit:      515524 kB
	Committed_AS:    3450064 kB
	VmallocTotal:     122880 kB
	VmallocUsed:       21296 kB
	VmallocChunk:      66044 kB
	HardwareCorrupted:     0 kB
	AnonHugePages:      2048 kB
	HugePages_Total:       0
	HugePages_Free:        0
	HugePages_Rsvd:        0
	HugePages_Surp:        0
	Hugepagesize:       2048 kB
	DirectMap4k:       12280 kB
	DirectMap4M:      897024 kB

公式换算

meminfo 可以看 mm 模块的代码,虽然类型很多,但计算方式还算透明

内存类型 简化换算 其它备注
MemTotal physical - .text total 并不是全部,需要抠掉一些 kernel 代码段的大小
MemFree lowFree + HighFree HighFree 基本就是 0 的意思
MemAvailable   一个简单的估算方式是 所有 zone 的 free 减去 low reserved 和 high watermark 加上 可回收的 page cache 和 slab 这里的可回收是个估算值,可能直接取总数的 1/2
Buffers for each bdev: ret += bdev->bd_inode->i_mapping->nr_pages 裸设备读写的临时存储 如果是文件系统操作则应对应于 metadata,如 inode,superblock 否则要算上直接读写 bdev 的 mapping(本质就是 bdev)
Cached page cache, in-memory files only 这里只算 in-memory 引起的 需要减去 SwapCached 和 Buffers 可以认为代表文件映射的内存和 tmpfs(shmem)映射(因为也是 file-backed)的内存
SwapCached   曾经换出,然后换入回来的内存,但是仍存在于 swap 文件 这是用于节省 IO 的,当已经换回来后,如果再次缺少内存,那就直接舍去这一部分,而不是换出回 swap 文件,从而节省 IO
Active   LRU 中标记 active,一般不 reclaim,但也有可能
Inactive   LRU 中标记 inactive,很可能 reclaim
HighTotal, HighFree   ~
LowTotal, LowFree   ~
SwapTotal   ~
SwapFree   已经被换出的内存,临时存储在 disk
Dirty   标记为 dirty 的内存,仍未写回
Writeback   正在写回的内存
AnonPages   映射到 userspace 页表的无后备文件的内存
HardwareCorrupted   ~
AnonHugePages   ~
Mapped   已经被 mapped 映射的文件
Shmem shmem + tmpfs  
ShmemHugePages    
ShmemPmdMapped    
KReclaimable SReclaimable + …direct allocations kernel 分配出来的,但可被 reclaim 的内存
Slab   ~
SReclaimable part of Slab Slab 的一部分,允许 reclaim
SUnreclaim part of Slab Slab 的一部分,不允许 reclaim
PageTables   ~
VmallocTotal vmalloc()  
VmallocUsed used vmalloc()  
VmallocChunk largest contiguous and free vmalloc()  

meminfo 在具体的实现上,仍然是获取来自 vmstat 的全局变量信息

其实 vmstat 也是从 kernel 提供的 API 去更新值的,涉及到整个物理内存 zone 管理的细节

注:关于 pagecache

统计代码实现上,pagecache 相当于 active file LRU 加上 inactive file LRU

我觉得应该不只是这些,可能是个大概的值

而在接口层面,Cached 成分相对复杂,是 NR_FILE_PAGES - SwapCached - Buffers

这个 NR_FILE_PAGES 就是所有的 mapping 之和了,就是不确定是否等于上述的 pagecache(两个 LRU 加起来)

有一种观点是 Buffers + Cached = inactive(file) + active(file) + shmem

Shmem 是算到 Cached 里面的

Buffers 算是 bdev files mapping 特例排除掉

因此一个完整的 pagecache = inactive(file) + active(file) + shmem,而上面 available 统计实现是为了快速估算没算上吧

This post is licensed under CC BY 4.0 by the author.
Contents