Ukuhunyushwa kwesihloko okulungiselelwe abafundi bezifundo
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
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
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
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
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 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?
Isihloko se-IBM OpenStack kumakhasi amakhulu Amakhasi amakhulu asobala ngokumelene namakhasi amakhulu angabonisi ngale Isihloko se-Wikipedia mayelana ne-TLB Imibhalo ye-Linux kernel kumakhasi amakhulu asobala I-StackOverflow: Amakhasi amakhulu athambekele ekuhlukaniseni inkumbulo I-athikili ye-Microsoft yokuphathwa kwememori ebonakalayo
Unombuzo? Bhala kumazwana!
Source: www.habr.com