Faa'iidooyinka iyo khasaaraha ee Bogagga Huge

Faa'iidooyinka iyo khasaaraha ee Bogagga Huge

Turjumaada maqaalka loo diyaariyey ardayda koorsada "Maamulaha Linux".

Markii hore, waxaan ka hadlay sida loo tijaabiyo oo loo sahlo Hugepages Linux.
Maqaalkani wuxuu kaliya faa'iido yeelan doonaa haddii aad dhab ahaantii leedahay meel aad ku isticmaasho Hugepages. Waxaan la kulmay dad badan oo ay ku khiyaameen rajada ah in Hugepages ay si sixir ah u horumarin doonto wax soo saarka. Si kastaba ha ahaatee, hugepaging waa mawduuc adag oo hoos u dhigi kara waxqabadka haddii si khaldan loo isticmaalo.

Qeybta 1: Xaqiijinta in bogag waaweyn ay karti u leeyihiin Linux (asal halkan)

Dhibaato:
Waxaad u baahan tahay inaad hubiso in HugePages uu ka shaqaynayo nidaamkaaga.

xal:
Way fududahay:

cat /sys/kernel/mm/transparent_hugepage/enabled

Waxaad heli doontaa wax sidan oo kale ah:

always [madvise] never

Waxaad arki doontaa liiska fursadaha jira (had iyo jeer, waalan, marna), iyo ikhtiyaarka hadda firfircoon waxa lagu lifaaqi doonaa khaanadaha (sida caadiga ah waalan).

waalan taas macnaheedu waa transparent hugepages loo oggolaaday oo keliya meelaha xusuusta ee si cad u codsanaya bogag waaweyn oo isticmaalaya waalan (2).

had iyo jeer taas macnaheedu waa transparent hugepages had iyo jeer awood u leh dhammaan hababka. Tani waxay badanaa wanaajisaa waxqabadka, laakiin haddii aad leedahay kiis la isticmaalo oo habab badan ay isticmaalayaan qadar yar oo xusuusta ah, markaa culeyska xusuusta guud ayaa si weyn u kordhin kara.

marna taas macnaheedu waa transparent hugepages laguma dari doono xitaa marka la codsado iyadoo la isticmaalayo madvise. Si aad wax badan u ogaato, la xidhiidh dukumentiyo Kernel Linux.

Sida loo beddelo qiimaha caadiga ah

Doorashada 1: Toos u beddel sysfs (ka dib dib-u-kicinta cabbirku wuxuu ku soo noqon doonaa qiimihiisii ​​caadiga ahaa):

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

Doorashada 2Beddel habka caadiga ah adiga oo dib u soo uruurinaya kernel qaabeyn wax laga beddelay (doorashadan waxaa lagu talinayaa kaliya haddii aad isticmaalayso kernel gaar ah):

  • Si aad had iyo jeer u dejiso default, isticmaal:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Si aad u dhigto madvise sidii default, isticmaal:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Qaybta 2: Faa'iidooyinka iyo Khasaaraha Bogagga Weyn

Waxaan isku dayi doonaa inaan si xushmad leh u sharaxno faa'iidooyinka, khasaarooyinka iyo dhibaatooyinka suurtagalka ah ee isticmaalka Hugepages. Maadaama maqaal tignoolajiyada kakan iyo maqaalku ay u badan tahay inay ku adkaan doonto in la fahmo dadka ku qaldamay inay u maleeyaan in Hugepages ay dawo u tahay, waxaan u huri doonaa saxnaanta si ay u fududaato. Waxa kaliya oo mudan in maskaxda lagu hayo in mowduucyo badan ay runtii aad u adag yihiin sidaas awgeedna aad loo fududeeyay.

Fadlan la soco inaan ka hadleyno nidaamyada 64-bit x86 ee ku shaqeeya Linux, iyo inaan si fudud u maleynayo in nidaamku uu taageerayo bogag waaweyn oo hufan (maadaama aysan khasaare ahayn in bogagga waaweyn aan la qorin), sida kiiska ku dhawaad ​​​​Linux kasta oo casri ah. deegaanka.

Waxaan ku soo lifaaqi doonaa sharraxaad farsamo oo dheeraad ah xiriirka hoose.

Xusuusta Virtual

Haddii aad tahay barnaamijka C++, waxaad ogtahay in walxaha xusuusta ku jira ay leeyihiin cinwaanno gaar ah (qiimaha tilmaamayaasha).

Si kastaba ha ahaatee, ciwaanadani qasab maaha inay ka tarjumayaan ciwaanada xusuusta ku jira (cinwaanada RAM). Waxay u taagan yihiin ciwaannada xusuusta casriga ah. Processor-ku waxa uu leeyahay moduleka MMU (cutubka maaraynta xusuusta) gaar ah kaas oo ka caawiya kernel-ka khariidadda xusuusta dalwaddii in uu meel jidheed gaadho.

Habkani wuxuu leeyahay faa'iidooyin badan, laakiin kuwa ugu muhiimsan waa:

  • Waxqabadka (sababo kala duwan awgood);
  • Go'doominta barnaamijka, taas oo ah, barnaamij ma akhrin karo xusuusta barnaamij kale.

