Ubwino ndi Kuipa kwa HugePages

Ubwino ndi Kuipa kwa HugePages

Kumasulira kwa nkhani yokonzedwa kwa ophunzira a maphunziro "Linux Administrator".

M'mbuyomu, ndidalankhula za momwe mungayesere ndikuyambitsa Hugepages pa Linux.
Nkhaniyi ikhala yothandiza ngati muli ndi malo ogwiritsira ntchito Hugepages. Ndakumana ndi anthu ambiri omwe amapusitsidwa ndi chiyembekezo chakuti Hugepages adzakulitsa zokolola. Komabe, bigpageging ndi mutu wovuta ndipo ukhoza kutsitsa magwiridwe antchito ngati utagwiritsidwa ntchito molakwika.

Gawo 1: Kutsimikizira kuti masamba akuluakulu amayatsidwa pa Linux (oyambirira apa)

Vuto:
Muyenera kuyang'ana ngati HugePages yayatsidwa padongosolo lanu.

yankho;
Ndizosavuta:

cat /sys/kernel/mm/transparent_hugepage/enabled

Mudzapeza zinthu monga izi:

always [madvise] never

Mudzawona mndandanda wa zosankha zomwe zilipo (nthawizonse, misala, ayi), ndipo njira yomwe ikugwiritsidwa ntchito pano idzatsekeredwa m'mabuleki (mwachisawawa madvise).

madvise zikutanthauza kuti transparent hugepages zimangothandizira madera okumbukira omwe amapempha mwatsatanetsatane masamba akuluakulu pogwiritsa ntchito matsenga (2).

nthawizonse zikutanthauza kuti transparent hugepages zimayatsidwa nthawi zonse pamachitidwe onse. Izi nthawi zambiri zimathandizira magwiridwe antchito, koma ngati muli ndi njira yogwiritsira ntchito pomwe njira zambiri zimagwiritsa ntchito kukumbukira pang'ono, ndiye kuti kuchuluka kwa kukumbukira kumatha kuwonjezeka kwambiri.

konse zikutanthauza kuti transparent hugepages sichidzaphatikizidwa ngakhale itafunsidwa pogwiritsa ntchito madvise. Kuti mudziwe zambiri, funsani zolemba Linux kernels.

Momwe mungasinthire mtengo wokhazikika

Zosankha 1: Kusintha mwachindunji sysfs (pambuyo poyambitsanso parameter idzabwerera kumtengo wake wokhazikika):

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

Zosankha 2: Sinthani kusakhazikika kwadongosolo pobweza kernel ndi kasinthidwe kosinthidwa (njira iyi imalimbikitsidwa ngati mukugwiritsa ntchito kernel):

  • Kuti muyike mokhazikika, gwiritsani ntchito:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Kuti muyike madvise ngati osakhazikika, gwiritsani ntchito:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Gawo 2: Ubwino ndi Kuipa kwa HugePages

Tidzayesa kufotokoza mosankha ubwino, kuipa ndi zovuta zomwe zingatheke pogwiritsa ntchito Hugepages. Popeza nkhani yaukadaulo komanso yoyenda pang'onopang'ono ikhala yovuta kumvetsetsa kwa anthu omwe apusitsidwa kuganiza kuti Hugepages ndi mankhwala othana ndi vuto, ndipereka kulondola kuti ndikhale wosavuta. Ndikoyenera kukumbukira kuti mitu yambiri ndi yovuta kwambiri kotero kuti ndiyosavuta kwambiri.

Chonde dziwani kuti tikulankhula za makina a 64-bit x86 omwe akuyendetsa Linux, ndikuti ndikungoganiza kuti makinawa amathandizira masamba akuluakulu owoneka bwino (popeza sizoyipa kuti masamba akulu sanalembedwenso), monga momwe zimakhalira pafupifupi Linux iliyonse yamakono. chilengedwe.

Ndiphatikizanso zambiri zaukadaulo pamalumikizidwe omwe ali pansipa.

Virtual Memory

Ngati ndinu C ++ wolemba mapulogalamu, mukudziwa kuti zinthu zomwe zili pamtima zimakhala ndi maadiresi enieni (ma pointer values).

Komabe, ma adilesi awa samawonetsa maadiresi omwe amakumbukira (maadiresi a RAM). Amayimira ma adilesi mu kukumbukira kwenikweni. Purosesa ili ndi gawo lapadera la MMU (memory management unit) lomwe limathandiza mapu a kernel kukumbukira malo enieni.

