ʻO nā pono a me nā pōʻino o HugePages

ʻO nā pono a me nā pōʻino o HugePages

Ka unuhi ʻana o ka ʻatikala i hoʻomākaukau ʻia no nā haumāna papa "Ka Luna Hoʻokele Linux".

Ma mua, ua kamaʻilio wau e pili ana i ka hoʻāʻo ʻana a hiki iā Hugepages ma Linux.
E hoʻohana wale ʻia kēia ʻatikala inā loaʻa iā ʻoe kahi wahi e hoʻohana ai iā Hugepages. Ua hālāwai au i nā poʻe he nui i hoʻopunipuni ʻia e ka manaʻo e hoʻomaikaʻi maikaʻi ʻo Hugpageges i ka huahana. Eia nō naʻe, he kumuhana paʻakikī ka hugepaging a hiki ke hoʻohaʻahaʻa i ka hana inā hoʻohana hewa ʻia.

Mahele 1: E hōʻoia ana i hiki ke hoʻohana ʻia nā ʻaoʻao nui ma Linux (original maanei)

ʻO ka pilikia:
Pono ʻoe e nānā inā hiki iā HugePages i kāu ʻōnaehana.

pāʻoihana:
He mea maʻalahi:

cat /sys/kernel/mm/transparent_hugepage/enabled

E loaʻa iā ʻoe kahi mea e like me kēia:

always [madvise] never

E ʻike ʻoe i kahi papa inoa o nā koho i loaʻa (mau, madvise, aole loa), a e hoʻopaʻa ʻia ke koho hana i kēia manawa i loko o nā pale (ma ka paʻamau madvise).

madvise ʻo ia hoʻi transparent hugepages hiki ke hoʻohana wale ʻia no nā wahi hoʻomanaʻo e noi pono ana i nā ʻaoʻao nui madvise(2).

mau ʻo ia hoʻi transparent hugepages hiki mau no nā kaʻina hana a pau. Hoʻomaikaʻi maʻamau kēia i ka hana, akā inā loaʻa iā ʻoe kahi hihia hoʻohana kahi e pau ai nā kaʻina hana he liʻiliʻi o ka hoʻomanaʻo, a laila hiki ke piʻi nui 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 ka madvise. No ka 'ike hou aku, e leka uila palapala Linux kernels.

Pehea e hoʻololi ai i ka waiwai paʻamau