Waa maxay bogag?

Xusuusta Virtual waxay u qaybsantaa bogag. Bog kasta oo gaar ah wuxuu tilmaamayaa xusuusta jireed ee gaarka ah, waxay tilmaami kartaa aag RAM ah, ama waxay tilmaami kartaa ciwaanka loo qoondeeyay aaladda jireed, sida kaarka fiidiyowga.

Inta badan boggaga aad la macaamilayso midkoodna waxay tilmaamayaan RAM ama waa la isku bedelayaa, taasoo la macno ah inay ku kaydsan yihiin darawalkaaga adag ama SSD. Kernelku wuxuu maamulaa qaabaynta jireed ee bog kasta. Haddii bog la jeexjeexay la galo, kernel-ku wuxuu joojiyaa dunta isku deyeysa inuu galo xusuusta, wuxuu akhriyaa bogga Hard Drive/SSD gudaha RAM, ka dibna wuxuu sii wadaa fulinta dunta.

Habkani waa mid daah-furan, taasoo la macno ah in aan si toos ah looga akhrin HDD/SSD. Cabbirka boggaga caadiga ah waa 4096 bytes. Cabbirka bogga weyn waa 2 megabyte.

Turjumaada-isku xidhka xidhidha (TLB)

Marka barnaamijku galo bogga xusuusta, CPU waa inay ogaataa bogga jireed ee laga akhrinayo xogta (yacni, haysta khariidad ciwaanka ah).

Kernelku wuxuu leeyahay qaab-dhismeedka xogta (miiska bogga) oo ka kooban dhammaan macluumaadka ku saabsan boggaga la isticmaalayo. Adigoo isticmaalaya qaab dhismeedka xogtan, waxaad khariidad ku samayn kartaa ciwaanka macmalka ah ciwaanka jir ahaaneed.

Si kastaba ha ahaatee, miiska boggu waa mid adag oo gaabis ah, markaa si fudud uma falanqeyn karno dhammaan qaab dhismeedka xogta mar kasta oo geedi socodku galo xusuusta.

Nasiib wanaag, processor-kayagu waxa uu leeyahay TLB kaas oo kaydiya khariidaynta inta u dhaxaysa ciwaannada farsamada iyo muuqaalka. Tani waxay ka dhigan tahay in kasta oo aan u baahannahay inaan ku kala saarno miiska bogga isku daygii ugu horreeyay ee gelitaanka, dhammaan gelitaanka xiga ee bogga waxaa lagu maarayn karaa TLB, taas oo u oggolaanaysa hawlgal degdeg ah.

Sababtoo ah waxaa loo hirgeliyaa sida qalab jireed (taas oo ka dhigaysa mid degdeg ah meesha ugu horeysa), awooddeedu waa xaddidan tahay. Markaa haddii aad rabto inaad gasho bogag badan, TLB ma awoodi doonto inay u kaydiso khariidadaha dhamaantood, taasoo keenaysa in barnaamijkaagu si tartiib tartiib ah u socdo.

Bogagga waaweyn ayaa u soo gurmada

Haddaba maxaan sameyn karnaa si aan uga fogaano qulqulka TLB? (Waxaan u maleyneynaa in barnaamijku uu weli u baahan yahay qaddar la mid ah xusuusta).

Tani waa halka ay ka soo gasho Hugepages. Halkii laga heli lahaa 4096 bytes oo u baahan hal gelitaan TLB ah, hal gelitaan TLB ayaa hadda tilmaamaya 2 megabyte oo baaxad leh. Aynu ka soo qaadno in TLB uu leeyahay 512 gelis, halkan iyada oo aan la helin Hugepages waxaan ku habboonayn karnaa:

4096 bβ‹…512=2 MB

Haddaba sideen ula barbardhigi karnaa:

2 MBβ‹…512=1 GB

Tani waa sababta Hugepages ay u tahay mid cajiib ah. Waxay hagaajin karaan wax soo saarka iyada oo aan dadaal badan la helin. Laakiin waxaa jira digniino muhiim ah halkan.

Bogag aad u wayn

Kernelku wuxuu si toos ah ula socdaa inta jeer ee bog kasta oo xusuusta la isticmaalo. Haddii aysan jirin xusuusta jireed ee ku filan (RAM), kernelku wuxuu u dhaqaaqi doonaa bogag aan muhiim ahayn (oo aan inta badan la isticmaalin) diskka si uu u xoreeyo qaar ka mid ah RAM boggaga muhiimka ah.
Mabda 'ahaan, isku mid ayaa quseeya Hugepages. Si kastaba ha ahaatee, kernel-ku waxa uu beddeli karaa oo keliya bogag dhan, ma aha mid shakhsi ah.

Aynu nidhaahno waxaanu haynaa barnaamij sidan oo kale ah:

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

