Izinzuzo kanye Nebubi be-HugePages

Izinzuzo kanye Nebubi be-HugePages

Ukuhunyushwa kwesihloko okulungiselelwe abafundi bezifundo "I-Linux Administrator".

Ngaphambilini, ngikhulume ngendlela yokuhlola nokunika amandla ama-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: Ukuqinisekisa ukuthi amakhasi amakhulu avuliwe ku-Linux (okokuqala lapha)

Inkinga:
Udinga ukuhlola ukuthi i-HugePages ivuliwe yini ohlelweni lwakho.

Isixazululo:
Kulula kakhulu:

cat /sys/kernel/mm/transparent_hugepage/enabled

Uzothola okuthile okufana nalokhu:

always [madvise] never

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

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 imibhalo Izihluthulelo ze-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/enabled

Inketho 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-64-bit x86 ezisebenzisa i-Linux, nokuthi ngicabanga ukuthi uhlelo lusekela amakhasi amakhulu asobala (njengoba kungeyona into embi ukuthi amakhasi amakhulu awabhalwa ngaphezulu), njengoba kwenzeka cishe kunoma iyiphi i-Linux yesimanje. imvelo.

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 MB

Khona-ke singaqhathanisa kanjani nabo:

2 MBβ‹…512=1 GB

Yingakho 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 brk futhi sbrk 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 inkumbulo ibuyiselwa ngokushesha ohlelweni lokusebenza.

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 imiyalelo 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 (manpage)madviseukuze 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

Engeza amazwana