Kō koho 1: Hoololi pololei sysfs (ma hope o ka hoʻihoʻi hou ʻana 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/enabled

Kō koho 2: E hoʻololi i ka ʻōnaehana paʻamau ma ka hoʻopili hou ʻana i ka kernel me kahi hoʻonohonoho i hoʻololi ʻia (manaʻo wale ʻia kēia koho inā ʻoe e hoʻohana nei i kahi kernel maʻamau):

  • No ka hoʻonohonoho paʻamau, e hoʻohana:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • No ka hoʻonohonoho ʻana i ka madvise ma ke ʻano he paʻamau, e hoʻohana:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Māhele 2: Pono a me nā pōʻino o HugePages

E ho'āʻo mākou e wehewehe i nā pono, nā pōʻino a me nā pōʻino hiki ke hoʻohana iā Hugepage. Ma muli o ka paʻakikī o ka ʻatikala ʻenehana a paʻakikī ke hoʻomaopopo i ka poʻe i hoʻopunipuni i ka manaʻo he panacea ʻo Hugepages, e kaumaha wau i ka pololei no ka maʻalahi. Pono e hoʻomanaʻo i ka nui o nā kumuhana paʻakikī a no laila ua maʻalahi loa.

E ʻoluʻolu e kamaʻilio mākou e pili ana i nā ʻōnaehana 64-bit x86 e holo ana i Linux, a ke manaʻo nei au e kākoʻo ana ka ʻōnaehana i nā ʻaoʻao ākea ākea (no ka mea ʻaʻole ia he mea pōʻino ʻaʻole i kākau ʻia nā ʻaoʻao nui), e like me ka hihia ma nā Linux o kēia wā. kaiapuni.

E hoʻopili wau i ka wehewehe ʻenehana hou aʻe ma nā loulou ma lalo nei.

Hoʻomanaʻo Virtual

Inā he polokalamu C++ ʻoe, ʻike ʻoe he mau helu kikoʻī ko nā mea i hoʻomanaʻo ʻia (pointer values).

Eia naʻe, ʻaʻole e hōʻike pono kēia mau ʻōlelo i nā helu kino i ka hoʻomanaʻo (nā helu RAM). Hōʻike lākou i nā ʻōlelo ma ka hoʻomanaʻo virtual. Loaʻa i ke kaʻina hana kekahi module MMU kūikawā (memory management unit) e kōkua ana i ka kernel palapala i ka hoʻomanaʻo virtual i kahi wahi kino.

He nui nā pono o kēia ala, akā ʻo ka mea nui loa:

  • Hana (no nā kumu like ʻole);
  • Hoʻokaʻawale papahana, ʻo ia hoʻi, ʻaʻole hiki ke heluhelu ʻia kahi papahana mai ka hoʻomanaʻo ʻana o kekahi papahana ʻē aʻe.

He aha nā ʻaoʻao?

Hoʻokaʻawale ʻia ka hoʻomanaʻo virtual i nā ʻaoʻao. Ke kuhikuhi nei kēlā me kēia ʻaoʻao i kahi hoʻomanaʻo kino kikoʻī, hiki iā ia ke kuhikuhi i kahi wahi ma RAM, a i ʻole hiki ke kuhikuhi i kahi helu i hāʻawi ʻia i kahi mea kino, e like me ke kāleka wikiō.

ʻO ka hapa nui o nā ʻaoʻao āu e kamaʻilio ai me ka helu i ka RAM a i ʻole ke hoʻololi ʻia, ʻo ia ka mea e mālama ʻia ma kāu hard drive a i ʻole SSD. Mālama ka kernel i ka hoʻolālā kino o kēlā me kēia ʻaoʻao. Inā loaʻa kahi ʻaoʻao spoofed, hoʻopau ka kernel i ke kaula e hoʻāʻo nei e komo i ka hoʻomanaʻo, heluhelu i ka ʻaoʻao mai ka hard drive/SSD i RAM, a laila hoʻomau i ka hoʻokō ʻana i ke kaula.

He kahawai kahe kēia kaʻina hana, ʻo ia hoʻi, ʻaʻole pono e heluhelu pololei mai ka HDD/SSD. ʻO 4096 bytes ka nui o nā ʻaoʻao maʻamau. He 2 megabytes ka nui o nā ʻaoʻao nui.

Hoʻopaʻa hui unuhi (TLB)

Ke komo ka polokalamu i kahi ʻaoʻao o ka hoʻomanaʻo, pono ka CPU e ʻike i ka ʻaoʻao kino e heluhelu ai i ka ʻikepili mai (ʻo ia hoʻi, loaʻa kahi palapala helu helu virtual).

He ʻano ʻikepili ko ka kernel (papa ʻaoʻao) i loaʻa nā ʻike āpau e pili ana i nā ʻaoʻao i hoʻohana ʻia. Me ka hoʻohana ʻana i kēia ʻano ʻikepili, hiki iā ʻoe ke palapala i kahi helu virtual i kahi helu kino.

Eia nō naʻe, paʻakikī a lohi ka papa ʻaoʻao, no laila ʻaʻole hiki iā mākou ke hoʻokaʻawale i ka hoʻolālā ʻikepili holoʻokoʻa i kēlā me kēia manawa ke komo i ka hoʻomanaʻo.

ʻO ka mea pōmaikaʻi, loaʻa i kā mākou kaʻina hana kahi TLB e hūnā i ka palapala ʻāina ma waena o nā helu virtual a me ke kino. ʻO ia hoʻi, ʻoiai pono mākou e hoʻokaʻawale i ka papa ʻaoʻao ma ka hoʻāʻo ʻana mua, hiki ke hoʻohana ʻia nā ʻike āpau ma hope o ka ʻaoʻao ma ka TLB, e ʻae ai i ka hana wikiwiki.

No ka mea, ua hoʻokō ʻia ʻo ia ma ke ʻano he mea kino (e wikiwiki ana i ka mua), ua kaupalena ʻia kona hiki. No laila, inā makemake ʻoe e komo i nā ʻaoʻao hou aʻe, ʻaʻole hiki i ka TLB ke mālama i nā palapala palapala no lākou a pau, no laila e holo mālie kāu polokalamu.

Hele mai ʻo Hugpages e hoʻopakele

No laila he aha kā mākou e hana ai e pale aku i ka nui o TLB? (Manaʻo mākou e pono ana ka papahana i ka nui o ka hoʻomanaʻo).

ʻO kēia kahi e komo ai ʻo Hugepages. Ma kahi o 4096 bytes e koi ana i hoʻokahi komo TLB wale nō, hiki i hoʻokahi helu TLB ke kuhikuhi i ka 2 megabytes. E noʻonoʻo kākou he 512 kā TLB, ma ʻaneʻi me ka ʻole Hugepage hiki iā mākou ke hoʻohālikelike:

4096 b⋅512=2 MB

A laila pehea mākou e hoʻohālikelike ai me lākou:

2 MB⋅512=1 GB

ʻO kēia ke kumu he mea weliweli ʻo Hugepages. Hiki iā lākou ke hoʻomaikaʻi i ka huahana me ka hoʻoikaika ʻole. Akā, aia kekahi mau hōʻailona koʻikoʻi ma ʻaneʻi.

Hugepages spoofing

Mālama ka kernel i ka manawa e hoʻohana ʻia ai kēlā me kēia ʻaoʻao hoʻomanaʻo. Inā ʻaʻole lawa ka hoʻomanaʻo kino (RAM), e hoʻoneʻe ka kernel i nā ʻaoʻao liʻiliʻi (emi pinepine ʻia) i ka pā paʻakikī e hoʻokuʻu i kekahi RAM no nā ʻaoʻao koʻikoʻi.
Ma ke kumu, pili like ia me Hugepages. Eia naʻe, hiki i ka kernel ke hoʻololi wale i nā ʻaoʻao holoʻokoʻa, ʻaʻole nā ​​bytes pākahi.

E ʻōlelo kākou he polokalamu like 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) e like me 2 megabytes o ka ʻike mai ka hard drive/SSD no kāu heluhelu ʻana i hoʻokahi byte. No nā ʻaoʻao maʻamau, ʻo 4096 bytes wale nō e pono ke heluhelu ʻia mai ka hard drive/SSD.