Xaaladdan oo kale, kernel-ku wuxuu u baahan doonaa inuu beddelo (akhri) illaa 2 megabyte oo macluumaad ah Hard Drive/SSD kaliya si aad hal byte u akhrido. Xagga boggaga caadiga ah, kaliya 4096 bytes ayaa u baahan in laga akhriyo hard drive/SSD.

Sidaa darteed, haddii bogga weyn la dhaafo, way dhakhso badan tahay in la akhriyo haddii aad u baahan tahay inaad gasho bogga oo dhan. Taas macnaheedu waa haddii aad isku dayayso inaad si aan kala sooc lahayn u gasho qaybo kala duwan oo xusuusta ah oo aad akhrinayso laba kilobytes, waa inaad isticmaashaa bogag caadi ah oo ha ka welwelin wax kale.

Dhanka kale, haddii aad u baahan tahay inaad si xidhiidh ah u gasho qayb weyn oo xusuusta ah, bogag waaweyn ayaa hagaajin doona waxqabadkaaga. Si kastaba ha ahaatee, waxaad u baahan tahay inaad adigu tijaabiso (ma aha software aan la taaban karin) oo arag waxa si degdeg ah u shaqeeya.

Qoondaynta xusuusta

Haddii aad qorto C, waxaad ogtahay in aad ka codsan karto xaddi yar oo xusuus ah oo aan sabab lahayn (ama ku dhawaad ​​si aan kala sooc lahayn). malloc(). Aynu nidhaahno waxaad u baahan tahay 30 bytes oo xusuusta ah:

char* mymemory = malloc(30);

Barmaamijiyaha, waxa ay u muuqan kartaa in aad "codsanayso" 30 bytes oo xusuusta ah nidaamka qalliinka oo aad ku soo celinayso tilmaame qaar ka mid ah xusuusta casriga ah. Laakiin dhab ahaantii malloc () waa uun shaqo C oo ka soo wacaysa shaqada dhexdeeda brk iyo sbrk si aad u codsato ama ka xoroobo xusuusta nidaamka qalliinka.

Si kastaba ha ahaatee, codsashada xusuusta badan iyo in ka badan qoondayn kasta waa mid aan waxtar lahayn; Waxay u badan tahay in qaybta xusuusta qaarkood hore loo sii daayay (free()), oo dib ayaan u isticmaali karnaa. malloc() Waxay fulisaa algorithms aad u adag si dib loogu isticmaalo xusuusta xorta ah.

Isla mar ahaantaana, wax kastaa waxay ku dhacaan adiga oo aan la dareemin, markaa maxay kuugu welwelaysaa? Laakiin sababtoo ah caqabada free() taas macnaheedu maaha Xusuusta waa in isla markiiba lagu soo celiyaa nidaamka qalliinka.

Waxaa jira wax la mid ah sida kala qaybsanaanta xusuusta. Xaaladaha aadka u daran, waxaa jira qaybo taallo ah oo dhowr bytes la isticmaalo, halka wax kasta oo u dhexeeya la sii daayay. (free()).

Fadlan ogow in kala qaybsanaanta xusuusta ay tahay mawduuc aad u adag, xitaa isbeddellada yaryar ee barnaamijka waxay yeelan karaan saameyn weyn. Xaaladaha intooda badan, barnaamijyadu ma keeni doonaan kala qaybsanaan xusuusta weyn, laakiin waa in aad la socotid in haddii ay jirto dhibaato kala qaybsanaanta meelaha qaar ka mid ah tuulmo, pages weyn ayaa ka dhigi kara xaaladda.

Isticmaalka xulashada weyn ee boggaga waaweyn

Markaad akhrido maqaalkan, waxaad go'aamisay qaybaha barnaamijkaaga ka faa'iideysan kara isticmaalka bogag waaweyn iyo kuwa aan awoodin. Haddaba ma habboon tahay in gebi ahaanba boggaga waaweyn la furo?

Nasiib wanaag waad isticmaali kartaa madvise()si aad awood ugu siiso bigpaging kaliya meelaha xusuusta ah ee ay faa'iido u yeelan karto.

Marka hore, hubi in boggaga waaweyn ay ku socdaan qaabka madvise() addoo isticmaalaya tilmaamaha bilawga maqaalka.

Kadib, isticmaal madvise()si sax ah loogu sheego kernel-ka halka laga isticmaalo bogag waaweyn.

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

Ogsoonow in habkani si fudud u yahay talo ku socota kernel-ka sida loo maareeyo xusuusta. Tani macnaheedu maaha in kernelku uu si toos ah u isticmaali doono bogag waaweyn xusuusta la siiyay.

Tixraac dukumentiyada (manpage) madvisesi aad wax badan uga ogaato maaraynta xusuusta iyo madvise(), mawduucan wuxuu leeyahay qalooc waxbarasho oo aad u adag. Markaa haddii aad ku talo jirto inaad si dhab ah ugu wanagsanto, isu diyaari inaad wax akhrido oo tijaabiso dhawr toddobaad ka hor intaadan filanin natiijooyin wanaagsan.

Maxaa la akhriyaa?

Su'aal qabtaa? Ku qor faallooyinka!

Source: www.habr.com

Add a comment