Ukuguqulelwa kwenqaku kulungiselelwe abafundi bekhosi
Ngaphambili, bendithetha ngendlela yokuvavanya kunye nokwenza i-Hugepages kwiLinux.
Eli nqaku liza kuba luncedo kuphela ukuba unendawo yokusebenzisa ii-Hugepages. Ndidibene nabantu abaninzi abakhohliswayo ngethemba lokuba i-Hugepages iya kuphucula imveliso ngomlingo. Nangona kunjalo, ukwenza amaphepha amakhulu sisihloko esintsonkothileyo kwaye sinokuthoba umgangatho wokwenziwa komsebenzi ukuba sisetyenziswe ngokungachanekanga.
Icandelo 1: Ukuqinisekisa ukuba amaphepha amakhulu avuliwe kwiLinux (eyokuqala apha )
Ingxaki:
Kufuneka ujonge ukuba i-HugePages yenziwe yasebenza kwindlela yakho.
Isixazululo:
Ilula kakhulu:
cat /sys/kernel/mm/transparent_hugepage/enabled
Uya kufumana into efana nale:
always [madvise] never
Uya kubona uluhlu lwezinto ezikhoyo (njalo, geza, soze), kwaye ukhetho olusebenzayo ngoku luya kufakwa kwizibiyeli (ngokungagqibekanga cebisa).
cebisa kuthetha ukuba transparent hugepages
yenziwe kuphela kwindawo zenkumbulo ezicela ngokucacileyo amaphepha amakhulu kusetyenziswa
rhoqo kuthetha ukuba transparent hugepages
isoloko yenziwe kuzo zonke iinkqubo. Oku ngokuqhelekileyo kuphucula ukusebenza, kodwa ukuba unemeko yokusetyenziswa apho iinkqubo ezininzi zidla inani elincinci lememori, ngoko umthwalo wememori jikelele unokunyuka kakhulu.
ze kuthetha ukuba transparent hugepages
ayizukufakwa naxa iceliwe kusetyenziswa i-madvise. Ukufumana ngakumbi, qhagamshelana
Ulitshintsha njani ixabiso elimiselweyo
Ikhetho 1: Utshintshe ngokuthe ngqo sysfs
(emva kokuqalisa kwakhona iparameter iya kubuyela kwixabiso layo elingagqibekanga):
echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabled
Ikhetho 2: Tshintsha inkqubo engagqibekanga ngokuphinda uqokelele ikernel ngoqwalaselo oluguquliweyo (olu khetho luyacetyiswa kuphela ukuba usebenzisa ikernel yesiko):
- Ukuseta rhoqo ngokungagqibekanga, sebenzisa:
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
- Ukuseta i-madvise njengento ehlala ikho, sebenzisa:
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
Icandelo 2: Izinto eziluncedo kunye nokungalunganga kwe-HugePages
Siza kuzama ukucacisa ngokukhetha iingenelo, ukungonakali kunye nemigibe enokwenzeka yokusebenzisa ii-Hugepages. Kuba inqaku letekhnoloji entsonkothileyo kunye ne-pedantic kuya kuba nzima ukuliqonda kubantu abakhohliswe ekucingeni ukuba i-Hugepages yipanacea, ndiya kuncama ukuchaneka ukuze kube lula. Kufanelekile ukukhumbula ukuba izihloko ezininzi zintsonkothile ngokwenene kwaye ke zenziwe lula kakhulu.
Nceda uqaphele ukuba sithetha nge-64-bit x86 iinkqubo eziqhuba i-Linux, kwaye ndicinga nje ukuba inkqubo ixhasa amaphepha amakhulu acacileyo (kuba ingeyongxaki ukuba amaphepha amakhulu akabhalwa ngaphezulu), njengoko kunjalo phantse kuyo nayiphi na iLinux yanamhlanje. okusingqongileyo.
Ndiza kuncamathelisa inkcazo yobugcisa kwiikhonkco ezingezantsi.
Imemori ebonakalayo
Ukuba ungumdwelisi weC ++, uyazi ukuba izinto ezikwimemori zineedilesi ezithile (amaxabiso esalathisi).
Nangona kunjalo, ezi dilesi azibonakalisi iidilesi zendawo kwimemori (iidilesi ze-RAM). Bamele iidilesi kwimemori ebonakalayo. Umqhubekekisi uneMMU ekhethekileyo (iyunithi yolawulo lwememori) imodyuli enceda imephu yekernel yememori ebonakalayo kwindawo ebonakalayo.
Le ndlela ineengenelo ezininzi, kodwa ezona zibalulekileyo zezi:
- Ukusebenza (ngenxa yezizathu ezahlukeneyo);
- Ukwahlulwa kwenkqubo, oko kukuthi, akukho nkqubo inokufunda kwinkumbulo yenye inkqubo.
Yintoni amaphepha?
Imemori ebonakalayo yahlulwe yangamaphepha. Iphepha ngalinye likhomba kwimemori ethile yomzimba, inokukhomba indawo kwi-RAM, okanye inokukhomba idilesi eyabelwe isixhobo somzimba, njengekhadi levidiyo.
Uninzi lwamaphepha ojongana nawo nokuba linqaku ukuya kwi-RAM okanye litshintshiwe, lithetha ukuba ligcinwe kwi-hard drive yakho okanye kwi-SSD. I-kernel ilawula uyilo olubonakalayo lwephepha ngalinye. Ukuba iphepha le-spoofed liyafikeleleka, i-kernel imisa intambo ezama ukufikelela kwimemori, ifunde iphepha kwi-hard drive / SSD ukuya kwi-RAM, kwaye iqhubekile iphumeza intambo.
Le nkqubo ingumsinga obala, oku kuthetha ukuba ayifundi ngokuthe ngqo kwi-HDD/SSD. Ubungakanani bamaphepha aqhelekileyo yi-4096 bytes. Ubungakanani bamaphepha amakhulu ziimegabytes ezi-2.
Uguqulo-olunxulumanisa isithinteli (TLB)
Xa inkqubo ifikelela kwiphepha lememori, i-CPU kufuneka yazi ukuba leliphi iphepha lomzimba ukufunda idatha ukusuka (oko kukuthi, ube nemephu yedilesi ebonakalayo).
I-kernel inolwakhiwo lwedatha (itafile yephepha) equlethe lonke ulwazi malunga namaphepha asetyenziswayo. Ukusebenzisa olu lwakhiwo lwedatha, unokwenza imephu yedilesi yenyani kwidilesi yendawo.
Nangona kunjalo, itheyibhile yephepha inzima kwaye iyacotha, ngoko asinako ukuhlalutya lonke ulwakhiwo lwedatha lonke ixesha inkqubo ifikelela kwimemori.
Ngethamsanqa, iprosesa yethu ine-TLB egcina imephu phakathi kweedilesi zenyani kunye nezomzimba. Oku kuthetha ukuba nangona kufuneka sihlalutye itheyibhile yephepha kumzamo wokuqala wokufikelela, konke ukufikelela okulandelayo kwiphepha kunokuphathwa kwi-TLB, ukuvumela ukusebenza ngokukhawuleza.
Ngenxa yokuba iphunyezwa njengesixhobo somzimba (esenza ukuba sikhawuleze kwasekuqaleni), umthamo wayo ulinganiselwe. Ke ukuba ufuna ukufikelela kumaphepha amaninzi, iTLB ayizukwazi ukugcina imaphu yazo zonke, ibangela ukuba inkqubo yakho iqhube kancinci.
Amaphepha amakhulu aza kuhlangula
Yintoni ke esinokuyenza ukunqanda ukuphuphuma kwe-TLB? (Sicinga ukuba inkqubo isafuna inani elifanayo lememori).
Kulapho i-Hugepages ingena khona. Endaweni ye-4096 bytes efuna ukungena kwe-TLB enye, ungeno lwe-TLB enye ngoku lungakhomba kwi-2 ye-megabytes ekhuphayo. Makhe sicinge ukuba iTLB inamangeniso angama-512, apha ngaphandle kwamaphepha amakhulu esinokuwafanisa:
4096 bβ
512=2 MB
Ngoko sinokuthelekisa njani nabo:
2 MBβ
512=1 GB
Kungenxa yoko le nto i-Hugepages ilungile. Banokuphucula imveliso ngaphandle komgudu omkhulu. Kodwa kukho izilumkiso ezibalulekileyo apha.
Amaphepha amakhulu e-spoofing
Ikernel ijonga ngokuzenzekelayo ukuba iphepha ngalinye lememori lisetyenziswa kangakanani. Ukuba akukho nkumbulo yaneleyo yomzimba (i-RAM), i-kernel iya kuhamba ingabalulekanga (engaphantsi kokusetyenziswa rhoqo) amaphepha kwi-hard disk ukukhulula i-RAM ethile kumaphepha abaluleke kakhulu.
Ngokomgaqo, okufanayo kusebenza kwi-Hugepages. Nangona kunjalo, i-kernel inokutshintsha kuphela amaphepha apheleleyo, hayi i-bytes nganye.
Masithi sinenkqubo efana nale:
char* mymemory = malloc(2*1024*1024); // ΠΠΎΠ·ΡΠΌΠ΅ΠΌ ΡΡΠΎ Π·Π° ΠΎΠ΄Π½Ρ Hugepage!
// ΠΠ°ΠΏΠΎΠ»Π½ΠΈΠΌ mymemory ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½ΡΠΌΠΈ
// Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈΡ
Π²Π΅ΡΠ΅ΠΉ,
// ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅ ΡΡΡΠ°Π½ΠΈΡΡ mymemory
// ...
// ΠΠ°ΠΏΡΠΎΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ Π±Π°ΠΉΡΡ
putchar(mymemory[0]);
Kulo mzekelo, i-kernel iyakufuna ukubuyisela (ukufunda) kangangoko kwi-2 megabytes yolwazi kwi-hard drive/SSD nje ukuba ufunde i-byte enye. Ngokuphathelele amaphepha aqhelekileyo, kuphela i-4096 bytes kufuneka ifundwe kwi-hard drive / SSD.
Ke ngoko, ukuba iphepha elikhulu libhalwe ngaphezulu, liyakhawuleza ukufunda ukuba ufuna ukufikelela kulo lonke iphepha. Oku kuthetha ukuba uzama ukufikelela ngokungenamkhethe kwiindawo ezahlukeneyo zememori kwaye ufunda nje iikhilobhayithi ezimbalwa, kufuneka usebenzise amaphepha aqhelekileyo kwaye ungakhathazeki ngayo nantoni na eyenye.
Kwelinye icala, ukuba ufuna ukufikelela kwindawo enkulu yememori ngokulandelelana, amaphepha amakhulu aya kuphucula ukusebenza kwakho. Nangona kunjalo, kufuneka uzivavanye ngokwakho (kungekhona ngesoftware engabonakaliyo) kwaye ubone oko kusebenza ngokukhawuleza.
Ulwabiwo kwinkumbulo
Ukuba ubhala i-C, uyazi ukuba ungacela ngokungenasizathu i-akhawunti encinci (okanye iphantse ibe nkulu ngokungenasizathu) imali yenkumbulo esuka kwimfumba usebenzisa. malloc()
. Masithi ufuna iibytes ezingama-30 zememori:
char* mymemory = malloc(30);
Kumdwelisi wenkqubo, kunokubonakala ngathi "ucela" iibytes ezingama-30 zememori kwinkqubo yokusebenza kwaye ubuyisela isalathisi kwimemori ethile. Kodwa eneneni malloc ()
ngumsebenzi we C ofowunela ngaphakathi komsebenzi
Nangona kunjalo, ukucela imemori engaphezulu nangaphezulu kwisabelo ngasinye akuphumelelanga; kusenokwenzeka ukuba elinye icandelo lememori sele likhululiwe (free())
, kwaye sinokuphinda siyisebenzise. malloc()
sebenzisa iialgorithms ezintsonkothileyo zokuphinda usebenzise inkumbulo ekhululweyo.
Kwangaxeshanye, yonke into yenzeka ungaqatshelwanga kuwe, ngoko kutheni kufuneka ikukhathaze? Kodwa ngenxa yomngeni free()
ayithethi loo nto
Kukho into efana nokuqhekeka kwememori. Kwiimeko ezigqithisileyo, kukho iisegmenti zemfumba apho kusetyenziswa iibytes ezimbalwa, ngelixa yonke into ephakathi ikhululiwe. (free())
.
Nceda uqaphele ukuba ukwahlukana kwememori sisihloko esinzima kakhulu, kwaye notshintsho oluncinci kwinkqubo lunokuba nefuthe elibalulekileyo. Kwiimeko ezininzi, iinkqubo aziyi kubangela ukuhlukana okukhulu kweememori, kodwa kufuneka uqaphele ukuba ukuba kukho ingxaki ngokuhlukana kwindawo ethile yemfumba, amaphepha amakhulu angenza imeko ibe mandundu.
Ukusetyenziswa okukhethiweyo kwamaphepha amakhulu
Emva kokufunda eli nqaku, unqume ukuba zeziphi iindawo zenkqubo yakho ezinokuxhamla ekusebenziseni amaphepha amakhulu kwaye ezingenakho. Ke ngaba amaphepha amakhulu kufuneka avulwe kwaphela?
Ngethamsanqa ungasebenzisa madvise()
ukwenza amaphepha amakhulu kuphela kwezo ndawo zenkumbulo apho zinokuba luncedo.
Kuqala, khangela ukuba amakhasi amakhulu ayasebenza kwimowudi ye-madvise () usebenzisa
Emva koko, sebenzisa madvise()
ukuxelela i-kernel ngqo apho izakusetyenziswa khona amaphepha 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 ukuba le ndlela yingcebiso kwi-kernel ngendlela yokulawula imemori. Oku akuthethi ukuba i-kernel izakusebenzisa ngokuzenzekelayo amaphepha amakhulu kwimemori enikiweyo.
Jonga kumaxwebhu madvise()
, esi sihloko sinegophe lokufunda elingumnqantsa ngokumangalisayo. Ke ukuba ujonge ukwenza kakuhle kuyo, lungiselela ukufunda kwaye uvavanye iiveki ezimbalwa ngaphambi kokuba ulindele naziphi na iziphumo ezilungileyo.
Yintoni efundwayo?
Inqaku le-IBM OpenStack kumaphepha amakhulu Amaphepha amakhulu abonakalayo xa ethelekiswa namaphepha amakhulu angacacanga Inqaku leWikipedia malunga neTLB Uxwebhu lwe-Linux kernel kumaphepha amakhulu abonakalayo I-StackOverflow: Amaphepha amakhulu aqhelene nokuqhekeka kwememori Inqaku leMicrosoft kulawulo lwenkumbulo ebonakalayo
Unombuzo? Bhala kwizimvo!
umthombo: www.habr.com