ááľáá
ááą á°ááŞáá˝ á¨á°ááááá á˝áá áľááá
á¨áá
áá°á Hugepagesá á ááááľ áá áĽáá´áľ áĽáá°áááá áĽá ááááľ áĽááłááĽá á°ááᏠáá áá˘
áá
á˝áá á áá á¨áááá Hugepagesá á¨áá ááá áľ áŚáł áŤááľ áĽáť ááᢠHugepages áááłáááľá á á áľááľ áŤáťá˝ááá á áá á°áľá á¨á°áłáá áĽá á°áá˝á á áááťááᢠááá áá ááá áá
áá ááľáĽáľáĽ áááľ áá áĽá á áľá
á°áľ áĽá
á áá á¨áá á ááááá ááŤáłááľ áá˝ááá˘
ááá 1ᥠááá ááá˝ á ááááľ áá ááááłá¸áá áá¨ááἠ(á¨ááááŞáŤá áĽáá
)
á˝áá:
HugePages á áľáááľá áá ááááąá áá¨ááἠá ááĽááľá˘
áááľáá:
á áŁá ááá áááĄ-
cat /sys/kernel/mm/transparent_hugepage/enabled
áĽáá°áá á áááľ ááá áŤááááĄ-
always [madvise] never
áŤááľá á ááŤáŽá˝ áááá áŤáŤá (ááá ᣠáĽáĽáľ ᣠá ááŤá˝), áĽá á áá áŤáá á ááŤá á á áá ááľáĽ (á ááŁáŞ) áááá áá áľ).
áá áľ áááľ áá 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
- ááľáŞáá áĽáá° ááŁáŞ ááááááľáŁ áá áááĄ-
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
ááá 2ᥠá¨Hugepages áĽá áá˝ áĽá ááłáśá˝
Hugepagesá á áá áá áĽá áášá ᣠááłáśá˝á áĽá ááá á¨áá˝á ááłáśá˝á á ááá¨áĽ áááľá¨áłáľ áĽááááŤááᢠHugepages ááľáááľ áá áĽáá áááłáá á°áá˝ á á´áááá ááľáĽáľáĽ áĽá ááłááłá á áá ááá¨áłáľ á áłáá˝ áľáááá ááááááľ áľááááááľá áĽá°áááᢠáĽá ááĽáśá˝ á áĽáááľ á¨á°ááłá°áĄ áĽá á áŁá á¨á°ááá áááá¸áá ááľáłááľ áĽáť á°áᢠááá˘
áĽáŁááá áĽá¨á°ááááá áŤááá ááááľá áľáááŤáľáŹáą 64-á˘áľ x86 á˛áľá°áá˝ áá ᣠáĽá áľáááą ááá ááá áážá˝á áĽáá°áá°áá áĽáááłáá (áá áľáá áážá˝ á áááá ááłáą áľáááá) á ááááá áááá ááááľ ááľáĽ áĽáá°ááłá¨áᢠá áŤáŁá˘.
á¨áá á áłá˝ áŁááľ áááááá˝ ááľáĽ á°á¨á᪠á´áááŤá ááááŤáá˝á á áŤáááá.
áááŁá áá á°á¨ áľááľáł
á¨C++ ááŽááŤá á áľáŤá á¨ááá á áá á°á¨ áľááľáł ááľáĽ áŤá áááŽá˝ á¨á°áá°á á áľáŤáťáá˝ (á áá áĽá´áśá˝) áĽááłáá¸á áłáááá á˘
áááᣠáĽááá á áľáŤáťáá˝ á¨ááľ á áŤáá á áľáŤáťáá˝á á áá á°á¨ áľááľáł (áŤá á áľáŤáťáá˝) á¨ááŤáááŁáá á áá°ááᢠá áááŁá áá á°á¨ áľááľáł ááľáĽ á áľáŤáťáá˝á ááááá. ááŽá°á°áŠ á¨á¨ááá áŤááł áááŁá áá á°á¨ áľááľáłá áá° á áŤáá áŚáł á¨ááŤáá áአMMU (á¨áá á°á¨ áľááľáł á áľá°áłá°á ááá) ááá á ááá˘
áá áá´ áĽá áĽá áá˝ á ááľ, ááá áá á áŁá á áľáááááš á¨áá¨á°ááľ áá¸á.
- á áááá (á á°ááŤáŠ ááááŤáśá˝);
- á¨ááŽááŤá áááá ᣠáááľá ᣠááá ááŽááŤá á¨áá ááŽááŤá áá á°á¨ áľááľáł ááá ἠá áá˝ááá˘
áážá˝ áááľá áá¸á?
áááŁá áá á°á¨ áľááľáł á áážá˝ á°á¨ááá. áĽáŤááłááą áá˝ áá° á ááľ á¨á°áá°á á áŤáá áá á°á¨ áľááľáł áá áááᣠáŤá ááľáĽ áŤááá áŚáł ááŤááááľ áá˝ááᣠááá áá áŤáá ááŁáŞáŤ á¨á°áá°á áá á áľáŤáť áááłá á¨áŞá˛áŽ áŤááľ ááŤááááľ áá˝ááá˘
áĽááľá á¨ááŤáľá°áááˇá¸á á áĽááááš ááá˝ áŤá áá ááá ááá áááŤááŤá áá á áááľ á áááľ áľáŤááá ááá á á¤áľá¤áľá˛ áá á°á¨áá˝á°áá áááľ ááᢠá¨ááá á¨áĽáŤááłááąá áá˝ á áŤáá á áááἠáŤáľá°áłáľáŤáᢠá¨á°áá°á áá á¨á°á°á¨á° á¨ááá áá° áá á°á¨ áľááľáł áááľá¨áľ á¨ááááá áá áŤáááᣠáášá á¨áááľ áľáŤáá/á¤áľá¤áľá˛ áá° RAM áŤááĽáŁá áĽá á¨á፠áá ááľáŤáąá áááĽááá˘
áá áá°áľ áĽá¨áľ ááá˝ ááᣠáá á áááľ á¨ááľ á¨á¤á˝á˛á˛/á¤áľá¤áľá˛ á ááĽáł á ááá áĽáᢠá¨áá°á á ááá˝ áá á 4096 áŁááľ ááᢠááá áážá˝ áá á 2 áááŁááľ ááá˘
á¨áľááá-á°áŁáŁáŞ ááľ (TLB)
á ááľ ááŽááŤá á¨ááľáłááť áá˝á á˛á°ááľ á˛áአá¨á¨áľáá á áŤáá áá˝ ááἠááá ἠáĽááłáá áľ ááá á áá áľ (áááľá áááŁá á¨á áľáŤáť áŤááł áááááľ)á˘
á¨ááá áĽá á áá áľáááá ááá˝ áááá áá¨ááá˝ á¨áŤá á¨ááἠááá á (á¨áá˝ á°áá á¨áĽ) á ááᢠáá á á¨ááἠááá á á áá ááᣠáááŁá á áľáŤáťá áá° á áŤáá á áľáŤáť áá°á áá˝ááá˘
ááá á¨ááš á áá á¨áĽ á áŁá á¨á°ááłá°á áĽá áááá áááŁáľááá á ááľ áá°áľ áá á°á¨ áľááľáłá á á°á¨á° ááĽá á¨áłáł á ááááŠá á ááá áá°áá°á á áá˝ááá˘
áĽáá° áĽáľá ááᣠá¨áĽá ááŽá°á°á á áááŁá áĽá á á áŤáá á áľáŤáťáá˝ ááŤá¨á áŤááá áŤááł á¨áá¸áá TLB á ááᢠáá áááľ á ááááŞáŤá á¨ááłá¨áť áá¨áŤ áá á¨áášá á°áá á¨áĽ áá°áá°á áĽááááá ááá á°á¨áłá á¨ááš ááłá¨áťáá˝ á TLB ááľáĽ ááŤá áá˝ááᣠáá á ááŁá áľáŤá ááá áłáá˘
áĽáá° á áŤáá ááłáŞáŤ áľááá°áá á (áá á á ááááŞáŤ á°á¨á ááŁá áŤá°áááá), á á á ááľá áá. áľááá á°á¨á᪠áážá˝á ááááľ á¨áááᣠTLB áááá áŤááłáá˝á áá¨áá¸áľ á áá˝ááᣠáá á ááŽááŤáá á áŁá áááá áĽáá˛áá áŤá°ááááá˘
ááá áážá˝ áááłá áááŁá
áľááá á¨TLB á¨áá á á áá áĽááłáááľ áá áĽááľáá? (ááŽááŤá á ááá á°ááłáłá áá á áŤáá áá á°á¨ áľááľáł áŤáľááááá áĽáá áĽááááłáá).
Hugepages á¨áááŁá áĽáá ááᢠ4096 áŁááľ á ááľ TLB ááá˘áŤ áĽáť á¨ááŤáľááááᣠá ááľ á¨TLB ááá˘áŤ á áá ááá 2 áááŁááľ ááŤááááľ áá˝ááᢠTLB 512 áá¤áśá˝ áĽááłááľ áĽááľáĽáŁ áĽáá áŤá Hugepages ááááłá°á áĽáá˝ááááĄ
4096 bâ
512=2 MB
á¨á፠áĽáá´áľ á¨ááą áá áááłá°á áĽáá˝ááááĄ-
2 MBâ
512=1 GB
ááá áá Hugepages ááŠá á¨áááᢠáĽá áĽá¨áľ áłáŤá°áá áááłáááľá ááťáťá áá˝áá. áá áĽáá ááá ááľá ááááŤáá˝ á áá˘
ááá ááá˝ ááááá
áŽááá áĽáŤááłááą á¨áá
á°á¨ áľááľáł áá˝ áá áŤá
á áá áĽá
á áá áĽáá°ááá á áŤáľ-á°á áááŁá áŤáᢠá á á áŤáá áá
á°á¨ áľááľáł (áŤá) á¨áá, á¨ááá á áŁá á áľááá ááá ááá˝ á ááłááľ áŤá áááľááá
á áľááá áŤááá (áĽá áá áĽá
á áá á¨áááá) áážá˝á áá° áááľ á˛áľá ááááłááłá.
á ááá
á°á¨á, á Hugepages á°ááłáłá áá. ááá áá á¨ááá á¨á°áá á áŁááľ áłááá áá áážá˝á áĽáť áá ááá¨á á¨áá˝ááá˘
áĽáá°áá á áááľ ááŽááŤá á áá áĽáá ááĄ-
char* mymemory = malloc(2*1024*1024); // ĐОСŃПоП ŃŃĐž Са ĐžĐ´Đ˝Ń Hugepage!
// ĐапОНниП mymemory какиПи-НийО даннŃПи
// ХдоНаоП ПнОгО Đ´ŃŃгиŃ
воŃоК,
// кОŃĐžŃŃĐľ ĐżŃиводŃŃ Đş пОдПоно ŃŃŃаниŃŃ mymemory
// ...
// ĐĐ°ĐżŃĐžŃиП Đ´ĐžŃŃŃĐż ŃОНŃкО Đş поŃĐ˛ĐžĐźŃ ĐąĐ°ĐšŃŃ
putchar(mymemory[0]);
á áá á ááŁá á¨ááá á ááľ áŁááľ áĽáá˛áŤáᥠá¨áááľ áľáŤáá/SSD áĽáľá¨ 2 áááŁááľ áá¨á áá°áŤáľ (ááá áĽ) áŤáľáááááᢠáĽáá° áá°á á ááá˝áŁ á¨áááľ áľáŤáá/á¤áľá¤áľá˛ áááá ἠ4096 áŁááľ áĽáť áŤáľááááá˘
áľááá ᣠááá áá˝ á¨á°áťá¨áŁ áááá áá˝ ááľá¨áľ á¨ááá áááá ἠááŁá ááááᢠáá áááľ á¨á°ááŤáŠ á¨áá á°á¨ áľááľáł áááá˝á á áááá° áááľá¨áľ áĽá¨áá¨áŠ áĽá áááľ áŞááŁááľ áĽáť áĽáŤáá ᥠá¨áá áá°á á ááá˝á áá áá áĽá áľá áá ááá áá¨áá á ááĽááľ.
á áá á áŠáᣠáĽá á¨áá á°á¨ áľááľáł áááá˝á á á á°á á°á¨á°á ááááľ á¨ááá ááá ááá˝ á ááťá¸ááá áŤáťá˝ááᢠááá ááᣠáĽáŤáľá ááá¨á á ááĽááľ (á á áĽáľáľáŤááľ áśááľáá áłááá) áĽá áá á ááĽááľ áĽáá°áá°áŤ áááá¨áąá˘
á áá á°á¨ áľááľáł ááľáĽ áá°áŁ
C á¨áťáᣠá áááá° áľáá˝ (ááá á áááá° áľáá
) á¨áá
á°á¨ áľááľáł áá áá á áá áá á¨ááá áá á¨á
áĽáá°áá˝á áŤáááᢠmalloc()
. 30 áŁááľ á¨ááľáłááľ á˝ááł áŤáľáááááłá áĽáá ááĄ-
char* mymemory = malloc(30);
áá ááľ ááŽááŤá á ááŞáŁ á¨áŚááŹá˛áá á˛áľá°á 30 áŁááľ áá
á°á¨ áľááľáłá "áĽá¨á á¨á" áĽá á ááá áá° á ááłááľ áááŁá áá
á°á¨ áľááľáł áĽá¨áááą áŤá áááľá áá˝ááᢠáá á áĽáááą malloc ()
á¨á°ááŁáŠ ááľáĽ á¨áá ፠C á°ááŁá áĽáť ááá˘
ááá ááĽáŤááłááą áá°áŁ áĽá áĽá á°á¨á᪠áá
á°á¨ áľááľáłá áá á¨á
áá¤áłá á áá°áá; ááááŁáľ á ááłááľ á¨áá
á°á¨ áľááľáł ááá ááľááá á¨á°ááł ááá áá˝ááᢠ(free())
, áĽá áĽáá°áá ááá ááá áľ áĽáá˝ááá. malloc()
á¨á°ááł áá
á°á¨ áľááľáłá áĽáá°áá ááá áá á áŁá ááľáĽáľáĽ áľáá° áááŽá˝á á°ááŁáŤá áŤá°áááá˘
á á°ááłáłá áá, ááá ááá ááĽááľá áłááľá°áá áá¨á°áłá, áľááá
ááá áŤáľá¨ááááłá? áá áá°áá áľááá free()
áááľ á áá°ááá˘
á¨ááľáłááľ áááŤá¨áĽ á¨áá°á ááá á á. á áŁá á á¨á áááł ááľáĽáŁ áĽááľ áŁááľ áĽáť áĽá
á áá á¨ááá ááá áááá˝ á áᣠá ááŤá¨áá¸á áŤáá ááá áá á°áá
ááᢠ(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ᥠááá ááá˝ ááá á°á¨ áľááľáł áá¨ááá á¨á°ááᥠáá¸áᢠáľá áááŁá áá á°á¨ áľááľáł á áľá°áłá°á á¨ááááŽáśááľ ááŁáĽá
áĽáŤá á áá ? á á áľá°áŤá¨áśáš ááľáĽ ááá!
ááá: hab.com