Mga Kaayohan ug Kakulangan sa HugePages

Mga Kaayohan ug Kakulangan sa HugePages

Paghubad sa artikulo nga giandam alang sa mga estudyante sa kurso "Linux Administrator".

Kaniadto, naghisgot ako kung giunsa pagsulay ug pagpagana ang Hugepage sa Linux.
Mapuslan lang kini nga artikulo kung naa gyud kay lugar nga magamit ang Hugepages. Daghan kog nahimamat nga mga tawo nga nalimbongan sa palaaboton nga ang Hugepages makapausbaw sa pagka-produktibo. Bisan pa, ang dako nga paging usa ka komplikado nga hilisgutan ug mahimo’g madaot ang pasundayag kung gigamit nga dili husto.

Bahin 1: Pagtino nga ang dagkong mga panid gipalihok sa Linux (orihinal dinhi)

Problema:
Kinahanglan nimo nga susihon kung ang HugePages gipalihok sa imong sistema.

solusyon:
Kini yano ra:

cat /sys/kernel/mm/transparent_hugepage/enabled

Makuha nimo ang usa ka butang nga sama niini:

always [madvise] never

Makita nimo ang usa ka lista sa magamit nga mga kapilian (kanunay, madvise, dili), ug ang kasamtangang aktibo nga opsyon ibutang sa parentesis (sa default madvise).

madvise nagpasabut nga transparent hugepages gi-enable lamang alang sa mga lugar sa panumduman nga tin-aw nga naghangyo sa mga dagkong panid nga gigamit madvise(2).

kanunay nagpasabut nga transparent hugepages kanunay nga mahimo alang sa tanan nga mga proseso. Kini kasagarang makapauswag sa pasundayag, apan kung ikaw adunay usa ka kaso sa paggamit diin daghang mga proseso ang nagaut-ut sa gamay nga panumduman, nan ang kinatibuk-ang karga sa panumduman mahimong modaghan pag-ayo.

dili gayud nagpasabut nga transparent hugepages dili iapil bisan kung gihangyo gamit ang madvise. Aron mahibal-an ang dugang, kontaka dokumentasyon Linux kernels.

Giunsa pagbag-o ang default nga kantidad

Pagpili 1: Direktang pagbag-o sysfs (human sa pag-reboot ang parameter mobalik sa default nga kantidad niini):

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

Pagpili 2: Usba ang sistema sa default pinaagi sa pag-compile pag-usab sa kernel gamit ang giusab nga configuration (kini nga opsyon girekomendar lang kung naggamit ka ug custom kernel):

  • Aron itakda kanunay pinaagi sa default, gamita ang:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Aron ibutang ang madvise isip default, gamita ang:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Bahin 2: Mga Kaayohan ug Kakulangan sa Dakong Panid

Atong sulayan nga pilion nga ipatin-aw ang mga bentaha, disbentaha ug posible nga mga lit-ag sa paggamit sa Hugepage. Tungod kay ang usa ka teknolohikal nga komplikado ug pedantic nga artikulo lagmit lisud sabton alang sa mga tawo nga nalimbongan sa paghunahuna nga ang Hugepages usa ka panacea, akong isakripisyo ang katukma alang sa kayano. Angayan lang nga hinumdoman nga daghang mga hilisgutan ang labi ka komplikado ug busa gipasimple kaayo.

Palihug timan-i nga naghisgut kami mahitungod sa 64-bit x86 nga mga sistema nga nagpadagan sa Linux, ug nga ako nag-ingon nga ang sistema nagsuporta sa transparent nga dagkong mga panid (tungod kay kini dili usa ka disbentaha nga ang mga dagkong panid dili ma-overwritten), sama sa kaso sa halos bisan unsang modernong Linux. palibot.

Ilakip ko ang dugang nga teknikal nga paghulagway sa mga link sa ubos.

Virtual nga Memorya

Kung ikaw usa ka C++ programmer, nahibal-an nimo nga ang mga butang sa memorya adunay piho nga mga adres (pointer values).

Bisan pa, kini nga mga adres dili kinahanglan magpakita sa pisikal nga mga adres sa memorya (mga adres sa RAM). Kini nagrepresentar sa mga adres sa virtual memory. Ang processor adunay espesyal nga MMU (memory management unit) nga module nga makatabang sa kernel nga mapa ang virtual memory ngadto sa pisikal nga lokasyon.

Kini nga pamaagi adunay daghang mga bentaha, apan ang labing hinungdanon mao ang:

  • Performance (alang sa lain-laing mga rason);
  • Program isolation, nga mao, walay programa nga makabasa gikan sa memorya sa laing programa.

Unsa ang mga panid?

