Zvakanakira uye Zvakaipa zveHugePages

Zvakanakira uye Zvakaipa zveHugePages

Dudziro yechinyorwa chakagadzirirwa vadzidzi vekosi "Linux Administrator".

Pakutanga, ndakataura nezve maitiro ekuyedza uye kugonesa Hugepages paLinux.
Ichi chinyorwa chinongobatsira chete kana iwe uine nzvimbo yekushandisa Hugepages. Ndakasangana nevanhu vazhinji vanonyengerwa netarisiro yekuti Hugepages ichavandudza kugadzirwa nemashiripiti. Nekudaro, hombepaging inyaya yakaoma uye inogona kuderedza mashandiro kana ikashandiswa zvisizvo.

Chikamu 1: Kuona kuti mapeji makuru anogoneswa paLinux (yekutanga pano)

Dambudziko:
Iwe unofanirwa kutarisa kana HugePages yakagoneswa pane yako system.

mhinduro:
Zviri nyore:

cat /sys/kernel/mm/transparent_hugepage/enabled

Iwe uchawana chimwe chinhu chakadai:

always [madvise] never

Iwe uchaona runyoro rwezvasarudzo zviripo (nguva dzose, kupenga, kwete), uye sarudzo iripo parizvino ichavharirwa mumaparentheses (nekusarudzika madvise).

madvise zvinoreva kuti transparent hugepages inogoneswa chete kunzvimbo dzekurangarira dzinokumbira zvakajeka mapeji makuru uchishandisa madhivisi(2).

nguva dzose zvinoreva kuti transparent hugepages nguva dzose inogoneswa kune ese maitiro. Izvi zvinowanzovandudza mashandiro, asi kana uine kese yekushandisa uko maitiro mazhinji ari kudya diki ndangariro, ipapo iyo yese yekurangarira mutoro inogona kuwedzera zvakanyanya.

haana zvinoreva kuti transparent hugepages haipindirwe kunyangwe ikakumbirwa uchishandisa madvise. Kuti uzive zvakawanda, bata zvinyorwa Linux kernels.

Maitiro ekushandura kukosha kweiyo default

Sarudzo 1: Shandura zvakananga sysfs (mushure mekutangazve paramende ichadzokera kune yayo default kukosha):

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

Sarudzo 2: Shandura iyo default sisitimu nekudzorera kernel ine yakagadziridzwa gadziriso (iyi sarudzo inokurudzirwa chete kana uri kushandisa tsika kernel):

  • Kuseta nguva dzose nekukasira, shandisa:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Kuseta madvise seyakagadzika, shandisa:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Chikamu 2: Zvakanakira uye Zvakaipa zveHugePages

Tichaedza kusarudza kutsanangura zvakanakira, zvisingabatsiri uye zvinogona kuitika pakushandisa Hugepages. Sezvo chinyorwa chetekinoroji chakaomarara uye chepedantic chingangove chakaoma kunzwisisa kune vanhu vanonyengerwa mukufunga Hugepages iri panacea, ini ndichapira chokwadi kuti zvive nyore. Zvakakodzera kuyeuka kuti mizhinji yemisoro yakaoma uye nekudaro yakarerutswa zvakanyanya.

Ndokumbira utarise kuti tiri kutaura nezve 64-bit x86 masisitimu ari kuita Linux, uye kuti ndiri kungofungidzira kuti sisitimu inotsigira akajeka mapeji (sezvo isiri iyo yakaipa kuti mapeji mahombe haana kunyorwa pamusoro), sezvazviri munenge chero yemazuva ano Linux. zvakatipoteredza.

Ini ndichabatanidza imwe hunyanzvi tsananguro mune zvinongedzo pazasi.

Virtual Memory

Kana iwe uri C++ programmer, unoziva kuti zvinhu zviri mundangariro zvine kero chaiyo (pointer values).

Nekudaro, kero idzi hadzingoratidzi kero dzemuviri mundangariro (RAM kero). Ivo vanomiririra kero mune chaiyo ndangariro. Iyo processor ine yakakosha MMU (memory manejimendi unit) iyo inobatsira iyo kernel mepu chaiyo yekurangarira kunzvimbo chaiyo.

Iyi nzira ine zvakawanda zvakanakira, asi iyo inonyanya kukosha ndeye:

  • Performance (nekuda kwezvikonzero zvakasiyana);
  • Kuparadzaniswa kwepurogiramu, ndiko kuti, hapana purogiramu inogona kuverenga kubva mundangariro yeimwe purogiramu.

