Faida na Hasara za HugePages

Faida na Hasara za HugePages

Tafsiri ya makala iliyotayarishwa kwa wanafunzi wa kozi "Msimamizi wa Linux".

Hapo awali, nilizungumza juu ya jinsi ya kujaribu na kuwezesha Hugepages kwenye Linux.
Nakala hii itakuwa muhimu tu ikiwa una mahali pa kutumia Hugepages. Nimekutana na watu wengi ambao wamedanganywa na matarajio kwamba Hugepages itaboresha tija kichawi. Walakini, kurasa kubwa ni mada changamano na inaweza kudhalilisha utendakazi ikitumiwa vibaya.

Sehemu ya 1: Kuthibitisha kwamba kurasa kubwa zimewashwa kwenye Linux (asili hapa)

Tatizo:
Unahitaji kuangalia ikiwa HugePages imewezeshwa kwenye mfumo wako.

ufumbuzi:
Ni rahisi sana:

cat /sys/kernel/mm/transparent_hugepage/enabled

Utapata kitu kama hiki:

always [madvise] never

Utaona orodha ya chaguzi zinazopatikana (daima, madvise, kamwe), na chaguo linalotumika sasa litaambatanishwa kwenye mabano (kwa chaguo-msingi madvise).

madvise maana yake transparent hugepages imewashwa tu kwa maeneo ya kumbukumbu ambayo yanaomba kurasa kubwa kwa kutumia mshauri(2).

daima maana yake transparent hugepages imewashwa kila wakati kwa michakato yote. Kawaida hii inaboresha utendaji, lakini ikiwa una kesi ya matumizi ambapo michakato mingi hutumia kiasi kidogo cha kumbukumbu, basi mzigo wa kumbukumbu wa jumla unaweza kuongezeka kwa kasi.

kamwe maana yake transparent hugepages haitajumuishwa hata ikiombwa kwa kutumia madvise. Ili kujua zaidi, wasiliana nyaraka Kernels za Linux.

Jinsi ya kubadilisha thamani ya chaguo-msingi

Chaguo 1: Badilisha moja kwa moja sysfs (baada ya kuwasha tena parameta itarudi kwa dhamana yake ya msingi):

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

Chaguo 2: Badilisha chaguo-msingi la mfumo kwa kurudisha kernel na usanidi uliorekebishwa (chaguo hili linapendekezwa tu ikiwa unatumia kernel maalum):

  • Ili kuweka kila wakati kwa chaguo-msingi, tumia:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Kuweka madvise kama chaguo-msingi, tumia:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Sehemu ya 2: Faida na Hasara za HugePages

Tutajaribu kuelezea kwa kuchagua faida, hasara na hatari zinazowezekana za kutumia Hugepages. Kwa kuwa makala changamano ya kiteknolojia na pedantic kuna uwezekano kuwa vigumu kuelewa kwa watu ambao wamedanganyika katika kufikiri Hugepages ni tiba, nitadhabihu usahihi kwa ajili ya urahisi. Inafaa kukumbuka kuwa mada nyingi ni ngumu sana na kwa hivyo zimerahisishwa sana.

Tafadhali kumbuka kuwa tunazungumza juu ya mifumo ya 64-bit x86 inayoendesha Linux, na kwamba ninadhania tu kwamba mfumo unaunga mkono kurasa kubwa za uwazi (kwani sio shida kwamba kurasa kubwa hazijaandikwa tena), kama ilivyo katika karibu Linux yoyote ya kisasa. mazingira.

Nitaambatisha maelezo zaidi ya kiufundi katika viungo vilivyo hapa chini.

Kumbukumbu ya Mtandaoni

Ikiwa wewe ni programu ya C++, unajua kuwa vitu kwenye kumbukumbu vina anwani maalum (maadili ya pointer).

Hata hivyo, anwani hizi si lazima zionyeshe anwani halisi kwenye kumbukumbu (anwani za RAM). Zinawakilisha anwani katika kumbukumbu halisi. Kichakataji kina moduli maalum ya MMU (kitengo cha usimamizi wa kumbukumbu) ambayo husaidia kernel ramani ya kumbukumbu pepe hadi eneo halisi.

Njia hii ina faida nyingi, lakini muhimu zaidi ni:

  • Utendaji (kwa sababu mbalimbali);
  • Kutengwa kwa programu, ambayo ni, hakuna programu inayoweza kusoma kutoka kwa kumbukumbu ya programu nyingine.

Kurasa ni nini?

