Izinto eziluncedo kunye nokungalunganga kwe-HugePages

Izinto eziluncedo kunye nokungalunganga kwe-HugePages

Ukuguqulelwa kwenqaku kulungiselelwe abafundi bekhosi "Umlawuli weLinux".

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 ingcebiso(2).

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 amaxwebhu Iinkozo zeLinux.

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 brk kunye ne-sbrk ukucela okanye ukukhulula inkumbulo kwisixokelelwano sokusebenza.

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 imemori ngokuyimfuneko ibuyiselwe ngokukhawuleza kwindlela yokusebenza.

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 imiyalelo ekuqaleni kwenqaku.

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 (manpage)madviseukufunda ngakumbi malunga nolawulo lwememori kunye 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?

Unombuzo? Bhala kwizimvo!

umthombo: www.habr.com

Yongeza izimvo