
Ukuhunyushwa kwesihloko okulungiselelwe abafundi bezifundo .
Ngaphambilini ngikhulume ngendlela yokuhlola nokuvula ukusetshenziswa kwe-Hugepages ku Linux.
Lesi sihloko sizoba wusizo kuphela uma unendawo yokusebenzisa i-Hugepages. Ngihlangane nabantu abaningi abakhohliswa ithemba lokuthi i-Hugepages izothuthukisa ukukhiqiza ngomlingo. Kodwa-ke, ukuphequlula amagama amakhulu kuyisihloko esiyinkimbinkimbi futhi kungehlisa izinga lokusebenza uma kusetshenziswe ngokungalungile.
Ingxenye 1: Hlola ukuthi ama-hugepages avuliwe Linux (okwangempela )
Inkinga:
Udinga ukuhlola ukuthi i-HugePages ivuliwe yini ohlelweni lwakho.
Isixazululo:
Kulula kakhulu:
cat /sys/kernel/mm/transparent_hugepage/enabledUzothola okuthile okufana nalokhu:
always [madvise] neverUzobona uhlu lwezinketho ezitholakalayo (njalo, madvise, never), futhi inketho esebenzayo njengamanje izofakwa kubakaki (ngokuzenzakalelayo madvise).
madvise kusho lokho transparent hugepages inikwe amandla kuphela ezindaweni zememori ezicela ngokusobala amakhasi amakhulu zisebenzisa .
njalo kusho lokho transparent hugepages njalo inikwe amandla kuzo zonke izinqubo. Lokhu kuvame ukuthuthukisa ukusebenza, kodwa uma unesimo sokusetshenziswa lapho izinqubo eziningi zisebenzisa inani elincane lenkumbulo, khona-ke umthwalo wenkumbulo uwonke ungakhula kakhulu.
ungalokothi kusho lokho transparent hugepages ngeke ifakwe noma icelwa kusetshenziswa i-madvise. Ukuze uthole okwengeziwe, xhumana izinhlamvu Linux.
Ungalishintsha kanjani inani elizenzakalelayo
Inketho ye-1: Shintsha ngqo sysfs (ngemuva kokuqalisa kabusha ipharamitha izobuyela kunani layo elizenzakalelayo):
echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabledInketho ye-2: Shintsha okumisiwe kwesistimu ngokuphinda uhlanganise i-kernel ngokucushwa okushintshiwe (le nketho inconywa kuphela uma usebenzisa i-kernel yangokwezifiso):
- Ukusetha njalo ngokuzenzakalelayo, sebenzisa:
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y - Ukusetha i-madvise njengokuzenzakalelayo, sebenzisa:
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
Ingxenye 2: Izinzuzo kanye Nobubi be-HugePages
Sizozama ukuchaza ngokukhetha izinzuzo, ukungalungi kanye nezingibe ezingaba khona zokusebenzisa i-Hugepages. Njengoba i-athikili eyinkimbinkimbi yezobuchwepheshe kanye ne-pedantic cishe kuzoba nzima ukuyiqonda kubantu abakhohliswe ekucabangeni ukuthi i-Hugepages iyi-panacea, ngizodela ukunemba ukuze kube lula. Kuhle ukukhumbula ukuthi izihloko eziningi ziyinkimbinkimbi ngempela futhi ngenxa yalokho zenziwe zibe lula kakhulu.
Sicela uqaphele ukuthi sikhuluma ngezinhlelo ze-x86 ezingama-64-bit ezisebenza Linux, nokuthi ngicabanga nje ukuthi uhlelo lusekela ama-hugepages acacile (njengoba kungesona isici ukuthi ama-hugepages awashintshwa), njengoba kunjalo cishe kunoma iyiphi indawo yesimanje. Linux.
Ngizonamathisela incazelo yobuchwepheshe eyengeziwe kuzixhumanisi ezingezansi.
Imemori ebonakalayo
Uma ungumhleli we-C++, uyazi ukuthi izinto ezisenkumbulweni zinamakheli athile (amanani e-pointer).
Kodwa-ke, lawa makheli awabonisi amakheli wendawo kumemori (amakheli e-RAM). Amelela amakheli kumemori ebonakalayo. Iphrosesa inemojula ekhethekile ye-MMU (iyunithi yokuphatha inkumbulo) esiza imephu ye-kernel inkumbulo ebonakalayo endaweni ebonakalayo.
Le ndlela inezinzuzo eziningi, kodwa ezibaluleke kakhulu yilezi:
- Ukusebenza (ngezizathu ezihlukahlukene);
- Ukuhlukaniswa kohlelo, okungukuthi, alukho uhlelo olungafunda kwinkumbulo yolunye uhlelo.
Ayini amakhasi?
Imemori ebonakalayo ihlukaniswe ngamakhasi. Ikhasi ngalinye likhomba kumemori ethile ephathekayo, lingakhomba indawo eku-RAM, noma lingakhomba ikheli elinikezwe idivayisi ephathekayo, njengekhadi levidiyo.
Amakhasi amaningi osebenza nawo akhomba ku-RAM noma ashintshiwe, okusho ukuthi agcinwe kusigcinalwazi sakho noma ku-SSD. I-kernel ilawula ukwakheka kwekhasi ngalinye. Uma kufinyelelwa ikhasi eliyi-spoofed, i-kernel imisa intambo ezama ukufinyelela kumemori, ifunde ikhasi kusuka ku-hard drive/SSD kuya ku-RAM, bese iqhubeka nokukhipha intambo.
Le nqubo ibonakala ngokusakaza, okusho ukuthi ayifundi ngokuqondile ku-HDD/SSD. Usayizi wamakhasi ajwayelekile ngamabhayithi angu-4096. Usayizi wamakhasi amakhulu angama-2 megabytes.
Ibhafa ye-Translation-associative (TLB)
Uma uhlelo lufinyelela ikhasi lememori, i-CPU kufanele yazi ukuthi yiliphi ikhasi lendawo engafunda kulo idatha (okungukuthi, ibe nemephu yekheli elibonakalayo).
I-kernel inesakhiwo sedatha (ithebula lekhasi) eliqukethe lonke ulwazi mayelana namakhasi asetshenziswayo. Usebenzisa lesi sakhiwo sedatha, ungakwazi ukumepha ikheli eliwumbukwane ekhelini lendawo.
Kodwa-ke, ithebula lekhasi liyinkimbinkimbi futhi lihamba kancane, ngakho-ke asikwazi ukuhlaziya sonke isakhiwo sedatha njalo uma inqubo ifinyelela kumemori.
Ngenhlanhla, iphrosesa yethu ine-TLB egcina imephu phakathi kwamakheli abonakalayo nawendawo. Lokhu kusho ukuthi nakuba sidinga ukuhlaziya ithebula lekhasi emzamweni wokuqala wokufinyelela, konke ukufinyelela kwekhasi okulandelayo kungaphathwa ku-TLB, okuvumela ukusebenza ngokushesha.
Ngenxa yokuthi isetshenziswa njengethuluzi eliphathekayo (okwenza isheshe kwasekuqaleni), umthamo wayo ulinganiselwe. Ngakho-ke uma ufuna ukufinyelela amakhasi amaningi, i-TLB ngeke ikwazi ukugcina amamephu wawo wonke, okubangela ukuthi uhlelo lwakho lusebenze kancane kakhulu.
Amakhasi amakhulu ayasiza
Ngakho-ke yini esingayenza ukugwema ukuchichima kwe-TLB? (Sicabanga ukuthi uhlelo lusadinga inani elifanayo lememori).
Yilapho i-Hugepages ingena khona. Esikhundleni samabhayithi angu-4096 adinga ukungena kwe-TLB eyodwa nje, okukodwa kwe-TLB manje kungakhomba kumamegabhayithi angu-2. Ake sicabange ukuthi i-TLB inokufakiwe okungu-512, lapha ngaphandle kwama-Hugepages esingawafanisa:
4096 b⋅512=2 MBKhona-ke singaqhathanisa kanjani nabo:
2 MB⋅512=1 GBYingakho ama-Hugepages emangalisa. Bangakwazi ukuthuthukisa ukukhiqiza ngaphandle komzamo omkhulu. Kodwa kunezixwayiso ezibalulekile lapha.
Ama-spoofing amakhulu
I-kernel igada ngokuzenzakalela ukuthi ikhasi lememori ngalinye lisetshenziswa kangaki. Uma ingekho inkumbulo yomzimba eyanele (i-RAM), i-kernel izohambisa amakhasi angabalulekile (asetshenziswa kancane) ku-hard disk ukuze ikhulule i-RAM ethile kumakhasi abaluleke kakhulu.
Empeleni, okufanayo kuyasebenza kuma-Hugepages. Nokho, i-kernel ingashintsha kuphela amakhasi aphelele, hhayi amabhayithi angawodwana.
Ake sithi sinohlelo olufana nalolu:
char* mymemory = malloc(2*1024*1024); // Возьмем это за одну Hugepage!
// Заполним mymemory какими-либо данными
// Сделаем много других вещей,
// которые приведут к подмене страницы mymemory
// ...
// Запросим доступ только к первому байту
putchar(mymemory[0]); Kulokhu, i-kernel izodinga ukufaka esikhundleni (ifunde) okuningi okungamamegabhayithi angu-2 olwazi olusuka ku-hard drive/SSD ukuze nje ufunde ibhayithi elilodwa. Ngokuqondene namakhasi avamile, amabhayithi angu-4096 kuphela adinga ukufundwa ku-hard drive/SSD.
Ngakho-ke, uma ikhasi elikhulu libhalwe ngaphezulu, liyashesha ukulifunda kuphela uma udinga ukufinyelela lonke ikhasi. Lokhu kusho ukuthi uma uzama ukufinyelela ngokungahleliwe izingxenye ezihlukene zememori futhi ufunda nje amakhilobhayithi ambalwa, kufanele usebenzise amakhasi avamile futhi ungakhathazeki nganoma yini enye.
Ngakolunye uhlangothi, uma udinga ukufinyelela ingxenye enkulu yememori ngokulandelana, amakhasi amakhulu azothuthukisa ukusebenza kwakho. Kodwa-ke, udinga ukuzihlola wena (hhayi nge-software engabonakali) futhi ubone ukuthi yini esebenza ngokushesha.
Ukwabiwa enkumbulweni
Uma ubhala u-C, uyazi ukuthi ungacela amanani enkumbulo amancane (noma acishe abe makhulu ngokungafanele) enqwabeni usebenzisa malloc(). Ake sithi udinga amabhayithi enkumbulo angama-30:
char* mymemory = malloc(30);Kumhleli, kungase kubonakale sengathi "ucela" amabhayithi angu-30 ememori ohlelweni lokusebenza futhi ubuyisela isikhombisi kumemori ethile ebonakalayo. Kodwa empeleni malloc () kuwumsebenzi ka-C nje obiza ngaphakathi kohlelo ukucela noma ukukhulula inkumbulo ohlelweni lokusebenza.
Nokho, ukucela inkumbulo eyengeziwe ngesabelo ngasinye kungasebenzi kahle; kungenzeka kakhulu ukuthi ingxenye ethile yenkumbulo isivele ikhululiwe (free()), futhi singaphinde siyisebenzise. malloc() isebenzisa ama-algorithms ayinkimbinkimbi okusebenzisa kabusha inkumbulo ekhululiwe.
Ngesikhathi esifanayo, yonke into yenzeka ungabonwa wena, ngakho kungani kufanele ikukhathaze? Kodwa ngoba inselele free() akusho lokho .
Kukhona into enjengokuhlukana kwenkumbulo. Ezimweni ezimbi kakhulu, kunezingxenye zenqwaba lapho kusetshenziswa amabhayithi ambalwa kuphela, kuyilapho yonke into ephakathi ikhululiwe. (free()).
Sicela uqaphele ukuthi ukuhlukaniswa kwenkumbulo kuyisihloko esiyinkimbinkimbi ngendlela emangalisayo, futhi ngisho nezinguquko ezincane kuhlelo zingaba nomthelela omkhulu. Ezimweni eziningi, izinhlelo ngeke zibangele ukuhlukana okukhulu kwenkumbulo, kodwa kufanele uqaphele ukuthi uma kunenkinga ngokuhlukana endaweni ethile yenqwaba, amakhasi amakhulu angenza isimo sibe sibi kakhulu.
Ukusetshenziswa okukhethekile kwamakhasi amakhulu
Ngemva kokufunda lesi sihloko, unqume ukuthi yiziphi izingxenye zohlelo lwakho ezingazuza ngokusebenzisa amakhasi amakhulu futhi iziphi ezingakwazi. Ngakho-ke ingabe amakhasi amakhulu kufanele avunyelwe nhlobo?
Ngenhlanhla ungasebenzisa madvise()ukunika amandla ikhasi elikhulu kuphela kulezo zindawo zenkumbulo lapho kungaba usizo khona.
Okokuqala, hlola ukuthi amakhasi amakhulu asebenza ngemodi ye-madvise() usebenzisa ekuqaleni kwesihloko.
Bese, sebenzisa madvise()ukutshela i-kernel ukuthi isetshenziswa kuphi amakhasi amakhulu.
#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)Qaphela ukuthi le ndlela imane iyiseluleko ku-kernel sendlela yokuphatha inkumbulo. Lokhu akusho ukuthi i-kernel izosebenzisa ngokuzenzakalelayo amakhasi amakhulu kumemori enikeziwe.
Bheka imibhalo ukuze ufunde kabanzi mayelana nokuphathwa kwememori futhi madvise(), lesi sihloko sinejika lokufunda eliwumqansa ngendlela emangalisayo. Ngakho-ke uma uhlose ukwenza kahle kakhulu kukho, lungiselela ukufunda nokuhlola amasonto ambalwa ngaphambi kokuba ulindele noma yimiphi imiphumela emihle.
Yini okufanele uyifunde?
Unombuzo? Bhala kumazwana!
Source: www.habr.com
