
Kumasulira kwa nkhani yokonzedwa kwa ophunzira a maphunziro .
Poyamba ndidalankhula za momwe mungayang'anire ndikuyatsira kugwiritsa ntchito Hugepages mu 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: Onetsetsani kuti ma hugepages atsegulidwa Linux (choyambirira )
Vuto:
Muyenera kuyang'ana ngati HugePages yayatsidwa padongosolo lanu.
yankho;
Ndizosavuta:
cat /sys/kernel/mm/transparent_hugepage/enabledMudzapeza zinthu monga izi:
always [madvise] neverMudzawona 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 .
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 ntchito Linux.
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/enabledZosankha 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.
Dziwani kuti tikulankhula za makina a 64-bit x86 omwe akugwira ntchito Linux, ndipo ndikungoganiza kuti dongosololi limathandizira ma hugepages owonekera bwino (popeza si vuto kuti ma hugepages salowe m'malo mwake), monga momwe zilili m'malo ambiri amakono. Linux.
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 MBNdiye tingayerekeze bwanji nawo:
2 MB⋅512=1 GBIchi 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 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 .
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 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 kuti 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
