Uru na ọghọm dị na nnukwu peeji

Uru na ọghọm dị na nnukwu peeji

Ntụgharị asụsụ nke akụkọ a kwadebere maka ụmụ akwụkwọ nkuzi "Onye nchịkwa Linux".

Na mbụ, ekwuru m otu esi anwale ma mee ka Hugepages na Linux.
Edemede a ga-aba uru naanị ma ọ bụrụ na ị nwere ebe ị ga-eji Hugepages. Ahụla m ọtụtụ mmadụ ndị atụmanya na Hugepages ga-emeziwanye arụpụta ọrụ nke ọma. Agbanyeghị, bigpaging bụ isiokwu dị mgbagwoju anya ma nwee ike weda arụmọrụ ma ọ bụrụ na ejiri ya ezighi ezi.

Nkebi nke 1: Ịkwado na a na-enyere nnukwu ibe na Linux aka (nke mbụ ebe a)

Nsogbu:
Ịkwesịrị ịlele ma agbanyere HugePages na sistemụ gị.

ngwọta:
Ọ dị mfe:

cat /sys/kernel/mm/transparent_hugepage/enabled

Ị ga-enweta ihe dị ka nke a:

always [madvise] never

Ị ga-ahụ ndepụta nhọrọ dị (mgbe niile, ara ara, ọ dịghị mgbe), na nhọrọ na-arụ ọrụ ugbu a ka a ga-ejikọta na mbikọ (site na ndabara ara ara).

ara ara pụtara na transparent hugepages enyere naanị maka ebe nchekwa nke na-arịọ nnukwu peeji nke ọma na-eji ara (2).

mgbe niile pụtara na transparent hugepages na-enyere aka mgbe niile maka usoro niile. Nke a na-emekarị ka arụmọrụ dịkwuo mma, ma ọ bụrụ na ị nwere ihe eji eme ihe ebe ọtụtụ usoro na-eri obere ebe nchekwa, mgbe ahụ, ibu ebe nchekwa n'ozuzu nwere ike ịbawanye nke ukwuu.

mgbe pụtara na transparent hugepages agaghị etinye ọbụna mgbe achọrọ ya site na iji madvise. Iji chọpụtakwuo, kpọtụrụ akwụkwọ Linux kernel.

Otu esi agbanwe uru ndabara

Nhọrọ 1: gbanwee ozugbo sysfs (mgbe ịmalitegharịa paramita ahụ ga-alaghachi na uru ndabere ya):

echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabled

Nhọrọ 2: Gbanwee ndabara sistemu site na iji nhazi gbanwegharịrị chịkọta kernel (a na-akwado nhọrọ a ma ọ bụrụ na ị na-eji kernel omenala):

  • Ka ịtọọ mgbe niile na ndabara, jiri:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Ka ịtọọ madvise dị ka ndabara, jiri:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Nkebi 2: Uru na ọghọm dị na nnukwu peeji

Anyị ga-anwa ịhọrọ ịkọwapụta uru, ọghọm na ọnyà enwere ike iji Hugepages. Ebe ọ bụ na isiokwu siri ike na nkà na ụzụ na nke pedantic ga-esiri ike ịghọta maka ndị mmadụ na-eche na Hugepages bụ ihe ngwọta, m ga-achụ ihe ziri ezi maka ịdị mfe. Ọ dị mma iburu n'uche na ọtụtụ n'ime isiokwu ndị ahụ dị mgbagwoju anya n'ezie, yabụ na-adị mfe nke ukwuu.

Biko mara na anyị na-ekwu maka sistemụ 64-bit x86 na-agba ọsọ Linux, yana na m na-eche na sistemụ ahụ na-akwado nnukwu ibe akwụkwọ (ebe ọ bụ na ọ bụghị ihe ọjọọ na nnukwu peeji anaghị edegharị), dị ka ọ dị n'ihe fọrọ nke nta ka ọ bụrụ Linux ọgbara ọhụrụ ọ bụla. gburugburu ebe obibi.

M ga-etinyekwu nkọwa teknụzụ na njikọ dị n'okpuru.

Ebe nchekwa mebere

Ọ bụrụ na ị bụ onye mmemme C ++, ị maara na ihe dị na ebe nchekwa nwere adreesị akọwapụtara (ụkpụrụ pointer).

Agbanyeghị, adreesị ndị a apụtaghị na adreesị anụ ahụ na ebe nchekwa (adreesị RAM). Ha na-anọchite anya adreesị na ebe nchekwa mebere. Ihe nhazi ahụ nwere modul MMU pụrụ iche (nchịkwa nchekwa ebe nchekwa) nke na-enyere kernel maapụ ebe nchekwa mebere anya ka ọ bụrụ ọnọdụ anụ ahụ.

