我已经通过以下步骤在使用 jemalloc 进行内存分配的进程中启用了透明大页面:
- 将透明大页面状态设置为“madvice”:
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled;
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag;
2.设置jemalloc始终使用thp
export MALLOC_CONF="thp:always,metadata_thp:always,dirty_decay_ms:-1";
由于程序只使用jemalloc分配内存,所以预期的结果应该是完全使用的内存大小(RSS)等于分配的huge page的大小。但它有很大不同,如下所示的“AnonHugePages”和“Rss”项目:
# cat /proc/<pid>/smaps |awk 'NF==3 {dict[$1]+=$2} END{for(key in dict) print key" "dict[key]}'
Locked: 4
Shared_Clean: 18732
MMUPageSize: 8776
KernelPageSize: 8776
Pss: 150242778
Swap: 0
ShmemPmdMapped: 0
Shared_Dirty: 0
Size: 258068324
Private_Hugetlb: 0
Private_Dirty: 150234008
LazyFree: 0
Private_Clean: 124
Referenced: 147993656
VmFlags: 0
AnonHugePages: 76193792
Rss: 150252864
SwapPss: 0
Shared_Hugetlb: 0
Anonymous: 150232456
我知道如果操作系统中没有足够的大页面可用,则会发生正常的内存分配(4k 页面),将计数添加到“/proc/vmstat”中的“thp_fault_fallback”项。但是该值很小,如下面的代码片段所示,这意味着不会发生太多的非大页面分配:
# grep thp_fault_fallback /proc/vmstat
thp_fault_fallback 2982
那么,为什么 RSS 和 THP 的大小有差距呢?期待一些线索和建议。