Njirayi ili ndi zabwino zambiri, koma zofunika kwambiri ndi izi:

  • Kuchita (pazifukwa zosiyanasiyana);
  • Kudzipatula kwa pulogalamu, ndiko kuti, palibe pulogalamu yomwe ingawerenge kuchokera kukumbukira pulogalamu ina.

Kodi masamba ndi chiyani?

Zokumbukira zenizeni zimagawidwa m'masamba. Tsamba lililonse lililonse limalozera ku kukumbukira kwakuthupi, limatha kuloza malo omwe ali mu RAM, kapena limatha kuloza ku adilesi yomwe yaperekedwa ku chipangizo chakuthupi, monga khadi ya kanema.

Masamba ambiri omwe mumakumana nawo amalozera ku RAM kapena kusinthidwa, kutanthauza kuti amasungidwa pa hard drive yanu kapena SSD. Kernel imayang'anira mawonekedwe a tsamba lililonse. Ngati tsamba la spoofed likupezeka, kernel imayimitsa ulusi womwe ukuyesa kukumbukira, imawerenga tsambalo kuchokera pa hard drive/SSD kupita ku RAM, kenako ndikupitiliza kutulutsa ulusiwo.

Izi ndizowoneka bwino, kutanthauza kuti sizimawerengedwa mwachindunji kuchokera ku HDD/SSD. Kukula kwamasamba abwinobwino ndi 4096 byte. Kukula kwakukulu ndi 2 megabytes.

Translation-associative buffer (TLB)

Pulogalamu ikafika patsamba lokumbukira, CPU iyenera kudziwa tsamba lomwe lingawerenge kuchokera (ndiko kukhala ndi mapu a adilesi).

Kernel ili ndi dongosolo la data (tebulo latsamba) lomwe lili ndi zonse zokhudzana ndi masamba omwe akugwiritsidwa ntchito. Pogwiritsa ntchito dongosolo la datali, mutha kuyika adilesi yeniyeni ku adilesi yanu.

Komabe, tebulo lamasamba ndilovuta kwambiri komanso lochedwa, kotero sitingathe kusanthula ndondomeko yonse ya deta nthawi iliyonse ndondomeko ikafika pamtima.

Mwamwayi, purosesa yathu ili ndi TLB yomwe imasunga mapu pakati pa ma adilesi enieni ndi enieni. Izi zikutanthawuza kuti ngakhale tifunika kufotokozera tebulo la tsambalo poyesa kupeza koyamba, zolowa zonse zotsatila zatsambazi zitha kuyendetsedwa mu TLB, kulola kugwira ntchito mofulumira.

Chifukwa chimagwiritsidwa ntchito ngati chipangizo chakuthupi (chomwe chimapangitsa kuti chikhale chofulumira poyamba), mphamvu yake ndi yochepa. Chifukwa chake ngati mukufuna kupeza masamba ochulukirapo, TLB sidzatha kusunga mapu awo onse, zomwe zimapangitsa kuti pulogalamu yanu iziyenda pang'onopang'ono.

Masamba akuluakulu amabwera kudzapulumutsa

Ndiye titani kuti tipewe TLB kusefukira? (Tikuganiza kuti pulogalamuyi ikufunikabe kukumbukira komweko).

Apa ndipamene Hugepages amabwera. M'malo mwa ma byte 4096 omwe amangofuna kulowa kwa TLB imodzi, kulowa kwa TLB kutha kuloza ku ma megabytes awiri. Tiyerekeze kuti TLB ili ndi zolemba 2, pano popanda Hugepages titha kufanana:

4096 bβ‹…512=2 MB

Ndiye tingayerekeze bwanji nawo:

2 MBβ‹…512=1 GB

Ichi ndichifukwa chake Hugepages ndiyabwino. Amatha kukulitsa zokolola popanda kuchita khama. Koma pali zochenjeza zazikulu apa.

Hugepages spoofing

Kernel imangoyang'anira kangati tsamba lililonse lokumbukira limagwiritsidwa ntchito. Ngati palibe kukumbukira kwakuthupi (RAM), kernel imasuntha masamba osafunikira (osagwiritsidwa ntchito pafupipafupi) kupita ku hard disk kuti amasule RAM pamasamba ofunikira kwambiri.
M'malo mwake, zomwezo zimagwiranso ntchito ku Hugepages. Komabe, kernel imatha kusintha masamba onse, osati ma byte amodzi.

Tiyerekeze kuti tili ndi pulogalamu ngati iyi:

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

Pankhaniyi, kernel iyenera kusintha (kuwerenga) zambiri za 2 megabytes kuchokera pa hard drive/SSD kuti muwerenge baiti imodzi. Ponena za masamba okhazikika, ma byte 4096 okha amafunikira kuwerengedwa kuchokera pa hard drive/SSD.