Kumbukumbu halisi imegawanywa katika kurasa. Kila ukurasa maalum huelekeza kwenye kumbukumbu mahususi halisi, inaweza kuelekeza eneo kwenye RAM, au inaweza kuelekeza kwenye anwani iliyopewa kifaa halisi, kama vile kadi ya video.

Kurasa nyingi unazoshughulikia zinaelekeza kwa RAM au zimebadilishwa, kumaanisha kuwa zimehifadhiwa kwenye gari lako kuu au SSD. Kernel inasimamia mpangilio halisi wa kila ukurasa. Ikiwa ukurasa ulioharibiwa unapatikana, kernel inasimamisha thread inayojaribu kufikia kumbukumbu, inasoma ukurasa kutoka kwa gari ngumu / SSD hadi RAM, na kisha inaendelea kutekeleza thread.

Mchakato huu ni wazi wa mtiririko, kumaanisha kuwa si lazima usome moja kwa moja kutoka kwa HDD/SSD. Ukubwa wa kurasa za kawaida ni 4096 byte. Saizi kubwa ya kurasa ni 2 megabytes.

Bafa ya ushirika wa tafsiri (TLB)

Wakati programu inafikia ukurasa wa kumbukumbu, CPU lazima ijue ni ukurasa gani halisi wa kusoma data kutoka (yaani, kuwa na ramani ya anwani pepe).

Kernel ina muundo wa data (meza ya ukurasa) ambayo ina habari yote kuhusu kurasa zinazotumiwa. Kwa kutumia muundo huu wa data, unaweza ramani ya anwani pepe kwa anwani halisi.

Hata hivyo, jedwali la ukurasa ni changamano na polepole, kwa hivyo hatuwezi kuchanganua muundo mzima wa data kila wakati mchakato unapofikia kumbukumbu.

Kwa bahati nzuri, kichakataji chetu kina TLB inayohifadhi ramani kati ya anwani pepe na halisi. Hii inamaanisha kuwa ingawa tunahitaji kuchanganua jedwali la ukurasa kwenye jaribio la kwanza la ufikiaji, ufikiaji wote unaofuata wa ukurasa unaweza kushughulikiwa katika TLB, ikiruhusu utendakazi wa haraka.

Kwa sababu inatekelezwa kama kifaa halisi (ambacho hufanya iwe haraka hapo kwanza), uwezo wake ni mdogo. Kwa hivyo ikiwa unataka kufikia kurasa zaidi, TLB haitaweza kuhifadhi michoro kwa zote, na kusababisha programu yako kufanya kazi polepole zaidi.

Hugepages huja kuwaokoa

Kwa hivyo tunaweza kufanya nini kuzuia TLB kufurika? (Tunadhani programu bado inahitaji kumbukumbu sawa).

Hapa ndipo Hugepages inapoingia. Badala ya baiti 4096 zinazohitaji ingizo moja tu la TLB, ingizo moja la TLB sasa linaweza kuelekeza kwenye megabaiti 2 kubwa. Wacha tuchukue TLB ina maingizo 512, hapa bila Hugepages tunaweza kulinganisha:

4096 bβ‹…512=2 MB

Basi tunawezaje kulinganisha nao:

2 MBβ‹…512=1 GB

Hii ndiyo sababu Hugepages ni ya kushangaza. Wanaweza kuboresha tija bila juhudi nyingi. Lakini kuna tahadhari muhimu hapa.

Hugepages spoofing

Kernel hufuatilia kiotomati ni mara ngapi kila ukurasa wa kumbukumbu unatumika. Ikiwa hakuna kumbukumbu ya kimwili ya kutosha (RAM), kernel itasogeza kurasa zisizo muhimu (zinazotumika mara chache) kwenye diski kuu ili kutoa baadhi ya RAM kwa kurasa muhimu zaidi.
Kimsingi, hiyo hiyo inatumika kwa Hugepages. Walakini, kernel inaweza kubadilisha kurasa nzima tu, sio baiti za kibinafsi.

Wacha tuseme tunayo programu kama hii:

char* mymemory = malloc(2*1024*1024); // Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ это Π·Π° ΠΎΠ΄Π½Ρƒ Hugepage!
// Π—Π°ΠΏΠΎΠ»Π½ΠΈΠΌ mymemory ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
// Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ,
// ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅ страницы mymemory
// ...
// Запросим доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ
putchar(mymemory[0]); 

Katika hali hii, kernel itahitaji kuchukua nafasi (kusoma) kama vile 2 megabytes ya habari kutoka gari ngumu/SSD ili tu wewe kusoma byte moja. Kama kwa kurasa za kawaida, ni ka 4096 tu zinahitaji kusomwa kutoka kwa gari ngumu/SSD.

