HugePages-en abantailak eta desabantailak

HugePages-en abantailak eta desabantailak

Ikastaroko ikasleentzat prestatutako artikuluaren itzulpena "Linux administratzailea".

Aurretik, Hugepages Linux-en nola probatu eta gaitzeari buruz hitz egin nuen.
Artikulu hau Hugepages erabiltzeko lekurik baduzu bakarrik izango da erabilgarria. Hugepages-ek magikoki produktibitatea hobetuko duela uste duen jende asko ezagutu dut. Hala ere, hugepaging gai konplexua da eta errendimendua kaltetu dezake gaizki erabiltzen bada.

1. zatia: Linux-en hugepages gaituta dagoela egiaztatzea (jatorrizkoa Hemen)

Arazoa:
HugePages zure sisteman gaituta dagoen egiaztatu behar duzu.

irtenbidea:
Nahiko sinplea da:

cat /sys/kernel/mm/transparent_hugepage/enabled

Horrelako zerbait lortuko duzu:

always [madvise] never

Eskuragarri dauden aukeren zerrenda ikusiko duzu (beti, ero, inoiz), eta une honetan aktibo dagoen aukera parentesi artean sartuko da (lehenespenez erotu).

erotu horrek esan nahi du transparent hugepages gaituta soilik erabiltzen diren orrialde erraldoiak esplizituki eskatzen dituzten memoria-eremuetarako zoramena (2).

beti. horrek esan nahi du transparent hugepages beti gaituta prozesu guztietarako. Honek normalean errendimendua hobetzen du, baina prozesu askok memoria kopuru txikia kontsumitzen duten erabilera-kasu bat baduzu, memoria-karga orokorra izugarri handitu daiteke.

inoiz ez horrek esan nahi du transparent hugepages ez da sartuko madvise erabiliz eskatuta ere. Gehiago jakiteko, jarri harremanetan dokumentazioa Linux nukleoak.

Nola aldatu balio lehenetsia

Aukera 1: Zuzenean aldatu sysfs (Berrabiarazi ondoren parametroa bere balio lehenetsira itzuliko da):

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

Aukera 2: Aldatu sistemaren lehenetsia nukleoa aldatutako konfigurazio batekin berriro konpilatuz (aukera hau kernel pertsonalizatua erabiltzen ari bazara bakarrik gomendatzen da):

  • Lehenespenez beti ezartzeko, erabili:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Madvise lehenetsi gisa ezartzeko, erabili:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

2. zatia: HugePages-en abantailak eta desabantailak

Hugepages erabiltzearen abantailak, desabantailak eta izan litezkeen hutsuneak selektiboki azaltzen saiatuko gara. Artikulu teknologikoki konplexua eta pedante bat ulertzea zaila izango denez Hugepages panazea dela pentsatzeko engainatuta dauden pertsonentzat, zehaztasuna sakrifikatu egingo dut sinpletasunaren alde. Kontuan izan behar da gai asko benetan konplexuak direla eta, beraz, oso sinplifikatuak direla.

Kontuan izan Linux exekutatzen duten 64 biteko x86 sistemez ari garela, eta sistemak hugepage gardenak onartzen dituela suposatzen dudala (ez baita desabantaila hugepages gainidatzita ez egotea), Linux moderno ia guztietan gertatzen den bezala. ingurunea.

Beheko esteketan deskribapen tekniko gehiago erantsiko dut.

Memoria Birtuala

C++ programatzailea bazara, badakizu memorian dauden objektuek helbide zehatzak dituztela (erakusleen balioak).

Hala ere, helbide hauek ez dute zertan islatu memorian helbide fisikoak (RAM helbideak). Memoria birtualean helbideak adierazten dituzte. Prozesadoreak MMU (memoria kudeatzeko unitatea) modulu berezi bat du, nukleoari memoria birtuala kokapen fisiko batera mapatzen laguntzen diona.