Chifukwa chake, ngati tsamba lalikulu lalembetsedwa, limangowerenga mwachangu ngati mukufuna kupeza tsamba lonse. Izi zikutanthauza kuti ngati mukuyesera kuti mulowe m'malo osiyanasiyana a kukumbukira ndikungowerenga ma kilobytes angapo, muyenera kugwiritsa ntchito masamba okhazikika osadandaula ndi china chilichonse.

Kumbali ina, ngati mukufuna kupeza gawo lalikulu la kukumbukira motsatizana, masamba akulu amathandizira magwiridwe antchito anu. Komabe, muyenera kudziyesa nokha (osati ndi pulogalamu yachinsinsi) ndikuwona zomwe zimagwira ntchito mwachangu.

Kugawidwa mu kukumbukira

Ngati mulemba C, mukudziwa kuti mutha kupempha makumbukidwe ang'onoang'ono (kapena okulirapo) kuchokera muluwu pogwiritsa ntchito malloc(). Tiyerekeze kuti mukufuna ma 30 byte a kukumbukira:

char* mymemory = malloc(30);

Kwa wopanga mapulogalamu, zitha kuwoneka ngati "mukupempha" ma byte 30 a kukumbukira kuchokera pa opareshoni ndikubwezeretsa cholozera ku kukumbukira kwina. Koma kwenikweni malloc () ndi ntchito ya C yomwe imayitana kuchokera mkati mwa ntchitoyi brk ndi sbrk kupempha kapena kumasula kukumbukira kuchokera ku opaleshoni.

Komabe, kupempha kukumbukira kochulukira pagawo lililonse sikuthandiza; ndizotheka kuti gawo lina la kukumbukira lamasulidwa kale (free()), ndipo tikhoza kuzigwiritsanso ntchito. malloc() imagwiritsa ntchito ma aligorivimu ovuta kugwiritsanso ntchito kukumbukira komasulidwa.

Nthawi yomweyo, zonse zimachitika mosadziwikiratu kwa inu, ndiye chifukwa chiyani ziyenera kuda nkhawa? Koma chifukwa cha zovuta free() sizikutanthauza zimenezo kukumbukira kumabwereranso nthawi yomweyo ku makina opangira.

Pali chinthu chonga kukumbukira kugawanika. Nthawi zambiri, pamakhala milu milu pomwe ma byte ochepa amagwiritsidwa ntchito, pomwe chilichonse chomwe chili pakati chimamasulidwa. (free()).

Chonde dziwani kuti kugawikana kwa kukumbukira ndi mutu wovuta kwambiri, ndipo ngakhale kusintha pang'ono pa pulogalamu kumatha kukhala ndi chiyambukiro chachikulu. Nthawi zambiri, mapulogalamu sangayambitse kugawika kwakukulu kwa kukumbukira, koma muyenera kudziwa kuti ngati pali vuto ndi kugawanika m'dera lina la mulu, masamba akuluakulu angapangitse kuti zinthu zikhale zovuta kwambiri.

Kusankha kugwiritsa ntchito masamba akuluakulu

Pambuyo powerenga nkhaniyi, mwatsimikiza kuti ndi magawo ati a pulogalamu yanu omwe angapindule pogwiritsa ntchito masamba akuluakulu komanso omwe sangathe. Ndiye kodi masamba akulu ayenera kuyatsidwa?

Mwamwayi mungagwiritse ntchito madvise()kuti mutsegule tsamba lalikulu pamakumbukidwe omwe angakhale othandiza.

Choyamba, yang'anani kuti bigpages ikuyenda mu madvise () mode ntchito malangizo kumayambiriro kwa nkhaniyo.

Ndiye, ntchito madvise()kuuza kernel komwe mungagwiritse ntchito masamba akulu.

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

Dziwani kuti njirayi ndi malangizo chabe kwa kernel momwe mungasamalire kukumbukira. Izi sizikutanthauza kuti kernel idzagwiritsa ntchito masamba akulu pamakumbukiro omwe adapatsidwa.

Onani zolembedwa (manpage)madvisekuti mudziwe zambiri za kasamalidwe ka kukumbukira ndi madvise(), mutuwu uli ndi mayendedwe otsetsereka kwambiri. Kotero ngati mukufuna kuchita bwino, konzekerani kuwerenga ndi kuyesa kwa masabata angapo musanayembekezere zotsatira zabwino.

Zoti muwerenge?

Muli ndi funso? Lembani mu ndemanga!

Source: www.habr.com

Kuwonjezera ndemanga