ααΆαααααααα’ααααααααααΆααααα
ααααααΆαααα·αααα·ααααααα·ααααΆ
ααΈαα»ααααα»αααΆααα·ααΆαα’αααΈααααααΆααααα αα·αααΎαααααΎαααΆα Hugepages αα
ααΎααΈαα»α
α
α’ααααααααααΉαααΆαααααααααααααααα·αααΎα’ααααα·αααΆααΆααααααααααααΆααααααΎ Hugepagesα αααα»αααΆααα½αααα»αααααΆα
αααΎααααα
αΆαααααααΆαααααΉααα»αααΆ Hugepages ααΉαααααΎα’αααααααΎαα‘αΎαααΌαααα·αααΆαααα’ααα
αΆαααα ααααααΆαααΆααααα αααααααααααΊααΆαααααΆααααααααα»αααααΆααα½α α αΎαα’αΆα
αααααααΆαα’αα»αααα ααααα·αααΎααααΎαα·αααααΉαααααΌαα
αααααααΈ 1α ααΆααααααααααΆααααΆαααααααααααααΌαααΆαααΎααα
ααΎααΈαα»α
(ααΎα αα
ααΈααα )
αααα αΆ:
α’αααααααΌααα·αα·αααααΎαααΆααΎ HugePages ααααΌαααΆαααΎααα
ααΎααααααααααααα’αααα
ααΆαααααααααΆα:
ααΆααΆααααααΆααα
cat /sys/kernel/mm/transparent_hugepage/enabled
α’αααααΉαααα½αααΆαα’αααΈαα½αααΌα αααα
always [madvise] never
α’αααααΉαααΎααααααΈαααααΎααααααΆα (ααααα, madvise, αα·αααα) α αΎααααααΎααααααααααα αα α»ααααααααΉαααααΌαααΆααα»αααααααααα»αααααααα α (ααΆαααααΆαααΎα αααΆααΈααΈα).
αααΆααΈααΈα ααΆααααααΆ transparent hugepages
ααΆαααΎααααααΆαααααααααα’αααα
αα
αΆααααααααΎαα»αααααααααααΆαα
αααΆααααΆαααααααααΎ
ααααα ααΆααααααΆ transparent hugepages
αααααααΎαααααΎαααΆααααααΆααααααΎαααΆαααΆααα’ααα ααΆααΆααααααΆααααΎα’αααααααΎαα‘αΎαααΌαααααΎαααΆα ααα»ααααααααα·αααΎα’αααααΆαααααΈααααΎααααΆαααααααααΎαααΆαααΆα
αααΎααααα»αααααΎααααΆααα’αααα
αα
αΆααα·α
αα½α
αααααΆααααα»αα’αααα
αα
αΆαααΆααααΌαα’αΆα
ααΎαα‘αΎααααΆαααααΆααα
αα·αααα ααΆααααααΆ transparent hugepages
ααΉααα·αααααΌαααΆαααΆαααααα
αΌαααΌααααΈαααα
αααααααΎαα»ααααααααΎααααΆαα madviseα ααΎααααΈαααααααααααααα ααΌαααΆαααα
ααααααααΆααααααΌααααααααααΆαααΎα
αααααΎα 1α ααααΆααααααΌααααααααΆαα sysfs
(αααααΆααααΈα
αΆααααααΎαα‘αΎααα·α αααΆαααΆααααααααΉααααα‘αααα
αααααααααΆαααΎαααααααΆαα·α)α
echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabled
αααααΎα 2α ααααΆααααααΌαααααΆαααΎααααααααααααααααααΆαα αααααααΊαααα‘αΎααα·αααΆαα½αααΉαααΆαααααααα ααΆαααααααααααααΆααααααα (αααααΎααααααααΌαααΆαααααΆααααααα»αααααΈαααα’ααααααα»αααααΎααΊαααααααΆαααααα½αααα»ααααα)α
- ααΎααααΈαααααααΆαα·α
αα
ααΆαααααΆαααΎα ααΌαααααΎα
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
- ααΎααααΈααααα madvise ααΆααααΆαααΎα ααΌαααααΎα
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
αααααααΈ 2: αα»ααααααααα· αα·ααα»ααα·ααααα·αα HugePages
ααΎαααΉαααααΆααΆααααααααααααααΎαααΎαααΈαα»ααααααααα· αα»ααα·ααααα· αα·ααααα αΆαααα’αΆα ααΎαααΆαααααΆαααααΎααααΆαα Hugepagesα αααααΆαβα’αααααβαααβααΆαβααααααβαααα»αβααααΆαβααΆαβαα αα αααα·ααααΆβαα·αβααΆβααΆααΆβααΎαβααααβααΆβαα·ααΆαβαααβαααααΆααβααα»αααβαααβααααααβαααα»αβααΆαβαα·αβααΆβHugepagesβααΊβααΆβααααΆαααα»αααα αααα»αβααΉαβαααααβααΆαβααααΉαβααααΌαβααΎααααΈβααΆαβααΆααααα ααΆααααΆααααααΆαααααααααα»αα α·αααααΆ αααααΆαααααΆα αααΎααα·αααΆαααα»αααααααΆα ααΌα ααααα αΎαααΆαααααΎα±ααααΆαααααααΆαααααΆααα
ααΌαα αααΆαααΆααΎααααα»ααα·ααΆαα’αααΈαααααααα 64 αααΈα x86 αααααααΎαααΆαααΎααΈαα»α α αΎααααα»αααααΆααααααααααααΆαααααααααααααΆααααααααααααααααΆααααααΆααΆα (αααααααΆαα·ααααααΆαα»ααα·ααααα·αααααααααααα·αααααΌαααΆααααααααΆααααΎαα) ααΌα ααααΈααααΎααααααααααΈαα»α ααααΎααααα ααα·ααααΆαα
αααα»αααΉαααααΆααααΆααα·αααααΆαα αα αααααααααααααααα αααα»ααααααααΆααααΆααααααα
α’αααα αα αΆααα·αααα·α
ααααα·αααΎα’αααααΆα’αααααααααααααα·ααΈ C++ α’αααααΉαααΆααααα»αααα»αα’αααα αα αΆαααΆαα’αΆααααααΆαααΆααααΆαα (αααααααααα·α )α
ααααααΆαααΆααααα α’αΆααααααΆαααΆααααααα·αα αΆαααΆα ααααα»ααααα αΆααααΈα’αΆααααααΆαααΆααααααααα αααα»αα’αααα αα αΆα (α’αΆααααααΆα RAM) αααααα αα½αααααααΆαα±ααα’αΆααααααΆααα αααα»αααα·αα·αααα·αα αα½αααααΆαααΆααααΌαα»α MMU αα·ααα (α’αααααΆααααααααααα’αααα αα αΆα) ααααα½αααΊαααααααΎαααααΈα’αααα αα αΆααα·αααα·ααα ααΈααΆααααΆαααααααα
αα·ααΈααΆααααααααααΆαα’αααααααααααααΆα αααΎα ααα»ααααα’αααΈαααααααΆαααααα»ααααααΊα
- ααΆαα’αα»αααα (αααααΆααα ααα»αααααααα);
- ααΆαα―αααααααα·ααΈ ααΆααααααΆ ααααΆααααααα·ααΈααΆα’αΆα α’αΆαααΈααα·αααααααα·ααΈαααααααΆαααα
ααΎαααααα’αααΈαααα?
α’αααα αα αΆααα·αααα·αααααΌαααΆααααα αααα ααΆαααααα αααααααΈαα½ααα ααα’α»ααα α’αααα αα αΆαααΆααααααα ααΆα’αΆα α ααα’α»ααα ααααααα½ααα αααα»α RAM α¬ααΆα’αΆα α ααα’α»ααα α’αΆααααααΆααααααΆαααααααα α§αααααααΆααααααα ααΌα ααΆααΆαααΈααα’αΌααΆααΎαα
ααΆαα αααΎαααααααααααα’ααααααααααΆαααΆαα½αααΉαα ααα»α αα½ααα ααΆαα RAM α¬ααααΌαααΆαααααΌα ααΆααααααΆαα½αααΆααααΌαααΆααααααΆαα»ααα ααΎ hard drive α¬ SSD ααααα’αααα ααΊαααααααααααααααααααΌααααααααααααααΈαα½ααα ααααα·αααΎαααααααααααααααααααΌαααΆαα αΌαααααΎ ααΊααααααααααααααααα‘αΆαααααααα»αααααΆααΆαα αΌαααααΎα’αααα αα αΆα α’αΆααααααααΈααΆαααΉα/SSD αα αααα»α RAM α αΎααααααΆααααααααααααΎαααΆααααααααα‘αΆαα
ααααΎαααΆααααααΆααααααΆααΆα ααΆααααααΆααΆαα·αα αΆαααΆα αα’αΆααααααααΆααααΈ HDD/SSD ααα ααα ααααααααααααααΆααΊ 4096 ααα ααα ααααααααααααΊ 2 ααααΆααα
Translation-associative buffer (TLB)
αα αααααααααααα·ααΈα αΌαααααΎαααααααα’αααα αα αΆα CPU ααααΌαααααΉαααΆαααααααΌαααααααΆαα½ααααααααΌαα’αΆααα·ααααααααΈ (αααααΊααΆααααααΈα’αΆααααααΆααα·αααα·α)α
ααΊαααααΆααα ααΆαααααααααα·αααααα (ααΆααΆαααααα) αααααΆαααααααΆαααΆααα’ααα’αααΈαααααααααααα»αααααΎα αααααααΎαα ααΆαααααααααα·ααααααααα α’αααα’αΆα ααααΌααααα’αΆααααααΆααα·αααα·ααα α’αΆααααααΆαααΌαααααα
αααααΆαααΆαααΆααααα ααΆααΆααααααααΊαααα»αααααΆα αα·αααΊα ααΌα ααααααΎααα·αα’αΆα αα·ααΆααα ααΆαααααααααα·ααααααααΆααααΌαααΆααα ααΆααααααααααααΎαααΆαααΆαα½αα αΌαααααΎα’αααα αα αΆαα
ααΆααααΆαααα’ αα½αααααΆαααααααΎαααΆα TLB ααααααααΆαα»αααΆαααΌααααααΈαααΆαα’αΆααααααΆααα·αααα·α αα·αααΌαααααα αααααΆααααααΆ αααααΈααΆααΎαααααΌααααααΆααΆαααααααα ααΎααΆαααα»ααααα αΌαααααΎααΎαααααΌαααααα ααΆαα αΌαααααΎααΆαααααααααΆααααΆααα’αααα ααΆαααααααα’αΆα ααααΌαααΆαααααααααααα αααα»α TLB αααα’αα»ααααΆαα±ααααΆαααααα·ααααα·ααΆαααΏαα
αααααΆαααααΆααααΌαααΆαα’αα»ααααααΆα§αααααααΆαααΆα (αααααααΎα±ααααΆααΏααα αααα»αααααααααααΌα) αααααααΆαααααααΆααααΌαααΆααααααα ααΌα ααααααααα·αααΎα’αααα ααα αΌαααααΎαααααααααααααα TLB ααΉααα·αα’αΆα αααααΆαα»ααααααΈαααααΆαααα½αααΆααΆααα’ααααΆααα ααααααααΆαα±αααααααα·ααΈααααα’αααααααΎαααΆαααΊαααΆαα
ααααααααααααα½ααααααααα
ααΌα αααα ααΎβααΎαβα’αΆα βααααΎβαααΆαβααΆβααΎααααΈβαααααΆαβααΆαβα ααβαααα TLB? (ααΎαααααααααΆαααααα·ααΈαα ααααααΌαααΆαα ααα½αα’αααα αα αΆααααα)α
αααααΊααΆααααααααα Hugepages α αΌαααα αααα½αα±αα 4096 αααααααΆαααΆαααΆαα» TLB αα½α ααΆαα» TLB αα½αα₯α‘αΌααααα’αΆα α ααα’α»ααα 2 ααααΆααα α§αααΆααΆ TLB ααΆαααΆαα» 512 αα ααΈααααααααααΆα Hugepages ααΎαα’αΆα ααααΌααααααΆαα
4096 bβ
512=2 MB
ααΌα ααααααΎααΎαα’αΆα ααααααααααΆαα½ααα½ααααααααααααΆα
2 MBβ
512=1 GB
αααααΆααΌαα ααα»ααα Hugepages α’ααα αΆαααα αα½αααα’αΆα αααααΎαααα·αααΆαααααα·αα αΆαααΆα αααααΉααααααα αααΎαα ααα»ααααααΆαααΆααααααΆαααααΆααααα ααΈαααα
ααΆαααααααααααααααααααα
ααΊαααβαααα½ααα·αα·αααβαααβαααααβαααααααα·βα’αααΈβα
ααα½αβαααααβα’αααα
αα
αΆαβααΈαα½ααβααααΌαβααΆαβααααΎα ααααα·αααΎαα·αααΆαα’αααα
αα
αΆαααΌαααααααααααααααΆαα (RAM) ααΊαααααΉαααααΆααααΈαααααααααα·αααΌαααααΆαα (αα·αααΌαααααΎααΉαααΆαα) αα
ααΆααααΆαααΉα ααΎααααΈααααα RAM αα½αα
ααα½ααααααΆαααααααααααΆααααααααααααα
ααΆαααααΆααα ααΌα
ααααΆααααααα’αα»ααααα
αααααααααααα ααααααΆαααΆααααα ααΊαααα’αΆα
ααααΌαααΆααααααααααΆααααΌα αα·ααααααααΈαα½ααααα
α§αααΆααΆααΎαααΆααααααα·ααΈααΌα αααα
char* mymemory = malloc(2*1024*1024); // ΠΠΎΠ·ΡΠΌΠ΅ΠΌ ΡΡΠΎ Π·Π° ΠΎΠ΄Π½Ρ Hugepage!
// ΠΠ°ΠΏΠΎΠ»Π½ΠΈΠΌ mymemory ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½ΡΠΌΠΈ
// Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈΡ
Π²Π΅ΡΠ΅ΠΉ,
// ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅ ΡΡΡΠ°Π½ΠΈΡΡ mymemory
// ...
// ΠΠ°ΠΏΡΠΎΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ Π±Π°ΠΉΡΡ
putchar(mymemory[0]);
αααα»αβααααΈβααα ααΊαααβααΉαβααααΌαβααΆαβαααα½α (α’αΆα) α αααΎαβααΌα βααΆ 2 ααααΆααβααβααααααΆαβααΈ hard drive/SSD αααααΆααβααβα’αααβα’αΆαβαα½αβααα αααααΆαααααααααααααΆ ααΆααα 4096 ααααα»ααααααααααααΌαα’αΆαααΈ hard drive/SSD α
ααΌα αααα ααααα·αααΎαααααααααααΌαααΆαααα·ααα ααΆααΆααααααΏααααα»αααΆαα’αΆα ααααα·αααΎα’αααααααΌαααΆαα αΌααα ααΆαααααααααΆααααΌαα αααααΆααααααΆ ααααα·αααΎα’ααααααα»αααααΆααΆαα αΌαααααΎαααααααααααααα’αααα αα αΆααααα ααααα α αΎαααααΆααααα’αΆαααΈαααΈααΈα‘αΌαα α’ααααα½αααααααΎαααααααααααΆ α αΎααα»αααΆααααα’αααΈα’αααΈααααααααα
αααααΆααα·αααα ααααα·αααΎα’αααααααΌαααΆαα αΌααα ααΆαααααααααααα’αααα αα αΆαααΆαααααααααΆαα αααααααααααΉαααααΎα’ααααααΎαααΆαααααα’ααααααααΎαα‘αΎαα ααααααΆαααΆααααα α’αααααααΌαααΆαααααααΆααααααα½αα―α (αα·ααααααΆαα½ααααααα·ααΈ abstract) α αΎαααΎαααΆα’αααΈαααααααΎαααΆαααΏαααΆααα»αα
ααΆααααα αααα αααα»αααΆαα αα αΆα
ααααα·αααΎα’αααααααα C α’αααααΉαααΆα’αααα’αΆα
ααααΎαα»αααα·ααΆαα’αααα
αα
αΆαααΌα
(α¬ααααΎαααα
αααΎαααΆαα’αααΎα
α·ααα) ααΈ heap αααααααΎ malloc()
. α§αααΆααΆα’αααααααΌαααΆαα’αααα
αα
αΆα 30 ααα
char* mymemory = malloc(30);
α
ααααα’αααααααααααααα·ααΈ ααΆα’αΆα
αααα αΆαααΆα’ααααααα»α "ααααΎαα»α" α’αααα
αα
αΆα 30 ααααΈααααααααααααα·ααααα·ααΆα α αΎααααα‘ααααααα·α
αα
α’αααα
αα
αΆααα·αααα·ααα½αα
ααα½αα ααα»ααααααΆααα·α malloc ()
ααααΆααααααΆαα»αααΆα C αααα α
α
ααααΈαααα»ααα»αααΆα
αααααΆαααΆαααΆααααα ααΆαααααΎαα»αα’αααα
αα
αΆαααΆααααα
αααΎαα‘αΎαααααααΆααααΆααααα
ααααΈαα½ααααΊαα·αααΆαααααα·αααααΆαααα ααΆααααααΆααΆαααααα’αααα
αα
αΆααα½αα
ααα½αααααΌαααΆααααααααα½α
α αΎα (free())
α αΎαααΎαα’αΆα
ααααΎααΆα‘αΎααα·αααΆαα malloc()
α’αα»αααααααα½ααααααααΆααααααα»αααααΆααααααΆααααΆαααααΎααααΆααα’αααα
αα
αΆααααααΆαααααααα‘αΎααα·α
αααα»ααααααΆαα½αααααΆααα α’αααΈαααΎαα‘αΎαααααα·αααΆαααααααααΆαααααααΆααα’ααα ααΌα
ααααα ααα»α’αααΈααΆαααΆααΆαα½ααααα½αααΆαααααααα’ααα? ααα»αααααααααΆααααααα αΆααααα free()
αα·αααΆαααααααααα
ααΆαααΏαααΌα
ααΆααΆααααα
ααααΆαα
αα
αΆαα αααα»αααααΈααααααααα ααΆαααααα heap αααααααΎααααα»ααααΆαααααα»ααααα αααααααααα’αααΈαααΆααα’αααα
α
αααααααααΌαααΆααααααα (free())
.
ααΌαα αααΆαααΆααΆααααα ααα’αααα αα αΆαααΊααΆαααααΆααααααααα»αααααΆααα½α α αΎαααΌααααΈααααΆαααααΆααααααΌαααααα·α ααααα½α α αααααααααα·ααΈααα’αΆα ααΆααααααααΆαααααΆαααααΆαααααααα αααα»αααααΈααΆαα αααΎα αααααα·ααΈααΉααα·ααααααΆαα±ααααΆαααΆαααααααααααααΆαα αα αΆαααααααΆααααααα ααα»ααααα’ααααα½αααααΉαααΆ ααααα·αααΎααΆααααα αΆααΆαα½αααΉαααΆααααααααααα αααα»αααααααα½αα ααα½α ααααααααααααα’αΆα ααααΎα±ααααααΆαααΆαααΆαααααααααααααα
ααΆαααααΎαααΎαααααααααααα
αααααΆααααΈα’αΆαα’αααααααα α’αααααΆααααααααΆααΎαααααααΆαα½ααααααααα·ααΈααααα’αααα’αΆα ααα½αααΆαα’αααααααααααααΈααΆαααααΎααααΆααααααααααα αα·ααα½αααΆαα·αα’αΆα α ααΌα αααα ααΎβαααααβααβαα½αβααααΌαβααΆαβααΎαβααΆααα’ααβα¬?
ααααΆαααα’α’αααα’αΆα
ααααΎααΆαα madvise()
ααΎααααΈααΎαααααααααααααααΆαααααααααα’αααα
αα
αΆαααΆααααα αααααΆααΉαααΆαααααααααα
ααΆααααΌα ααΌααα·αα·αααααΎαααΆααα ααααααααααααα»αααααΎαααΆααααα»ααααα madvise() αααααααΎ
αααααΆααααααααΎ madvise()
ααΎααααΈααααΆααααΊαααα±ααα
αααΆαααααααααααααααΌαααααΎαααααααα
#include <sys/mman.h>
// ΠΠ»Π»ΠΎΡΠΈΡΡΠΉΡΠ΅ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΠΌΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
size_t size = 256*1024*1024;
char* mymemory = malloc(size);
// ΠΡΠΎΡΡΠΎ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ hugepagesβ¦
madvise(mymemory, size, MADV_HUGEPAGE);
// β¦ ΠΈ Π·Π°Π΄Π°ΠΉΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅
madvise(mymemory, size, MADV_HUGEPAGE | MADV_SEQUENTIAL)
α αααΆαααΆαα·ααΈααΆααααααααααααΆααααααΆααααΌααααΆααααααΊαααα’αααΈαααααααααααααα’αααα αα αΆαααα»αααααα ααααα·αααΆααααααΆααΊαααααΉαααααΎααααααααααααααααααααααααα·αααααΆααα’αααα αα αΆααααααΆααααααα±αααααααα
ααααα
α―αααΆα madvise()
αααααΆααααααααΆααααααααααΆααααααΌαααααα
αααα·ααα½αα±ααααΏα ααΌα
ααααααααα·αααΎα’αααααΆαααααα
ααααα½αααΆαααΆαα·αααααΆαα ααΌαααααααααα½αααΎααααΈα’αΆα αα·αααΆαααααααΈαααΈαααααΆα ααα»ααααα’αααααααΉαααΆααΉαααΆααααααααα·αααααΆαααΆαα½αα
ααΎααααΌαα’αΆαα’αααΈ?
α’ααααα IBM OpenStack αα ααΎααααααααα αααααβααβααααΆβαααβααΉαβαααααβααβαα·αβααααΆ α’ααααααα·ααΈααΈααΆα’αααΈ TLB α―αααΆαααΊαααααΈαα»α αα ααΎαααααααααααΆ StackOverflowα αααααααααααΊααΆαααΉαααΆααααα ααα’αααα αα αΆα α’ααααααααα Microsoft ααααΈααΈααΆααααααααααα’αααα αα αΆααα·αααα·α
ααΆααααα½ααα? ααααααα αααα»αααα·ααααα!
ααααα: www.habr.com