我注意到如果我这样做cat /proc/meminfo
我得到以下内容
…
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 662864 kB
DirectMap2M: 7643136 kB
DirectMap1G: 1048576 kB
可以看出已经分配了1G字节的页面。然而,当我查看 ksysguard 时,我发现没有内存超过 125M / 213M(rss) 的进程。
我怎样才能知道哪个进程正在使用它?
更多信息
#> cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
答案1
这些DirectMap
条目不反映记忆使用,它们反映物理内存的页面映射或页面条目。DirectMap1G
计算使用 PUD 级页表映射映射的内存量。
映射是在引导期间设置的;看arch/x86/mm/init_64.c
并寻找phys_pud_init
和phys_p4d_init
。/proc/meminfo
各个条目中显示的值的总和DirectMap
应类似于系统中物理 RAM 的总量,并且总量永远不会变化,尽管份额会变化(例如,PUD 级映射可以拆分为 PMD) -级别映射,这将减少 中显示的值DirectMap1G
并增加 ) 中显示的值DirectMap2M
。
答案2
我认为这并不能完全回答问题,但它部分地回答了问题。
在调查时我不小心重新启动了。重新启动后我发现DirectMap1G
不是 5G 字节。在意识到我没有对持久配置做任何事情之后。我注意到三个页面大小的总和大约相当于我的 RAM 8GB 的大小。我正确地添加了它,它是 8G9 (8.9G) [可能是其他内存映射的东西:vRAM 和其他硬件,MMU 不仅适用于 RAM]。然后我开始了一个大过程,再次测量,总数仍然是8G9左右(移动了一点)。我打开另一个进程,测量,打开另一个......它总是加起来为8G9。
答案3
DirectMap是一个指标,与内核空间相关。您似乎认为它就像大页面一样,可以由用户空间使用。
我引用:
DirectMap 是特定于 x86 的,并给出 TLB 负载(转换后备缓冲区)的指示,而不是内存使用情况:它计算映射为 4KB 页面、2MB/4MB 页面和 1GB 页面(如果支持和使用)的页面数。