No laila, inā hoʻopau ʻia ka ʻaoʻao nui, ʻoi aku ka wikiwiki o ka heluhelu inā pono ʻoe e komo i ka ʻaoʻao holoʻokoʻa. ʻO ia ke ʻano inā e hoʻāʻo ʻoe e komo i nā ʻāpana like ʻole o ka hoʻomanaʻo a ke heluhelu wale nei ʻoe i ʻelua kilobytes, pono ʻoe e hoʻohana i nā ʻaoʻao maʻamau a mai hopohopo 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 ʻano, e hoʻomaikaʻi nā ʻaoʻao nui i kāu hana. Eia naʻe, pono ʻoe e hoʻāʻo iā ʻoe iho (ʻaʻole me ka polokalamu abstract) a ʻike i ka mea e hana wikiwiki.

Hoʻokaʻawale i ka hoʻomanaʻo

Inā kākau ʻoe iā C, ʻike ʻoe hiki iā ʻoe ke noi i nā helu hoʻomanaʻo liʻiliʻi (a ʻaneʻane ʻaneʻane paha) mai ka puʻu me ka hoʻohana ʻana. malloc(). E ʻōlelo mākou he 30 bytes o ka hoʻomanaʻo:

char* mymemory = malloc(30);

No ka mea polokalamu polokalamu, ʻike paha ʻoe e "noi" 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ā ʻoiaʻiʻo malloc () He hana C wale nō ia e kāhea ana mai loko mai o ka hana brk a sbrk e noi a hoʻokuʻu paha i ka hoʻomanaʻo mai ka ʻōnaehana hana.

