Foardielen en neidielen fan HugePages

Foardielen en neidielen fan HugePages

Oersetting fan it artikel taret foar kursusstudinten "Linux behearder".

Earder haw ik it oer hoe't ik Hugepages op Linux testen en ynskeakelje kinne.
Dit artikel sil allinich nuttich wêze as jo eins in plak hawwe om Hugepages te brûken. Ik haw in protte minsken moete dy't ferrifelje troch it perspektyf dat Hugepages op magyske wize de produktiviteit sil ferbetterje. Hugepaging is lykwols in kompleks ûnderwerp en kin prestaasjes degradearje as ferkeard brûkt.

Diel 1: Ferifiearje dat enoarme siden binne ynskeakele op Linux (orizjineel hjir)

Problem:
Jo moatte kontrolearje oft HugePages is ynskeakele op jo systeem.

oplossing:
It is frij simpel:

cat /sys/kernel/mm/transparent_hugepage/enabled

Jo sille sa'n ding krije:

always [madvise] never

Jo sille in list sjen mei beskikbere opsjes (altyd, madvise, nea), en de op it stuit aktive opsje sil wurde ynsletten tusken heakjes (standert madvise).

madvise betsjut dat transparent hugepages allinich ynskeakele foar ûnthâldgebieten dy't eksplisyt enoarme siden brûke madvise (2).

altyd betsjut dat transparent hugepages altyd ynskeakele foar alle prosessen. Dit ferbettert normaal de prestaasjes, mar as jo in gebrûk hawwe wêr't in protte prosessen in lyts bedrach fan ûnthâld ferbrûke, dan kin de totale ûnthâldlading dramatysk tanimme.

nea betsjut dat transparent hugepages sil net opnommen wurde sels as oanfrege mei madvise. Om mear te finen, nim dan kontakt op dokumintaasje Linux kernels.

Hoe feroarje de standertwearde

Option 1: Direkt feroarje sysfs (nei herstarten sil de parameter weromgean nei syn standertwearde):

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

Option 2: Feroarje de systeemstandert troch de kernel opnij te kompilearjen mei in wizige konfiguraasje (dizze opsje wurdt allinich oanrikkemandearre as jo in oanpaste kernel brûke):

  • Om altyd standert yn te stellen, brûk:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Om madvise as standert yn te stellen, brûk:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Diel 2: Foardielen en neidielen fan HugePages

Wy sille besykje selektyf de foardielen, neidielen en mooglike falkûlen te ferklearjen fan it brûken fan Hugepages. Om't in technologysk kompleks en pedantysk artikel wierskynlik lestich te begripen sil wêze foar minsken dy't misledige binne om te tinken dat Hugepages in panacee is, sil ik krektens opofferje foar ienfâld. It is gewoan de muoite wurdich om yn gedachten te hâlden dat in protte fan 'e ûnderwerpen echt kompleks binne en dêrom sterk ferienfâldige binne.

Tink derom dat wy it hawwe oer 64-bit x86-systemen dy't Linux draaie, en dat ik gewoan oannimme dat it systeem transparante enoarme siden stipet (omdat it gjin neidiel is dat grutte siden net oerskreaun wurde), lykas it gefal is yn hast alle moderne Linux miljeu.

Ik sil taheakje mear technyske beskriuwing yn de links hjirûnder.

Firtuele Unthâld

As do bist in C ++ programmeur, do witst dat objekten yn it ûnthâld hawwe spesifike adressen (pointer wearden).

Dizze adressen wjerspegelje lykwols net needsaaklik fysike adressen yn it ûnthâld (RAM-adressen). Se fertsjintwurdigje adressen yn firtuele ûnthâld. De prosessor hat in spesjale MMU (memory management unit) module dy't helpt de kernel map firtuele ûnthâld oan in fysike lokaasje.

Dizze oanpak hat in protte foardielen, mar de wichtichste binne:

  • prestaasjes (foar ferskate redenen);
  • Programma isolaasje, dat is, gjin programma kin lêze út it ûnthâld fan in oar programma.