Ang virtual nga memorya gibahin sa mga panid. Ang matag indibidwal nga panid nagpunting sa usa ka piho nga pisikal nga panumduman, mahimo kini magtudlo sa usa ka lugar sa RAM, o mahimo kini magtudlo sa usa ka adres nga gi-assign sa usa ka pisikal nga aparato, sama sa usa ka video card.

Kadaghanan sa mga panid nga imong giatubang bisan unsang punto sa RAM o gipalitan, nagpasabut nga kini gitipigan sa imong hard drive o SSD. Ang kernel nagdumala sa pisikal nga layout sa matag panid. Kung ang usa ka spoofed nga panid ma-access, ang kernel mohunong sa thread nga naningkamot sa pag-access sa memorya, magbasa sa panid gikan sa hard drive/SSD ngadto sa RAM, ug dayon magpadayon sa pagpatuman sa thread.

Kini nga proseso mao ang stream transparent, nagpasabot nga kini dili kinahanglan nga basahon direkta gikan sa HDD/SSD. Ang gidak-on sa normal nga mga panid mao ang 4096 bytes. Ang gidak-on sa dako nga page 2 megabytes.

Translation-associative buffer (TLB)

Kung ang usa ka programa maka-access sa usa ka panid sa memorya, ang CPU kinahanglan mahibal-an kung unsang pisikal nga panid ang basahon gikan sa datos (nga mao, adunay usa ka virtual address map).

Ang kernel adunay istruktura sa datos (panid nga lamesa) nga adunay tanan nga kasayuran bahin sa mga panid nga gigamit. Gamit kini nga istruktura sa datos, mahimo nimong mapa ang usa ka virtual nga adres sa usa ka pisikal nga adres.

Bisan pa, ang lamesa sa panid labi ka komplikado ug hinay, mao nga dili naton ma-analisar ang tibuuk nga istruktura sa datos sa matag higayon nga ang usa ka proseso maka-access sa memorya.

Maayo na lang, ang among processor adunay TLB nga nagtago sa pagmapa tali sa virtual ug pisikal nga mga adres. Kini nagpasabot nga bisan og kinahanglan natong i-parse ang page table sa unang pagsulay sa pag-access, ang tanang sunod nga access sa page mahimong madumala sa TLB, nga magtugot sa paspas nga operasyon.

Tungod kay kini gipatuman isip usa ka pisikal nga himan (nga naghimo niini nga paspas sa unang dapit), ang kapasidad niini limitado. Mao nga kung gusto nimo nga maka-access sa daghang mga panid, ang TLB dili makahimo sa pagtipig sa mga mapa alang sa tanan niini, hinungdan nga ang imong programa molihok nga labi ka hinay.

Ang mga Hugpages moabut aron sa pagluwas

Busa unsa ang atong mahimo aron malikayan ang pag-awas sa TLB? (Among gihunahuna nga ang programa nagkinahanglan gihapon sa samang gidaghanon sa memorya).

Dinhi diin moabut ang Hugpages. Inay sa 4096 bytes nga nagkinahanglan lang og usa ka TLB entry, ang usa ka TLB entry mahimo na nga magtudlo sa usa ka dako nga 2 megabytes. Ibutang nato nga ang TLB adunay 512 ka entries, dinhi nga walay Hugepages atong maparehas:

4096 bβ‹…512=2 MB

Unya unsaon nato pagtandi kanila:

2 MBβ‹…512=1 GB

Mao kini ang hinungdan nga ang Hugepages katingad-an. Mapauswag nila ang pagka-produktibo nga wala’y daghang paningkamot. Apan adunay hinungdanon nga mga pasidaan dinhi.

Hugepages spoofing

Awtomatiko nga gimonitor sa kernel kung unsa ka sagad gigamit ang matag panid sa memorya. Kung walay igo nga pisikal nga panumduman (RAM), ang kernel mobalhin sa dili kaayo importante (dili kaayo kanunay gamiton) nga mga panid ngadto sa hard disk aron mapagawas ang pipila ka RAM alang sa mas importante nga mga panid.
Sa prinsipyo, ang sama nga magamit sa Hugepages. Bisan pa, ang kernel mahimo ra magbaylo sa tibuuk nga mga panid, dili indibidwal nga mga byte.

Ingnon ta nga kita adunay usa ka programa nga sama niini:

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

Niini nga kaso, ang kernel kinahanglan nga mag-ilis (magbasa) kutob sa 2 megabytes nga impormasyon gikan sa hard drive/SSD para lang nimo mabasa ang usa ka byte. Sama sa alang sa regular nga mga panid, 4096 ka byte ra ang kinahanglan basahon gikan sa hard drive / SSD.

