
Ka unuhi ʻana o ka ʻatikala i hoʻomākaukau ʻia no nā haumāna papa .
Ma mua ua kamaʻilio wau e pili ana i ke ʻano e nānā a hiki ai ke hoʻohana ʻia ʻo Hugepages i loko Linux.
E pono wale nō kēia ʻatikala inā loaʻa iā ʻoe kahi hihia hoʻohana no Hugepages. Ua hālāwai au me nā poʻe he nui i hoʻopunipuni ʻia e ka ʻōlelo hoʻohiki e hoʻonui kilokilo ʻo Hugepages i ka hana. Eia nō naʻe, he kumuhana paʻakikī ka hugepaging, a inā hoʻohana hewa ʻia, hiki iā ia ke hoʻohaʻahaʻa i ka hana.
Māhele 1: E hōʻoia ua hoʻā ʻia nā hugepages Linux (kumu mua )
ʻO ka pilikia:
Pono ʻoe e nānā inā ua hoʻā ʻia ʻo HugePages ma kāu ʻōnaehana.
pāʻoihana:
He mea maʻalahi loa ia:
cat /sys/kernel/mm/transparent_hugepage/enabledE loaʻa iā ʻoe kekahi mea penei:
always [madvise] neverE ʻike ʻoe i kahi papa inoa o nā koho i loaʻa (mau, pupule, ʻaʻole loa), ʻoiai e hoʻopili ʻia ke koho e hana nei i kēia manawa i loko o nā pale (ma ka paʻamau madvise).
madvise ʻo ia hoʻi transparent hugepages ua hoʻā ʻia no nā wahi hoʻomanaʻo wale nō e noi pololei ana i nā ʻaoʻao nui e hoʻohana ana .
mau ʻo ia hoʻi transparent hugepages Hoʻā ʻia i nā manawa a pau a no nā kaʻina hana āpau. Hoʻomaikaʻi pinepine kēia i ka hana, akā inā he hihia hoʻohana kāu kahi e hoʻopau ai nā kaʻina hana he nui i kahi liʻiliʻi o ka hoʻomanaʻo, hiki ke hoʻonui nui ʻia ka ukana hoʻomanaʻo holoʻokoʻa.
loa ʻo ia hoʻi transparent hugepages ʻaʻole e hoʻokomo ʻia ʻoiai ke noi ʻia me ka hoʻohana ʻana iā madvise. No ka ʻike hou aku, e ʻoluʻolu e nānā i nā cores Linux.
Pehea e hoʻololi ai i ka waiwai paʻamau
Kō koho 1Hoʻololi pololei sysfs (ma hope o ka reboot e hoʻi ka parameter i kona waiwai paʻamau):
echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabledKō koho 2: E hoʻololi i ka paʻamau o ka ʻōnaehana ma ka hoʻopili hou ʻana i ka kernel me ka hoʻonohonoho i hoʻololi ʻia (manaʻo ʻia kēia koho inā ʻoe e hoʻohana ana i kahi kernel maʻamau):
- No ka hoʻonohonoho mau ʻana ma ke ʻano he paʻamau, e hoʻohana i:
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y - No ka hoʻonohonoho ʻana iā madvise ma ke ʻano he paʻamau, e hoʻohana i:
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
Māhele 2: Nā Pōmaikaʻi a me nā Pōʻino o HugePages
E ho'āʻo mākou e wehewehe pono i nā pono, nā hemahema, a me nā pilikia kūpono o ka hoʻohana ʻana iā Hugepages. ʻOiai he mea paʻakikī ke hoʻomaopopo i kahi ʻatikala paʻakikī a me ka pedantic no ka poʻe i hoʻopunipuni ʻia i ka manaʻo he panacea ʻo Hugepages, e mōhai wau i ka pololei no ka maʻalahi. He mea kūpono ke hoʻomanaʻo he nui nā kumuhana he paʻakikī maoli a no laila ua hoʻomaʻalahi nui ʻia.
E ʻoluʻolu e hoʻomaopopo mākou e kamaʻilio nei mākou e pili ana i nā ʻōnaehana x86 64-bit e holo ana ma Linux, a ke kuhi wale nei au e kākoʻo ana ka ʻōnaehana i nā hugepages moakaka (ʻoiai ʻaʻole ia he hemahema ʻaʻole i pani ʻia nā hugepages), e like me ke ʻano ma aneane o nā ʻano hou. Linux.
E hoʻopili aku au i nā wehewehe loea hou aku ma nā loulou ma lalo nei.
Hoʻomanaʻo virtual
Inā he mea papahana C++ ʻoe, ʻike ʻoe he mau helu wahi kikoʻī ko nā mea i loko o ka hoʻomanaʻo (nā waiwai kuhikuhi).
Eia nō naʻe, ʻaʻole hōʻike pono kēia mau helu wahi i nā helu wahi hoʻomanaʻo kino (nā helu wahi RAM). Hōʻike lākou i nā helu wahi hoʻomanaʻo virtual. Loaʻa i ka mea hana kahi module kūikawā, ʻo ka MMU (memory management unit), e kōkua ana i ka kernel e hoʻopaʻa i ka hoʻomanaʻo virtual i nā wahi kino.
He nui nā pono o kēia ʻano hana, akā ʻo nā mea nui loa:
- Ka hana (no nā kumu like ʻole);
- Ka hoʻokaʻawale ʻana o ka polokalamu, ʻo ia hoʻi, ʻaʻole hiki i kekahi polokalamu ke heluhelu mai ka hoʻomanaʻo o kahi polokalamu ʻē aʻe.
He aha nā ʻaoʻao?
Ua māhele ʻia ka hoʻomanaʻo virtual i nā ʻaoʻao. Kuhikuhi kēlā me kēia ʻaoʻao i kahi wahi hoʻomanaʻo kino kikoʻī, hiki ke lilo i wahi ma RAM a i ʻole kahi helu wahi i hāʻawi ʻia i kahi hāmeʻa kino, e like me ke kāleka kiʻi.
ʻO ka hapa nui o nā ʻaoʻao āu e launa pū ai e kuhikuhi ana i ka RAM a i ʻole ua hoʻololi ʻia, ʻo ia hoʻi ua mālama ʻia lākou ma kahi ʻōnaehana paʻa a i ʻole SSD. Hoʻokele ka kernel i ka wahi kino o kēlā me kēia ʻaoʻao. Inā komo ʻia kahi ʻaoʻao i hoʻololi ʻia, hoʻōki ka kernel i ke kaula e hoʻāʻo nei e komo i ka hoʻomanaʻo, heluhelu i ka ʻaoʻao mai ka ʻōnaehana paʻa/SSD i loko o RAM, a laila hoʻomau i ka hoʻokō ʻana o ke kaula.
He moakāka kēia kaʻina hana e like me ke kaula, ʻo ia hoʻi, ʻaʻole pono e heluhelu pololei mai ka ʻōpae paʻa/SSD. ʻO ka nui o nā ʻaoʻao maʻamau he 4096 bytes. ʻO ka nui o nā ʻaoʻao nui he 2 megabytes.
Huli Huli Mahele Kūʻai (TLB)
Ke komo kahi polokalamu i kahi ʻaoʻao hoʻomanaʻo, pono ka CPU e ʻike i ka ʻaoʻao kino e heluhelu ai i ka ʻikepili mai (ʻo ia hoʻi, pono iā ia kahi palapala ʻāina helu wahi virtual).
Loaʻa i ka kernel kahi ʻano ʻikepili (ka papa ʻaoʻao) nona nā ʻike āpau e pili ana i nā ʻaoʻao i hoʻohana ʻia. ʻAe kēia ʻano ʻikepili i ka hoʻohālikelike ʻana i kahi helu wahi virtual i kahi helu wahi kino.
Eia nō naʻe, he paʻakikī a lohi hoʻi ka papa ʻaoʻao, no laila ʻaʻole hiki iā mākou ke kālailai i ka ʻōnaehana ʻikepili holoʻokoʻa i kēlā me kēia manawa ke komo ai kahi kaʻina hana i ka hoʻomanaʻo.
ʻO ka mea pōmaikaʻi, loaʻa i kā mākou mea hana kahi TLB, kahi e mālama ai i ka hoʻohālikelike ʻana ma waena o nā helu wahi virtual a me ke kino. ʻO ke ʻano kēia, ʻoiai pono mākou e kālailai i ka papa ʻaoʻao no ka hoʻāʻo komo mua, hiki ke hana ʻia nā komo ʻaoʻao āpau ma hope ma ka TLB, e hōʻoiaʻiʻo ana i ka hana wikiwiki.
Ma muli o ka hoʻokō ʻia ʻana ma ke ʻano he mea hana kino (ʻo ia ka mea e wikiwiki ai i ka wā mua), ua kaupalena ʻia kona hiki. No laila, inā makemake ʻoe e komo i nā ʻaoʻao hou aku, ʻaʻole hiki i ka TLB ke mālama i nā palapala ʻāina no lākou āpau, e holo mālie ai kāu polokalamu.
Hoʻopakele mai ʻo Hugepages
No laila he aha kā mākou e hana ai e pale aku i ke kahe ʻana o TLB? (Manaʻo mākou e pono mau ana ka papahana i ka nui o ka hoʻomanaʻo.)
ʻO kēia kahi e komo mai ai ʻo Hugepages. Ma kahi o 4096 bytes e koi ana i hoʻokahi wale nō komo TLB, hiki i kahi komo TLB hoʻokahi ke kuhikuhi i kahi 2 megabytes nui. Ke manaʻo nei he TLB me 512 mau komo, me ka ʻole o Hugepages, hiki iā mākou ke palapala ʻāina:
4096 b⋅512=2 MBA laila pehea lā e hiki ai iā kākou ke hoʻohālikelike iā lākou me:
2 MB⋅512=1 GBʻO ia ke kumu he mea maikaʻi loa nā Hugepages. Hiki iā lākou ke hoʻonui i ka huahana me ka ʻole o ka hoʻoikaika nui. Akā aia kekahi mau ʻōlelo aʻoaʻo koʻikoʻi.
Hoʻololi ʻana o nā ʻaoʻao nui
Nānā ponoʻī ka kernel i ka pinepine o ka hoʻohana ʻia ʻana o kēlā me kēia ʻaoʻao hoʻomanaʻo. Inā lawa ʻole ka hoʻomanaʻo kino (RAM), e hoʻoneʻe ka kernel i nā ʻaoʻao koʻikoʻi ʻole (hoʻohana pinepine ʻole ʻia) i ka pā paʻa e hoʻokuʻu i kekahi RAM no nā ʻaoʻao koʻikoʻi.
Ma ke kumumanaʻo, pili like kēia iā Hugepages. Eia nō naʻe, hiki i ka kernel ke hoʻololi i nā ʻaoʻao holoʻokoʻa wale nō, ʻaʻole nā bytes pākahi.
E noʻonoʻo kākou he polokalamu kā mākou e like me kēia:
char* mymemory = malloc(2*1024*1024); // Возьмем это за одну Hugepage!
// Заполним mymemory какими-либо данными
// Сделаем много других вещей,
// которые приведут к подмене страницы mymemory
// ...
// Запросим доступ только к первому байту
putchar(mymemory[0]); I kēia hihia, pono ka kernel e hoʻololi (heluhelu) i kahi 2 megabytes piha o ka ʻike mai ka ʻōpae paʻakikī/SSD no ʻoe e heluhelu ai i hoʻokahi byte. No nā ʻaoʻao maʻamau, 4096 bytes wale nō e pono e heluhelu ʻia mai ka ʻōpae paʻakikī/SSD.
No laila, inā ua hoʻololi ʻia ka hugepage, ʻoi aku ka wikiwiki o ka heluhelu ʻana inā pono ʻoe e komo i ka ʻaoʻao holoʻokoʻa. ʻO ke ʻano kēia inā ʻoe e komo wale ana i nā ʻāpana like ʻole o ka hoʻomanaʻo a heluhelu wale i kekahi mau kilobytes, pono ʻoe e hoʻohana i nā ʻaoʻao maʻamau a mai hopohopo e pili ana i kekahi mea ʻē aʻe.
Ma ka ʻaoʻao ʻē aʻe, inā pono ʻoe e komo i kahi hapa nui o ka hoʻomanaʻo ma ke kaʻina hana, e hoʻomaikaʻi ʻo hugepages i kāu hana. Eia nō naʻe, pono ʻoe e hoʻāʻo i kēia iā ʻoe iho (ʻaʻole me ka polokalamu abstract) a ʻike i ka mea e hana wikiwiki ana.
Ka hoʻokaʻawale ʻana i ka hoʻomanaʻo
Inā ʻoe e kākau iā C, ʻike ʻoe hiki iā ʻoe ke noi i nā nui liʻiliʻi (a kokoke paha i ka nui) o ka hoʻomanaʻo mai ka puʻu me ka hoʻohana ʻana malloc()E ʻōlelo kākou e pono ʻoe i 30 bytes o ka hoʻomanaʻo:
char* mymemory = malloc(30);I ka mea papahana, me he mea lā e "noi" ana ʻoe i 30 bytes o ka hoʻomanaʻo mai ka ʻōnaehana hana a hoʻihoʻi i kahi kuhikuhi i kekahi hoʻomanaʻo virtual. Akā i ka ʻoiaʻiʻo, malloc () — he hana C wale nō ia e kāhea ana i nā hana mai loko mai e noi a hoʻokuʻu paha i ka hoʻomanaʻo mai ka ʻōnaehana hana.
Eia nō naʻe, ʻaʻole pono ka noi ʻana i nā hoʻomanaʻo hou aʻe no kēlā me kēia hoʻokaʻawale ʻana; ʻo ka mea paha, ua hoʻokuʻu mua ʻia kekahi ʻāpana hoʻomanaʻo. (free()), a hiki iā mākou ke hoʻohana hou. malloc() hoʻokō i nā algorithms paʻakikī no ka hoʻohana hou ʻana i ka hoʻomanaʻo i hoʻokuʻu ʻia.
Akā naʻe, no ʻoe, hana ʻia nā mea a pau me ka ʻike ʻole ʻia, no laila no ke aha e hoʻopilikia ai iā ʻoe? No ka mea, ʻo ka pilikia free() ʻaʻole ia manaʻo .
Aia kekahi manaʻo i kapa ʻia ʻo ka fragmentation memory. I nā hihia koʻikoʻi, aia nā ʻāpana puʻu kahi i hoʻohana wale ʻia ai kekahi mau bytes, ʻoiai ua hoʻokuʻu ʻia nā mea āpau ma waena. (free()).
E ʻoluʻolu e hoʻomaopopo he kumuhana paʻakikī loa ka ʻāpana hoʻomanaʻo, a hiki i nā hoʻololi liʻiliʻi i kahi polokalamu ke hoʻopilikia nui iā ia. I ka hapanui o nā hihia, ʻaʻole nā polokalamu e hoʻoulu i ka ʻāpana hoʻomanaʻo koʻikoʻi, akā pono ʻoe e hoʻomaopopo inā he pilikia ka ʻāpana ma kahi kikoʻī o ka puʻu, hiki i nā ʻaoʻao nui ke hoʻonui wale i ka pilikia.
Hoʻohana koho ʻia o nā ʻaoʻao nui
Ma hope o ka heluhelu ʻana i kēia ʻatikala, ua hoʻoholo ʻoe i nā ʻāpana o kāu polokalamu e hiki ke pōmaikaʻi mai nā hugepages a ʻo wai ka mea hiki ʻole. No laila, pono anei ʻoe e hoʻā i nā hugepages?
ʻO ka mea pōmaikaʻi, hiki iā ʻoe ke hoʻohana madvise()e hiki ai i ka hugepaging no kēlā mau wahi hoʻomanaʻo kahi e pono ai.
ʻO ka mea mua, e nānā i ka holo ʻana o nā hugepages ma ke ʻano madvise() me ka hoʻohana ʻana i ka hoʻomaka ʻana o ka ʻatikala.
A laila, hoʻohana madvise()e haʻi pololei i ka kernel i kahi e hoʻohana ai i nā hugepages.
#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)E ʻoluʻolu e hoʻomaopopo he ʻōlelo aʻoaʻo hoʻokele hoʻomanaʻo wale nō kēia ʻano hana i ka kernel. ʻAʻole ia manaʻo e hoʻohana koke ka kernel i nā hugepages no ka hoʻomanaʻo i hāʻawi ʻia.
E ʻoluʻolu e nānā i nā palapala e aʻo hou aʻe e pili ana i ka hoʻokele hoʻomanaʻo a me madvise()He piʻi koʻikoʻi ke aʻo ʻana i kēia kumuhana. No laila, inā makemake ʻoe e hoʻomaopopo pono iā ia, e hoʻomākaukau e heluhelu a hoʻāʻo no kekahi mau pule ma mua o ka manaʻo ʻana i nā hopena maikaʻi.
He aha e heluhelu ai?
He nīnau kāu? Waiho i kahi manaʻo!
Source: www.habr.com