Wat binne siden?

Firtuele ûnthâld is ferdield yn siden. Eltse yndividuele side wiist op in spesifyk fysyk ûnthâld, it kin wize op in gebiet yn RAM, of it kin wize op in adres tawiisd oan in fysyk apparaat, lykas in fideo card.

De measte siden dy't jo omgeane, wize op RAM of wurde wiksele, wat betsjut dat se wurde opslein op jo hurde skiif of SSD. De kernel beheart de fysike yndieling fan elke side. As in spoofed side wurdt tagong, stopt de kearn de tried dy't besiket tagong te krijen ta it ûnthâld, lêst de side fan 'e hurde skiif / SSD yn RAM, en giet dan troch mei it útfieren fan de tried.

Dit proses is streamtransparant, wat betsjuttet dat it net needsaaklik direkt fan 'e HDD / SSD lêzen wurdt. De grutte fan normale siden is 4096 bytes. Hugepages grutte is 2 megabytes.

Translation-associative buffer (TLB)

As in programma tagong ta in side fan ûnthâld, de CPU moat witte hokker fysike side te lêzen gegevens út (dat is, hawwe in firtuele adres map).

De kernel hat in gegevensstruktuer (sidetabel) dy't alle ynformaasje befettet oer de siden dy't brûkt wurde. Mei dizze gegevensstruktuer kinne jo in firtuele adres yn kaart bringe nei in fysyk adres.

De sidetabel is lykwols frij kompleks en stadich, dus wy kinne de folsleine gegevensstruktuer gewoan net analysearje elke kear as in proses tagong hat ta ûnthâld.

Gelokkich hat ús prosessor in TLB dy't de mapping tusken firtuele en fysike adressen cache. Dit betsjut dat hoewol wy de sidetabel moatte parsearje op 'e earste tagongspoging, kinne alle folgjende tagongen nei de side wurde behannele yn' e TLB, wêrtroch snelle operaasje mooglik is.

Om't it wurdt ymplementearre as in fysyk apparaat (wat makket it fluch yn it earste plak), syn kapasiteit is beheind. Dus as jo tagong wolle ta mear siden, sil de TLB net yn steat wêze om mappen foar allegear op te slaan, wêrtroch jo programma folle stadiger rint.

Hugepages komt te rêden

Dat wat kinne wy ​​dwaan om TLB-oerstream te foarkommen? (Wy geane der fan út dat it programma noch itselde bedrach fan ûnthâld nedich is).

Dit is wêr't Hugepages ynkomt. Ynstee fan 4096 bytes dy't mar ien TLB-yngong fereaskje, kin ien TLB-yngong no ferwize nei in heulende 2 megabytes. Litte wy oannimme dat de TLB 512 ynstjoerings hat, hjir sûnder Hugepages kinne wy ​​​​oerienkomme:

4096 b⋅512=2 MB

Dan hoe kinne wy ​​​​mei har fergelykje:

2 MB⋅512=1 GB

Dit is wêrom Hugepages geweldig is. Se kinne de produktiviteit ferbetterje sûnder folle muoite. Mar hjir binne wichtige warskôgings.

Hugepages spoofing

De kernel kontrolearret automatysk hoe faak elke ûnthâldside wurdt brûkt. As d'r net genôch fysyk ûnthâld (RAM) is, sil de kearn minder wichtige (minder faak brûkte) siden nei de hurde skiif ferpleatse om wat RAM frij te meitsjen foar wichtigere siden.
Yn prinsipe jildt itselde foar Hugepages. De kernel kin lykwols allinich folsleine siden wikselje, net yndividuele bytes.

Litte wy sizze dat wy in programma hawwe lykas dit:

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

Yn dit gefal sil de kernel safolle as 2 megabytes oan ynformaasje moatte ferfange (lêze) fan 'e hurde skiif / SSD krekt foar jo om ien byte te lêzen. Wat gewoane siden oanbelanget, moatte allinich 4096 bytes lêzen wurde fan 'e hurde skiif / SSD.