Mapeji chii?

Virtual memory yakakamurwa kuita mapeji. Peji yega yega inonongedza kune chaiyo ndangariro yemuviri, inogona kunongedza kune imwe nzvimbo mu RAM, kana inogona kunongedzera kukero yakapihwa kumudziyo wenyama, senge vhidhiyo kadhi.

Mazhinji emapeji aunobata nawo angave anonongedza RAM kana akachinjika, zvichireva kuti anochengetwa pane yako hard drive kana SSD. Iyo kernel inobata chimiro chechimiro chepeji rega rega. Kana peji yakasvibiswa yawanikwa, kernel inomisa tambo iri kuyedza kuwana ndangariro, inoverenga peji kubva kune hard drive/SSD kupinda RAM, uye yoenderera mberi nekuita tambo.

Iyi nzira inobuda pachena, zvichireva kuti haingoverenge zvakananga kubva kuHDD/SSD. Saizi yemapeji akajairwa ndeye 4096 bytes. Hugepages size i2 megabytes.

Shanduro-inosanganisa buffer (TLB)

Kana chirongwa chikawana peji rendangariro, iyo CPU inofanirwa kuziva kuti ndeipi peji yekuverenga data kubva (kureva, kuve nemepu yekero chaiyo).

Iyo kernel ine data chimiro (tafura yepeji) ine ruzivo rwese nezvemapeji ari kushandiswa. Uchishandisa iyi data chimiro, unogona mepu chaiyo kero kukero yenzvimbo.

Nekudaro, iyo tafura yepeji yakaoma uye inononoka, saka isu hatigone kuongorora iyo yese data chimiro pese apo maitiro anowana ndangariro.

Neraki, processor yedu ine TLB inobata mepu pakati pemakero chaiwo uye epanyama. Izvi zvinoreva kuti kunyangwe isu tichida kupatsanura tafura yepeji pakuedza kwekutanga kuwana, zvese zvinotevera zvinopinda peji zvinogona kubatwa muTLB, zvichibvumira kushanda nekukurumidza.

Nekuti iyo inoshandiswa sechishandiso chemuviri (izvo zvinoita kuti ikurumidze pakutanga), kugona kwayo kunogumira. Saka kana iwe uchida kuwana mamwe mapeji, iyo TLB haizokwanisa kuchengeta mepu kune ese, zvichiita kuti chirongwa chako chifambe zvishoma.

Hugepages anouya kuzonunura

Saka chii chatingaite kudzivirira TLB kufashukira? (Isu tinofungidzira kuti chirongwa chichiri kuda huwandu hwakafanana hwekurangarira).

Apa ndipo panopinda Hugepages. Panzvimbo pe4096 bytes inoda kungopinda kweTLB imwe chete, imwe yeTLB yekupinda ikozvino inogona kunongedza kune whopping 2 megabytes. Ngatifungei kuti TLB ine 512 zvinyorwa, pano pasina Hugepages tinogona kufananidza:

4096 bβ‹…512=2 MB

Zvino tingaenzanisa sei navo:

2 MBβ‹…512=1 GB

Ichi ndicho chikonzero Hugepages inotyisa. Vanogona kuvandudza zvibereko pasina kushanda nesimba. Asi pane zvakakosha caveats pano.

Hugepages spoofing

Iyo kernel inongotarisa kuti kangani peji rega rega rekurangarira rinoshandiswa. Kana pasina ndangariro yakakwana yemuviri (RAM), kernel ichafamba isinganyanyi kukosha (isingawanzo shandiswa) mapeji kune hard disk kusunungura imwe RAM kune mamwe akakosha mapeji.
Muchidimbu, zvakafanana zvinoshanda kune Hugepages. Nekudaro, iyo kernel inogona chete kuchinjanisa mapeji ese, kwete mabheti ega.

Ngatitii tine chirongwa chakadai:

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

Muchiitiko ichi, kernel ichada kutsiva (kuverenga) yakawanda se2 megabytes yeruzivo kubva kune hard drive/SSD chete kuti iwe uverenge imwe byte. Kana ari mapeji enguva dzose, chete 4096 bytes inoda kuverengwa kubva kune hard drive/SSD.