Ikuspegi honek abantaila asko ditu, baina garrantzitsuenak hauek dira:

  • Errendimendua (arrazoi ezberdinengatik);
  • Programaren isolamendua, hau da, ezein programak ezin du beste programa baten memoriatik irakurri.

Zer dira orriak?

Memoria birtuala orrialdetan banatuta dago. Orrialde bakoitzak memoria fisiko zehatz batera seinalatzen du, RAM-eko eremu batera seinalatu dezake edo gailu fisiko bati esleitutako helbide batera, adibidez, bideo-txartela.

Tratatzen dituzun orrialde gehienek RAMera seinalatzen dute edo trukatzen dira, hau da, zure disko gogorrean edo SSDan gordetzen dira. Nukleoak orrialde bakoitzaren diseinu fisikoa kudeatzen du. Orrialde faltsu bat sartzen bada, nukleoak memoriara sartzen saiatzen ari den haria gelditzen du, disko gogorreko/SSDtik orrialdea RAM-era irakurtzen du eta gero haria exekutatzen jarraitzen du.

Prozesu hau korronte gardena da, hau da, ez du zertan HDD/SSDtik zuzenean irakurtzen. Orrialde arrunten tamaina 4096 byte da. Hugepages tamaina 2 megabyte da.

Itzulpen-elkarteen buffer (TLB)

Programa bat memoria orri batera sartzen denean, CPUak jakin behar du zein orri fisikotatik irakurri behar dituen datuak (hau da, helbide birtualaren mapa izan).

Nukleoak erabiltzen ari diren orriei buruzko informazio guztia jasotzen duen datu-egitura (orrien taula) du. Datu-egitura hau erabiliz, helbide birtual bat helbide fisiko batekin mapa dezakezu.

Hala ere, orrialde-taula nahiko konplexua eta motela da, beraz, ezin dugu datu-egitura osoa aztertu prozesu bat memoria sartzen den bakoitzean.

Zorionez, gure prozesadoreak helbide birtualen eta fisikoen arteko mapak gordetzen dituen TLB bat dauka. Horrek esan nahi du lehen sarbide-saiakeran orrialde-taula analizatu behar badugu ere, orrialderako ondorengo sarbide guztiak TLBn kudeatu daitezkeela, funtzionamendu azkarra ahalbidetuz.

Gailu fisiko gisa inplementatzen denez (lehen azkar egiten du horrek), bere ahalmena mugatua da. Beraz, orrialde gehiago atzitu nahi badituzu, TLB-k ezingo ditu guztien mapak gorde, eta zure programa askoz motelagoa izango da.

Hugepages salbatzera dator

Beraz, zer egin dezakegu TLB gainezkatzea ekiditeko? (Suposatzen dugu programak memoria kopuru bera behar duela oraindik).

Hemen sartzen da Hugepages. 4096 byte TLB sarrera bakarra behar duten ordez, TLB sarrera batek 2 megabyte ikaragarriak adierazi ditzake orain. Demagun TLBk 512 sarrera dituela, hemen Hugepages gabe parekatu dezakegu:

4096 bβ‹…512=2 MB

Orduan, nola konparatu dezakegu haiekin:

2 MBβ‹…512=1 GB

Horregatik Hugepages ikaragarria da. Esfortzu handirik gabe produktibitatea hobetu dezakete. Baina ohar garrantzitsuak daude hemen.

Hugepages spoofing

Nukleoak automatikoki kontrolatzen du memoria-orri bakoitza zenbateko maiztasuna erabiltzen den. Memoria fisiko (RAM) nahikoa ez badago, nukleoak garrantzi gutxiagoko (gutxiago erabiltzen diren) orrialdeak eramango ditu disko gogorrera RAM pixka bat askatzeko orrialde garrantzitsuetarako.
Printzipioz, gauza bera gertatzen da Hugepages-ekin. Hala ere, nukleoak orrialde osoak soilik trukatu ditzake, ez byte indibidualak.

Demagun honelako programa bat dugula:

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