Dêrom, as enoarme side wurdt oerskreaun, is it allinich rapper om te lêzen as jo tagong moatte ta de heule side. Dit betsjut dat as jo besykje willekeurige tagong te krijen ta ferskate dielen fan it ûnthâld en gewoan in pear kilobytes lêze, jo gewoane siden moatte brûke en gjin soargen meitsje oer wat oars.

Oan 'e oare kant, as jo sequentieel tagong moatte ta in grut diel fan ûnthâld, sille enoarme siden jo prestaasjes ferbetterje. Jo moatte it lykwols sels testje (net mei abstrakte software) en sjen wat rapper wurket.

Tawizing yn ûnthâld

As jo ​​C skriuwe, witte jo dat jo willekeurich lytse (of hast willekeurich grutte) hoemannichten ûnthâld kinne oanfreegje fan 'e heap mei malloc(). Litte wy sizze dat jo 30 bytes ûnthâld nedich binne:

char* mymemory = malloc(30);

Foar in programmeur kin it lykje dat jo "oanfreegje" 30 bytes ûnthâld fan it bestjoeringssysteem en werom in oanwizer nei wat firtuele ûnthâld. Mar eins malloc () is gewoan in C-funksje dy't ropt fanút de funksje brk en sbr om oan te freegjen of ûnthâld te befrijen fan it bestjoeringssysteem.

It freegjen fan mear en mear ûnthâld foar elke allocaasje is lykwols net effisjint; it is nei alle gedachten dat guon ûnthâld segment is al frijmakke (free()), en wy kinne it opnij brûke. malloc() ymplemintearret frij komplekse algoritmen foar it opnij brûken fan befrijd ûnthâld.

Tagelyk bart alles ûngemurken foar jo, dus wêrom soe it jo soargen meitsje? Mar omdat de útdaging free() betsjut net dat ûnthâld wurdt needsaaklikerwize fuortendaliks werom nei it bestjoeringssysteem.

D'r is sa'n ding as ûnthâldfragmentaasje. Yn ekstreme gefallen binne d'r heapsegminten wêr't mar in pear bytes brûkt wurde, wylst alles dêrtusken frijmakke is (free()).

Tink derom dat ûnthâldfragmentaasje in ongelooflijk kompleks ûnderwerp is, en sels lytse feroarings oan in programma kinne in wichtige ynfloed hawwe. Yn 'e measte gefallen sille programma's gjin signifikante ûnthâldfragmentaasje feroarsaakje, mar jo moatte jo bewust wêze dat as d'r in probleem is mei fragmentaasje yn guon gebieten fan' e heap, enoarme siden kinne de situaasje slimmer meitsje.

Selektyf gebrûk fan grutte siden

Nei it lêzen fan dit artikel hawwe jo bepaald hokker dielen fan jo programma kinne profitearje fan it brûken fan enoarme siden en hokker net. Dat moatte enoarme siden hielendal ynskeakele wurde?

Gelokkich kinne jo brûke madvise()om hugepaging allinich yn te skeakeljen foar dy ûnthâldgebieten wêr't it nuttich wêze soe.

Kontrolearje earst dat hugepages rint yn madvise () modus mei help fan ynstruksjes oan it begjin fan it artikel.

Dan, brûke madvise()om de kernel krekt te fertellen wêr't grutte siden moatte wurde brûkt.

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

Tink derom dat dizze metoade gewoan advys is foar de kernel oer hoe't jo ûnthâld beheare kinne. Dit betsjut net dat de kearn automatysk enoarme siden sil brûke foar in bepaald ûnthâld.

Ferwize nei dokumintaasje (manpage)madviseom mear te learen oer ûnthâldbehear en madvise(), dit ûnderwerp hat in ongelooflijk steile learkurve. Dus as jo fan doel binne der echt goed yn te wurden, meitsje jo dan klear om in pear wiken te lêzen en te testen foardat jo positive resultaten ferwachtsje.

Wat te lêzen?

Hawwe jo in fraach? Skriuw yn 'e kommentaren!

Boarne: www.habr.com

Add a comment