Busa, kung ang dako nga panid ma-overridden, mas paspas nga basahon kung kinahanglan nimo nga ma-access ang tibuuk nga panid. Kini nagpasabot nga kon ikaw naningkamot sa random access sa lain-laing mga bahin sa memorya ug nagbasa lang sa usa ka magtiayon nga sa kilobytes, kamo kinahanglan nga mogamit sa regular nga mga panid ug dili mabalaka mahitungod sa bisan unsa nga butang.

Sa laing bahin, kung kinahanglan nimo nga ma-access ang daghang bahin sa panumduman nga sunud-sunod, ang dagkong mga panid makapauswag sa imong pasundayag. Bisan pa, kinahanglan nimo nga sulayan kini sa imong kaugalingon (dili gamit ang abstract software) ug tan-awa kung unsa ang molihok nga mas paspas.

Alokasyon sa memorya

Kung imong isulat ang C, nahibal-an nimo nga mahimo kang mohangyo og gamay (o halos arbitraryong dako) nga kantidad sa memorya gikan sa tambak gamit ang malloc(). Ingnon ta nga kinahanglan nimo ang 30 bytes nga memorya:

char* mymemory = malloc(30);

Alang sa usa ka programmer, mahimong makita nga ikaw "naghangyo" sa 30 ka bytes nga memorya gikan sa operating system ug nagbalik sa usa ka pointer sa pipila ka virtual memory. Pero sa tinuod lang malloc () usa lang ka C function nga nagtawag gikan sa sulod sa function brk ug sbrk sa paghangyo o libre nga memorya gikan sa operating system.

Bisan pa, ang paghangyo ug dugang nga memorya alang sa matag alokasyon dili epektibo; lagmit nga ang pipila ka bahin sa memorya napagawas na (free()), ug magamit nato kini pag-usab. malloc() nagpatuman sa medyo komplikado nga mga algorithm alang sa paggamit pag-usab sa libre nga memorya.

Sa samang higayon, ang tanan mahitabo nga wala nimo mamatikdi, busa nganong mabalaka man kini kanimo? Apan tungod kay ang hagit free() wala magpasabot niana ang memorya kinahanglan nga ibalik dayon sa operating system.

Adunay usa ka butang sama sa memory fragmentation. Sa grabe nga mga kaso, adunay mga pundok sa mga bahin diin pipila ra ka byte ang gigamit, samtang ang tanan nga naa sa taliwala gipagawas. (free()).

Palihug timan-i nga ang memory fragmentation usa ka hilabihan ka komplikado nga hilisgutan, ug bisan ang ginagmay nga mga kausaban sa usa ka programa mahimong adunay dakong epekto. Sa kadaghanan nga mga kaso, ang mga programa dili magpahinabog hinungdanon nga pagkabahinbahin sa panumduman, apan kinahanglan nimong mahibal-an nga kung adunay problema sa pagkabahinbahin sa pipila nga mga lugar sa pundok, ang mga dagkong panid mahimong makapasamot sa kahimtang.

Pinili nga paggamit sa dagkong mga panid

Pagkahuman sa pagbasa niini nga artikulo, nahibal-an nimo kung unsang mga bahin sa imong programa ang makabenepisyo gikan sa paggamit sa mga dagkong panid ug kung diin dili. Mao nga kinahanglan ba nga mapalihok ang mga dagkong panid?

Swerte kay magamit nimo madvise()aron mahimo ang dako nga paging alang lamang sa mga lugar nga memorya kung diin kini mapuslanon.

Una, susiha nga ang mga dagkong panid nagdagan sa madvise() mode gamit mga instruksyon sa sinugdanan sa artikulo.

Unya, gamita madvise()aron isulti sa kernel kung asa gamiton ang mga dagkong panid.

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

Timan-i nga kini nga pamaagi yano nga tambag sa kernel kung giunsa pagdumala ang memorya. Wala kini magpasabot nga ang kernel awtomatik nga mogamit ug dagkong mga panid alang sa gihatag nga memorya.

Tan-awa ang dokumentasyon (manpage)madvisearon makat-on pa bahin sa pagdumala sa memorya ug madvise(), kini nga hilisgutan adunay usa ka talagsaon nga titip nga kurba sa pagkat-on. Mao nga kung gusto nimo nga mahimong maayo kaayo niini, pag-andam sa pagbasa ug pagsulay sa pipila ka mga semana sa dili pa nimo mapaabut ang bisan unsang positibo nga mga sangputanan.

Unsay basahon?

Naa kay pangutana? Isulat sa mga komento!

Source: www.habr.com

Idugang sa usa ka comment