ฉันได้เปิดใช้งานเพจขนาดใหญ่ที่โปร่งใสในกระบวนการที่ใช้ jemalloc สำหรับการจัดสรรหน่วยความจำ โดยทำตามขั้นตอน:
- การตั้งค่าสถานะหน้าขนาดใหญ่โปร่งใสเป็น "madvice" :
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled;
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag;
2. การตั้งค่า jemalloc ให้ใช้ thp เสมอ
ส่งออก MALLOC_CONF="thp:always,metadata_thp:always,dirty_decay_ms:-1";
เนื่องจากโปรแกรมใช้เฉพาะ jemalloc เพื่อจัดสรรหน่วยความจำ ผลลัพธ์ที่คาดหวังควรเป็นขนาดของหน่วยความจำที่ใช้ทั้งหมด (RSS) เท่ากับขนาดของเพจขนาดใหญ่ที่จัดสรร แต่มันแตกต่างกันมาก เนื่องจากรายการ "AnonHugePages" และ "Rss" แสดงด้านล่าง :
# cat /proc/<pid>/smaps |awk 'NF==3 {dict[$1]+=$2} END{for(key in dict) print key" "dict[key]}'
ล็อค: 4
แชร์_คลีน: 18732
MMUPขนาดหน้า: 8776
KernelPageSize: 8776
Pss: 150242778
สลับ: 0
ShmemPmdMapped: 0
Shared_Dirty: 0
ขนาด: 258068324
Private_Hugetlb: 0
Private_Dirty: 150234008
ขี้เกียจฟรี: 0
ส่วนตัว_สะอาด: 124
อ้างอิง: 147993656
VmFlags: 0
AnonHugeเพจ: 76193792
RSS: 150252864
SwapPss: 0
แชร์_Hugetlb: 0
ไม่ระบุตัวตน: 150232456
ฉันรู้ว่าการจัดสรรหน่วยความจำตามปกติ (หน้า 4k) จะเกิดขึ้นหากไม่มีหน้าขนาดใหญ่เพียงพอในระบบปฏิบัติการ เพิ่มจำนวนหนึ่งรายการให้กับรายการ "thp_fault_fallback" ใน "/proc/vmstat" แต่ค่ามีขนาดเล็กตามตัวอย่างด้านล่างที่แสดง หมายความว่าไม่มีการจัดสรรหน้าที่ไม่ใหญ่เกิดขึ้นมากนัก:
# grep thp_fault_fallback /proc/vmstat
thp_fault_fallback 2982
แล้วทำไมช่องว่างระหว่างขนาดของ RSS และ THP? รอคอยที่จะเบาะแสและคำแนะนำบางอย่าง