![`numstat` 中的大页面数量不正确](https://linux22.com/image/767136/%60numstat%60%20%E4%B8%AD%E7%9A%84%E5%A4%A7%E9%A1%B5%E9%9D%A2%E6%95%B0%E9%87%8F%E4%B8%8D%E6%AD%A3%E7%A1%AE.png)
我问过类似问题问题几年前。
现在我的机器有 4 个 1G 大页和 256 个 2MB 大页:
# cat /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
4
# cat /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
256
但随后numstat -vm
显示:
Per-node system memory usage (in MBs):
Node 0 Total
--------------- ---------------
MemTotal 65205.89 65205.89
MemFree 58656.55 58656.55
MemUsed 6549.34 6549.34
Active 158.62 158.62
Inactive 89.90 89.90
Active(anon) 15.32 15.32
Inactive(anon) 9.04 9.04
Active(file) 143.30 143.30
Inactive(file) 80.86 80.86
Unevictable 10.69 10.69
Mlocked 10.69 10.69
Dirty 0.02 0.02
Writeback 0.00 0.00
FilePages 235.87 235.87
Mapped 16.08 16.08
AnonPages 23.42 23.42
Shmem 9.43 9.43
KernelStack 5.38 5.38
PageTables 2.84 2.84
NFS_Unstable 0.00 0.00
Bounce 0.00 0.00
WritebackTmp 0.00 0.00
Slab 50.60 50.60
SReclaimable 23.14 23.14
SUnreclaim 27.46 27.46
AnonHugePages 0.00 0.00
HugePages_Total 4096.00 4096.00
HugePages_Free 4096.00 4096.00
HugePages_Surp 0.00 0.00
根据我上一篇文章的回答,4096 应该是一个“单位”。现在,我很困惑。这里的单位是什么?
在我看来,“单位”是“MB”,并且numastat
不包括那些 2MB 的大页面?
为什么这里没有报告 2MB 的大页面?
答案1
Linux 上的大页面并不容易理解。尤其是当某些工具显示其他工具无法显示的内容,并且每个人都在进行自己的单位转换时。
系统范围/proc/meminfo
将显示所有大页面大小的总和Hugetlb
巨无霸
是所有大小的巨页所消耗的内存总量(以 kB 为单位)。如果使用不同大小的巨页,此数字将超过 HugePages_Total * Hugepagesize。要获取更多详细信息,请参阅 /sys/kernel/mm/hugepages
numastat -m将根据每个 NUMA 节点的统计数据输出“meminfo-like”,/sys/devices/system/node/node?/meminfo
但它也会将单位转换为 MB。我不知道为什么这显然缺少所有大小的总和。也许内核放弃了这一点,让用户工具对每个节点的数据做他们想做的事情?大概你得到的输出只有 4x 1GB 页面。
hugeadm(来自 libhugetlbfs)通过对每个页面大小求和来确定其推荐的 shmmax /sys/kernel/mm/hugepages/
。 hugeadm --explain
对于检查每个池的默认值和大小也很有用。
仅使用一个大页面大小可能更易于操作。小于 5 GB 的 2 MB 页面相对较小,这些页面可能全部为 2 MB。1 GB 页面大小可以工作,但对于小分配来说可能是一种低效的空间利用。