Usoro a nwere ọtụtụ uru, mana nke kachasị mkpa bụ:

  • Ịrụ ọrụ (n'ihi ihe dị iche iche);
  • Mwepụ nke mmemme, ya bụ, ọ dịghị mmemme nwere ike ịgụ site na ebe nchekwa nke mmemme ọzọ.

Kedu ihe bụ ibe?

E kewara ebe nchekwa mebere na ibe. Ibe nke ọ bụla na-atụ aka n'otu ebe nchekwa anụ ahụ, ọ nwere ike ịtụ aka na mpaghara RAM, ma ọ bụ ọ nwere ike ịtụ aka na adreesị e kenyere ngwaọrụ anụ ahụ, dị ka kaadị vidiyo.

Ọtụtụ n'ime ibe ndị ị na-arụkọ ọrụ na-atụ aka na RAM ma ọ bụ na-agbanwe agbanwe, nke pụtara na echekwara ha na draịvụ ike gị ma ọ bụ SSD. kernel na-ejikwa nhazi anụ ahụ nke ibe ọ bụla. Ọ bụrụ na ịnweta ibe spoofed, kernel na-akwụsị eri nke na-agbalị ịnweta ebe nchekwa, gụọ ibe ahụ site na draịvụ ike/SSD n'ime RAM, wee gaa n'ihu na-eme eri ahụ.

Usoro a na-apụta ìhè, nke pụtara na ọ bụchaghị na-agụ ya ozugbo na HDD/SSD. Nha nke ibe nkịtị bụ 4096 bytes. Nnukwu peeji nke bụ 2 megabyte.

Ihe nchekwa ntụgharị-akpakọrịta (TLB)

Mgbe mmemme nwetara ibe ebe nchekwa, CPU ga-amarịrị ibe anụ ahụ ọ ga-agụ data na (ya bụ, nwee maapụ adreesị mebere).

kernel nwere nhazi data (tebụlụ ibe) nke nwere ozi niile gbasara ibe a na-eji. N'iji nhazi data a, ị nwere ike mapụta adreesị mebere na adreesị anụ ahụ.

Agbanyeghị, tebụl ibe ahụ dị mgbagwoju anya yana nwayọ, yabụ na anyị enweghị ike inyocha usoro data niile oge ọ bụla usoro na-enweta ebe nchekwa.

Ọ dabara nke ọma, onye nrụpụta anyị nwere TLB nke na-echekwa eserese n'etiti adreesị mebere na nke anụ ahụ. Nke a pụtara na n'agbanyeghị na anyị kwesịrị ịkpachapụta tebụl ibe na mbọ ịnweta mbụ, ohere niile na-esote na ibe ahụ nwere ike ijikwa na TLB, na-enye ohere maka ịrụ ọrụ ngwa ngwa.

N'ihi na etinyere ya dị ka ngwaọrụ anụ ahụ (nke na-eme ka ọ bụrụ ngwa ngwa na mbụ), ikike ya nwere oke. Yabụ ọ bụrụ na ịchọrọ ịnweta ibe ndị ọzọ, TLB agaghị enwe ike ịchekwa mappings maka ha niile, na-eme ka mmemme gị na-eji nwayọ nwayọ.

Nnukwu peeji na-abịa napụta

Yabụ kedu ihe anyị nwere ike ime iji zere oke oke TLB? (Anyị chere na mmemme ahụ ka chọrọ otu ebe nchekwa).

Nke a bụ ebe Hugepages na-abata. Kama 4096 bytes chọrọ naanị otu ntinye TLB, otu ntinye TLB nwere ike na-arụtụ aka na megabyte 2 dị ukwuu. Ka anyị chee na TLB nwere ndenye 512, ebe a na-enweghị Hugepages anyị nwere ike dakọtara:

4096 b⋅512=2 MB

Yabụ kedu ka anyị ga-esi atụnyere ha:

2 MB⋅512=1 GB

Ọ bụ ya mere Hugepages ji dị egwu. Ha nwere ike imeziwanye nrụpụta na-enweghị nnukwu mbọ. Ma e nwere nnukwu caveats ebe a.

Nnukwu peeji spoofing

kernel na-enyocha ozugbo ugboro ole ejiri ibe ebe nchekwa ọ bụla. Ọ bụrụ na ezughị ebe nchekwa anụ ahụ (RAM), kernel ga-ebugharị ibe ndị na-adịchaghị mkpa (nke a na-ejikarịghị ejikarị) gaa na diski ike iji hapụ ụfọdụ RAM maka ibe ndị ka mkpa.
Na ụkpụrụ, otu ihe ahụ metụtara Hugepages. Agbanyeghị, kernel nwere ike gbanwee ibe niile, ọ bụghị bytes n'otu n'otu.

Ka anyị kwuo na anyị nwere mmemme dịka nke a:

char* mymemory = malloc(2*1024*1024); // Возьмем это за одну Hugepage!
// Заполним mymemory какими-либо данными
// Сделаем много других вещей,
// которые приведут к подмене страницы mymemory
// ...
// Запросим доступ только к первому байту
putchar(mymemory[0]); 

N'okwu a, kernel ga-adị mkpa iji dochie (gụọ) ihe ruru 2 megabyte ozi sitere na draịvụ ike/SSD naanị ka ị gụọ otu byte. N'ihe gbasara ibe ọ bụla, naanị 4096 bytes ka a ga-agụ site na draịvụ ike/SSD.

Ya mere, ọ bụrụ na nnukwu ibe emebiela, ọ na-adị ngwa ngwa ịgụ ma ọ bụrụ na ịchọrọ ịnweta ibe ahụ dum. Nke a pụtara na ọ bụrụ na ị na-agbalị ịnweta akụkụ dị iche iche nke ebe nchekwa na-enweghị usoro ma na-agụ naanị kilobytes ole na ole, ị kwesịrị iji ibe mgbe niile ma ghara ichegbu onwe gị maka ihe ọ bụla ọzọ.

N'aka nke ọzọ, ọ bụrụ na ịchọrọ ịnweta nnukwu akụkụ nke ebe nchekwa n'usoro, nnukwu ibe ga-eme ka arụmọrụ gị dịkwuo mma. Agbanyeghị, ịkwesịrị ịnwale ya n'onwe gị (ọ bụghị na ngwanrọ nkịtị) wee hụ ihe na-arụ ọrụ ngwa ngwa.

Oke na ebe nchekwa

Ọ bụrụ na ị dee C, ị maara na ị nwere ike ịrịọ ebe nchekwa dị ntakịrị (ma ọ bụ ihe fọrọ nke nta ka ọ bụrụ nnukwu aka ike) site na ikpo ọkụ. malloc(). Ka anyị kwuo na ịchọrọ 30 bytes nke ebe nchekwa:

char* mymemory = malloc(30);

Nye onye mmemme, ọ nwere ike ị dị ka ị na-arịọ” 30 bytes nke ebe nchekwa site na sistemụ arụmọrụ ma na-eweghachite ntụaka na ebe nchekwa mebere ụfọdụ. Ma n'ezie malloc () bụ naanị ọrụ C nke na-akpọ n'ime ọrụ ahụ brk na sbrk ịrịọ ma ọ bụ ebe nchekwa efu site na sistemụ arụmọrụ.

Otú ọ dị, ịrịọ ka ọ dịkwuo ebe nchekwa maka oke nke ọ bụla adịghị arụ ọrụ; o yikarịrị ka ahapụlarị ụfọdụ akụkụ ebe nchekwa (free()), anyị nwekwara ike iji ya mee ihe ọzọ. malloc() na-arụ ọrụ algọridim dị mgbagwoju anya maka ijikwa ebe nchekwa nwere onwe ya.

N'otu oge ahụ, ihe niile na-eme gị n'amaghị ama, gịnị kpatara ọ ga-eji na-echegbu gị? Ma n'ihi na ihe ịma aka free() apụtaghị na a na-eweghachite ebe nchekwa ozugbo na sistemụ arụmọrụ.

Enwere ihe dị ka mgbawa ebe nchekwa. N'okwu ndị dị oke njọ, enwere akụkụ ikpo okwu ebe a na-eji naanị bytes ole na ole, ebe ihe niile dị n'etiti ahapụla ya. (free()).

Biko mara na nkewa ebe nchekwa bụ isiokwu dị mgbagwoju anya na-enweghị atụ, na ọbụna obere mgbanwe na mmemme nwere ike inwe mmetụta dị ukwuu. N'ọtụtụ ọnọdụ, mmemme agaghị eme ka mgbawa ebe nchekwa dị ịrịba ama, mana ị kwesịrị ịma na ọ bụrụ na enwere nsogbu na nkewa na mpaghara ụfọdụ nke ikpo, nnukwu ibe nwere ike ime ka ọnọdụ ahụ ka njọ.

Nhọrọ nke nnukwu ibe

Mgbe ị gụchara isiokwu a, ị chọpụtala akụkụ nke mmemme gị nwere ike irite uru site na iji nnukwu peeji na nke enweghị ike. Ya mere, a ga-eme ka nnukwu peeji nke ọ bụla nwee ike?

Luckily ị nwere ike iji madvise()iji mee ka hugepaging naanị maka ebe nchekwa ebe ọ ga-aba uru.

Nke mbụ, lelee na bigpages na-eji ọnọdụ madvise() arụ ọrụ ntụziaka na mmalite nke isiokwu.

Mgbe ahụ, jiri madvise()ịgwa kernel kpọmkwem ebe a ga-eji bigpages.

#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)

Rịba ama na usoro a bụ naanị ndụmọdụ kernel maka otu esi ejikwa ebe nchekwa. Nke a apụtaghị na kernel ga-eji nnukwu ibe na-akpaghị aka maka ebe nchekwa enyere.

Rụtụ aka na akwụkwọ (manpage) Madviseịmụtakwu banyere njikwa ebe nchekwa na madvise(), isiokwu a nwere usoro mmụta dị oke egwu. Ya mere, ọ bụrụ na i bu n'obi ime ya nke ọma, jikere ịgụ na nwalee izu ole na ole tupu ị tụọ anya nsonaazụ ọ bụla dị mma.

Kedu ihe ị ga-agụ?

Nwere ajụjụ? Dee na nkọwa!

isi: www.habr.com

Tinye a comment