
Ikastaroko ikasleentzat prestatutako artikuluaren itzulpena .
Aurretik, orrialde erraldoien erabilera nola egiaztatu eta gaitu azaldu nuen Linux.
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: Egiaztatu orrialde erraldoiak gaituta daudela Linux (jatorrizkoa )
Arazoa:
HugePages zure sisteman gaituta dagoen egiaztatu behar duzu.
irtenbidea:
Nahiko sinplea da:
cat /sys/kernel/mm/transparent_hugepage/enabledHorrelako zerbait lortuko duzu:
always [madvise] neverEskuragarri 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 .
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 nukleoak Linux.
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/enabledAukera 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 64 biteko x86 sistemetan ari garela Linux, eta sistemak orrialde erraldoi gardenak onartzen dituela suposatzen ari naizela besterik gabe (ez baita desabantaila bat orrialde erraldoiak ez ordezkatzea), ia edozein ingurune modernotan gertatzen den bezala Linux.
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 MBOrduan, nola konparatu dezakegu haiekin:
2 MB⋅512=1 GBHorregatik 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 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 .
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 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 memoria 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