Kwa hivyo, ikiwa ukurasa mkubwa umebatilishwa, ni haraka kusoma ikiwa unahitaji kufikia ukurasa mzima. Hii ina maana kwamba ikiwa unajaribu kupata kwa nasibu sehemu tofauti za kumbukumbu na unasoma tu kilobaiti kadhaa, unapaswa kutumia kurasa za kawaida na usijali kuhusu kitu kingine chochote.

Kwa upande mwingine, ikiwa unahitaji kufikia sehemu kubwa ya kumbukumbu kwa mpangilio, kurasa kubwa zitaboresha utendaji wako. Walakini, unahitaji kuijaribu mwenyewe (sio na programu ya kufikirika) na uone kinachofanya kazi haraka.

Ugawaji katika kumbukumbu

Ukiandika C, unajua kuwa unaweza kuomba kiasi kidogo cha kumbukumbu (au karibu kiholela) kutoka kwenye lundo ukitumia malloc(). Wacha tuseme unahitaji ka 30 za kumbukumbu:

char* mymemory = malloc(30);

Kwa mtayarishaji programu, inaweza kuonekana kuwa "unaomba" baiti 30 za kumbukumbu kutoka kwa mfumo wa uendeshaji na kurudisha pointer kwenye kumbukumbu fulani. Lakini kwa kweli malloc () ni kitendakazi cha C ambacho huita kutoka ndani ya kitendakazi brk na sbrk kuomba au kuhifadhi kumbukumbu kutoka kwa mfumo wa uendeshaji.

Hata hivyo, kuomba kumbukumbu zaidi na zaidi kwa kila mgao haifai; kuna uwezekano mkubwa kuwa baadhi ya sehemu ya kumbukumbu tayari imeachiliwa (free()), na tunaweza kuitumia tena. malloc() hutekelezea algoriti changamano kwa kutumia tena kumbukumbu iliyoachiliwa.

Wakati huo huo, kila kitu kinatokea bila kutambuliwa kwako, kwa nini iwe na wasiwasi kwako? Lakini kwa sababu changamoto free() haimaanishi hivyo kumbukumbu ni lazima kurudi mara moja kwa mfumo wa uendeshaji.

Kuna kitu kama kugawanyika kwa kumbukumbu. Katika hali mbaya, kuna sehemu za lundo ambapo baiti chache tu hutumiwa, wakati kila kitu kilicho katikati kimeachiliwa. (free()).

Tafadhali kumbuka kuwa kugawanyika kwa kumbukumbu ni mada ngumu sana, na hata mabadiliko madogo kwenye programu yanaweza kuwa na athari kubwa. Katika hali nyingi, programu hazitasababisha mgawanyiko mkubwa wa kumbukumbu, lakini unapaswa kujua kwamba ikiwa kuna shida na kugawanyika katika eneo fulani la lundo, kurasa kubwa zinaweza kufanya hali kuwa mbaya zaidi.

Matumizi ya kuchagua ya kurasa kubwa

Baada ya kusoma nakala hii, umeamua ni sehemu gani za programu yako zinaweza kufaidika kwa kutumia kurasa kubwa na zipi haziwezi. Kwa hivyo kurasa kubwa zinapaswa kuwezeshwa hata kidogo?

Kwa bahati nzuri unaweza kutumia madvise()kuwezesha kurasa kubwa tu kwa maeneo ya kumbukumbu ambapo itakuwa muhimu.

Kwanza, angalia kuwa kurasa kubwa zinaendelea katika hali ya madvise() kwa kutumia maelekezo mwanzoni mwa makala.

Kisha, tumia madvise()kuambia kernel mahali pa kutumia kurasa kubwa.

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

Kumbuka kuwa njia hii ni ushauri tu kwa kernel juu ya jinsi ya kudhibiti kumbukumbu. Hii haimaanishi kuwa kernel itatumia kurasa kubwa kiatomati kwa kumbukumbu fulani.

Rejelea hati (manpage)madvisekujifunza zaidi kuhusu usimamizi wa kumbukumbu na madvise(), mada hii ina mkondo wa kujifunza wenye mwinuko wa ajabu. Kwa hivyo ikiwa unakusudia kufanikiwa sana, jitayarishe kusoma na kufanya mtihani kwa wiki chache kabla ya kutarajia matokeo yoyote chanya.

Nini cha kusoma?

Una swali? Andika kwenye maoni!

Chanzo: mapenzi.com

Kuongeza maoni