Naizvozvo, kana hombe peji yakadhindwa, inokurumidza kuverenga kana iwe uchida kuwana iyo peji rese. Izvi zvinoreva kuti kana iwe uri kuyedza kuwana zvisina tsarukano zvikamu zvendangariro uye uchingoverenga akati wandei kilobytes, iwe unofanirwa kushandisa mapeji enguva dzose uye usanetseka nezve chimwe chinhu.

Kune rimwe divi, kana iwe uchida kuwana chikamu chikuru chendangariro zvakateerana, mapeji makuru anovandudza mashandiro ako. Nekudaro, iwe unofanirwa kuzviyedza iwe pachako (kwete neabstract software) uye ona izvo zvinoshanda nekukurumidza.

Kugoverwa mundangariro

Kana iwe ukanyora C, iwe unoziva kuti unogona kukumbira zvidiki zvidiki (kana zvakakura zvisingaite) huwandu hwendangariro kubva pamurwi uchishandisa malloc(). Ngatiti iwe unoda 30 bytes yendangariro:

char* mymemory = malloc(30);

Kumugadziri wepurogiramu, zvinogona kuita sekuti uri "kukumbira" 30 bytes yendangariro kubva kune inoshanda sisitimu uye kudzosera chinongedzo kune imwe chaiyo ndangariro. Asi chaizvoizvo malloc () ingori basa reC rinofona kubva mukati mebasa brk uye sbrk kukumbira kana kusunungura ndangariro kubva kune inoshanda sisitimu.

Nekudaro, kukumbira kuwanda uye kuwanda ndangariro kune yega yega kugoverwa hakuna kunaka; zvinokwanisika kuti chimwe chikamu chendangariro chakatosunungurwa (free()), uye tinogona kuishandisa zvakare. malloc() inoshandisa maalgorithms akaoma kunzwisisa ekushandisa zvakare yakasunungurwa memory.

Panguva imwecheteyo, zvese zvinoitika zvisingaonekwe kwauri, saka nei zvichikunetsa iwe? Asi nekuda kwedambudziko free() hazvireve izvozvo ndangariro inodzoserwa nekukurumidza kune inoshanda sisitimu.

Pane chinhu chakadai sekuparadzana kwendangariro. Muzviitiko zvakanyanyisa, kune mirwi mirwi inongoshandiswa mabheti mashoma, nepo zvese zviri pakati zvakasunungurwa. (free()).

Ndokumbira utarise kuti kupatsanurwa kwendangariro inyaya yakaomesesa, uye kunyangwe shanduko diki pachirongwa dzinogona kukanganisa zvakanyanya. Muzviitiko zvakawanda, zvirongwa hazvizokonzerese kuparadzaniswa kwendangariro, asi iwe unofanirwa kuziva kuti kana paine dambudziko nekutsemuka mune imwe nzvimbo yemurwi, mapeji makuru anogona kuita kuti mamiriro acho anyanye kuwedzera.

Kusarudza kushandiswa kwemapeji makuru

Mushure mekuverenga chinyorwa ichi, waona kuti ndezvipi zvikamu zvechirongwa chako zvinogona kubatsirwa nekushandisa mapeji makuru uye izvo zvisingakwanisi. Saka mapeji makuru anofanira kugoneswa zvachose here?

Sezvineiwo unogona kushandisa madvise()kugonesa mapeji makuru chete kune idzo nzvimbo dzendangariro uko kwaizobatsira.

Kutanga, tarisa kuti mapeji makuru ari kushanda mu madvise () maitiro uchishandisa mirayiridzo panotanga nyaya.

Zvadaro, shandisa madvise()kuudza kernel chaipo pekushandisa mapeji makuru.

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

Ziva kuti iyi nzira ingori zano kune kernel pamaitiro ekugadzirisa ndangariro. Izvi hazvireve kuti kernel ichashandisa otomatiki mapeji makuru kune yakapihwa ndangariro.

Tarisa kune zvinyorwa (manpage)madvisekudzidza zvakawanda nezve memory management uye madvise(), chinyorwa ichi chine kudzika kunoshamisa kwekudzidza. Saka kana iwe uchifunga kuita zvakanaka pazviri, gadzirira kuverenga uye kuyedza kwemavhiki mashoma usati watarisira chero mhedzisiro yakanaka.

Zvekuverenga?

Une mubvunzo? Nyora mumashoko!

Source: www.habr.com

Voeg