Kasu honetan, kernelak disko gogorrean/SSD-ko 2 megabyte-ko informazioa ordezkatu (irakurri) beharko du zuk byte bat irakurtzeko. Ohiko orrialdeei dagokienez, disko gogorrean/SSDtik 4096 byte baino ez dira irakurri behar.

Hori dela eta, hugepage gainidazten bada, bizkorragoa da irakurtzea orrialde osora sartu behar baduzu. Horrek esan nahi du memoriaren zati ezberdinetan ausaz sartzen saiatzen bazara eta kilobyte pare bat irakurtzen ari bazara, ohiko orrialdeak erabili behar dituzula eta ez kezkatu beste ezertaz.

Bestalde, memoriaren zati handi bat sekuentzialki sartu behar baduzu, hugepages zure errendimendua hobetuko da. Hala ere, zuk zeuk probatu behar duzu (ez software abstraktuarekin) eta ikusi zer funtzionatzen duen azkarrago.

Esleipena memorian

C idazten baduzu, badakizu memoria kantitate txikiak (edo ia arbitrarioki handiak) eska ditzakezula pilatik. malloc(). Demagun 30 byteko memoria behar duzula:

char* mymemory = malloc(30);

Programatzaile bati, baliteke sistema eragileari 30 byte memoria "eskatzen" ari zarela eta erakuslea memoria birtual batera itzultzen ari zarela. Baina egia esan malloc () Funtzio barrutik deitzen duen C funtzio bat besterik ez da brk eta sbrk sistema eragileari memoria eskatzeko edo askatzeko.

Hala ere, esleipen bakoitzerako gero eta memoria gehiago eskatzea ez da eraginkorra; litekeena da memoria-segmenturen bat dagoeneko askatuta egotea (free()), eta berrerabili ahal izango dugu. malloc() askatutako memoria berrerabiltzeko algoritmo nahiko konplexuak ezartzen ditu.

Aldi berean, dena oharkabean gertatzen zaizu, beraz, zergatik kezkatu behar zaitu? Baina erronka delako free() ez du hori esan nahi memoria sistema eragilera berehala itzultzen da nahitaez.

Bada memoria zatikatzea bezalako gauza bat. Muturreko kasuetan, byte batzuk bakarrik erabiltzen diren pila-segmentuak daude, tartean dena askatu den bitartean. (free()).

Kontuan izan memoria zatikatzea gai izugarri konplexua dela, eta programa batean aldaketa txikiek ere eragin handia izan dezaketela. Kasu gehienetan, programek ez dute memoriaren zatiketa nabarmenik eragingo, baina kontutan izan behar duzu zatiketa arazoren bat egonez gero piloaren eremuren batean, orrialde erraldoiek egoera okerrago dezaketela.

Hugepages erabilera selektiboa

Artikulu hau irakurri ondoren, zehaztu duzu zure programaren zein zati onura daitezkeen hugepages erabiltzeak eta zeintzuk ez. Beraz, hugepages aktibatu behar al da batere?

Zorionez, erabil dezakezu madvise()baliagarria izango litzatekeen memoria-eremuetarako soilik gaitzeko.

Lehenik eta behin, egiaztatu hugepages madvise() moduan exekutatzen ari dela erabiliz argibideak artikuluaren hasieran.

Ondoren, erabili madvise()nukleoari hugepages zehazki non erabili behar duen esateko.

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

Kontuan izan metodo hau nukleoari memoria kudeatzeko aholkua besterik ez dela. Horrek ez du esan nahi nukleoak automatikoki orrialde erraldoiak erabiliko dituenik memoria jakin baterako.

Kontsultatu dokumentazioa (manpage)aholkatumemoria kudeaketari buruz gehiago jakiteko eta madvise(), gai honek ikasketa kurba izugarri maldatsua du. Beraz, oso ona izateko asmoa baduzu, prestatu irakurtzeko eta probatzeko aste batzuk emaitza positiboak espero baino lehen.

Zer irakurri?

Galderarik al duzu? Idatzi iruzkinetan!

Iturria: www.habr.com

Gehitu iruzkin berria