Eia naʻe, ʻaʻole pono ka noi ʻana i ka hoʻomanaʻo hou aʻe no kēlā me kēia hoʻokaʻawale; aia paha ua hoʻokuʻu ʻia kekahi māhele hoʻomanaʻo (free()), a hiki iā mākou ke hoʻohana hou. malloc() hoʻokomo i nā algorithms paʻakikī no ka hoʻohana hou ʻana i ka hoʻomanaʻo manuahi.

I ka manawa like, ʻike ʻole ʻia nā mea āpau iā ʻoe, no ke aha e hopohopo ai iā ʻoe? Akā, no ka pilikia free() ʻAʻole kēlā manaʻo pono e hoʻihoʻi koke ʻia ka hoʻomanaʻo i ka ʻōnaehana hana.

Aia kekahi mea e like me ka hoʻokaʻawale hoʻomanaʻo. I nā hihia koʻikoʻi, aia nā ʻāpana puʻu kahi i hoʻohana ʻia ai he mau bytes wale nō, ʻ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 papahana ke loaʻa ka hopena nui. I ka hapanui o nā hihia, ʻaʻole e hoʻokau nā papahana i ka ʻāpana hoʻomanaʻo koʻikoʻi, akā e makaʻala ʻoe inā he pilikia me ka ʻāpana i kekahi wahi o ka puʻu, hiki i nā ʻaoʻao nui ke hoʻonui i ke kūlana.

Hoʻohana koho i nā ʻaoʻao nui

Ma hope o ka heluhelu ʻana i ka ʻatikala, ua hoʻoholo ʻoe i nā ʻāpana o kāu papahana e pōmaikaʻi mai ka hoʻohana ʻana i nā ʻaoʻao nui a ʻaʻole hiki. No laila pono anei e hoʻohana ʻia nā ʻaoʻao nunui?

Laki hiki iā ʻoe ke hoʻohana madvise()e hiki ai i ka hugepaging wale nō no kēlā mau wahi hoʻomanaʻo kahi e pono ai.

ʻO ka mea mua, e nānā e holo ana nā ʻaoʻao nui ma ke ʻano madvise () me ka hoʻohana ʻana nā kuhikuhi ma ka hoomaka ana o ka atikala.

A laila, hoʻohana madvise()e haʻi pololei i ka kernel kahi e hoʻohana ai i nā palapala nui.

#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 hoʻomaopopo he ʻōlelo aʻo wale kēia ʻano i ka kernel pehea e hoʻokele ai i ka hoʻomanaʻo. ʻAʻole kēia manaʻo e hoʻohana maʻalahi ka kernel i nā palapala nui no kahi hoʻomanaʻo.

E nānā i nā palapala (manpage)madvisee aʻo hou e pili ana i ka hoʻokele hoʻomanaʻo a madvise(), loaʻa i kēia kumuhana ke ʻano koʻikoʻi o ke aʻo ʻana. No laila inā manaʻo ʻoe e lilo i mea maikaʻi loa, e hoʻomākaukau e heluhelu a hoʻāʻo no kekahi mau pule ma mua o kou manaʻo ʻana i nā hopena maikaʻi.

He aha ka mea e heluhelu ai?

He nīnau kāu? E kākau i nā manaʻo!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka