
Wergera gotarê ji bo xwendekarên kursê hatiye amadekirin .
Berê min li ser çawaniya kontrolkirin û çalakkirina karanîna Hugepages di axivî Linux.
Ev gotar tenê dê bikêr be ger bi rastî cîhek we hebe ku hûn Hugepages bikar bînin. Min bi gelek kesên ku bi perspektîfa ku Hugepages dê bi efsûnî hilberîneriyê baştir bike re têne xapandin. Lêbelê, pelgeya mezin mijarek tevlihev e û heke bi xeletî were bikar anîn dikare performansê xirab bike.
Beşa 1: Kontrol bike ka hugepages çalak in Linux (eslî )
Pirsgirêk:
Pêdivî ye ku hûn kontrol bikin ka HugePages li ser pergala we çalak e.
çareseriya:
Ew pir hêsan e:
cat /sys/kernel/mm/transparent_hugepage/enabledHûn ê tiştek bi vî rengî bistînin:
always [madvise] neverHûn ê navnîşek vebijarkên berdest bibînin (hertim, dîn, qet), û vebijarka niha ya çalak dê di nav parantezê de were girtin (bi xwerû madvise).
madvise tê wateya ku transparent hugepages tenê ji bo deverên bîranînê yên ku bi eşkere daxwazî rûpelên mezin bikar tînin çalak kirin .
herdem tê wateya ku transparent hugepages her dem ji bo hemî pêvajoyan çalak kirin. Ev bi gelemperî performansê çêtir dike, lê heke we rewşek bikar bîne ku gelek pêvajo hejmarek piçûk bîranînê vedixwe, wê hingê barkirina bîranîna giştî dikare bi rengek berbiçav zêde bibe.
qet tê wateya ku transparent hugepages Dema ku bi karanîna madvise tê xwestin jî dê neyête nav kirin. Ji bo bêtir agahdarî, têkilî cûrbecûr Linux.
Meriv çawa nirxa xwerû biguhezîne
Option 1: Rasterast biguhere sysfs (piştî rebootkirina parametre dê vegere nirxa xweya xwerû):
echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabledOption 2: Bi ji nû ve berhevkirina kernelê bi veavakirinek guhertî ve pêşnumaya pergalê biguhezînin (ev vebijark tenê tê pêşniyar kirin heke hûn kernelek xwerû bikar bînin):
- Ji bo ku her gav ji hêla xwerû ve were danîn, bikar bînin:
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y - Ji bo ku madvise wekî xwerû destnîşan bikin, bikar bînin:
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
Beş 2: Awantaj û Dezawantajên HugePages
Em ê hewl bidin ku bi bijartî avantaj, dezawantaj û xeletiyên gengaz ên karanîna Hugepages rave bikin. Ji ber ku gotarek teknolojiyê ya tevlihev û pedantîk dê ji bo mirovên ku dihizirin ku Hugepages dermanek e, fêmkirina wê dijwar be, ez ê ji bo sadebûnê rastiyê bikim qurban. Tenê hêja ye ku ji bîr mekin ku gelek mijar bi rastî tevlihev in û ji ber vê yekê pir hêsankirî ne.
Ji kerema xwe not bikin ku em li ser pergalên x86 yên 64-bit ku li ser dixebitin diaxivin. Linux, û ez tenê texmîn dikim ku pergal rûpelên mezin ên zelal piştgirî dike (ji ber ku ne dezavantaj e ku rûpelên mezin nayên guhertin), wekî ku di hema hema her hawîrdorek nûjen de diqewime. Linux.
Ez ê di lînkên jêrîn de ravekek teknîkî ya bêtir pêve bikim.
Bîra Virtual
Heke hûn bernamesazek C++ ne, hûn dizanin ku tiştên di bîranînê de navnîşanên taybetî hene (nirxên nîşanker).
Lêbelê, ev navnîşan ne hewce ne ku navnîşên fîzîkî di bîranînê de (navnîşanên RAM) nîşan bidin. Ew navnîşan di bîra virtual de temsîl dikin. Prosesor xwedan modulek taybetî ya MMU (yekîneya rêveberiya bîranînê) ye ku ji kernelê re dibe alîkar ku bîranîna virtual li cîhek fîzîkî nexşe bike.
Ev rêbaz gelek avantajên xwe hene, lê yên herî girîng ev in:
- Performansa (ji ber sedemên cûda);
- Veqetandina bernameyê, ango tu bername nikare ji bîra bernameyeke din bixwîne.
Rûpel çi ne?
Bîra virtual li ser rûpelan tê dabeş kirin. Her rûpelek ferdî îşaret bi bîranînek laşî ya taybetî dike, ew dikare deverek di RAM-ê de destnîşan bike, an jî ew dikare navnîşek ku ji amûrek laşî re hatî veqetandin, wekî qerta vîdyoyê destnîşan bike.
Piraniya rûpelên ku hûn pê re mijûl dibin an li ser RAM-ê destnîşan dikin an jî têne guheztin, tê vê wateyê ku ew li ser dîska weya hişk an SSD-ê têne hilanîn. Kernel sêwirana fîzîkî ya her rûpelê birêve dibe. Ger rûpelek xapînok were gihîştin, kernel tîra ku hewl dide xwe bigihîne bîranînê rawestîne, rûpelê ji dîska hişk/SSD di RAM-ê de dixwîne, û dûv re jî cîbicîkirina mijarê didomîne.
Ev pêvajo zelal e, tê vê wateyê ku ew ne hewce ye ku rasterast ji HDD / SSD were xwendin. Mezinahiya rûpelên normal 4096 byte ye. Mezinahiya rûpelên mezin 2 megabyte ye.
Tampona Werger-hevkar (TLB)
Dema ku bername digihîje rûpelek bîranînê, CPU divê zanibe ku ji kîjan rûpela laşî daneyan bixwîne (ango nexşeyek navnîşana virtual hebe).
Kernel xwedan avahiyek daneyê (tabloya rûpelê) ye ku hemî agahdariya li ser rûpelên ku têne bikar anîn vedihewîne. Bi karanîna vê avahiya daneyê, hûn dikarin navnîşek virtual bi navnîşek fîzîkî re nexşînin.
Lêbelê, tabloya rûpelê pir tevlihev û hêdî ye, ji ber vê yekê em bi hêsanî nikarin hemî strukturên daneyê analîz bikin her gava ku pêvajoyek digihîje bîranînê.
Xwezî, pêvajoya me xwedan TLB ye ku nexşeyê di navbera navnîşanên virtual û laşî de vedişêre. Ev tê vê wateyê ku her çend em hewce ne ku di hewildana gihîştina yekem de tabloya rûpelê parsek bikin jî, hemî gihîştinên paşîn ên rûpelê dikarin di TLB-ê de bêne rêve kirin, ku destûrê dide operasyona bilez.
Ji ber ku ew wekî amûrek fizîkî tête bicîh kirin (ku di rêza yekem de wê bilez dike), kapasîteya wê sînordar e. Ji ber vê yekê heke hûn dixwazin xwe bigihînin bêtir rûpelan, TLB dê nikaribe ji bo hemî wan nexşeyan hilîne, dibe sedema ku bernameya we pir hêdîtir bixebite.
Hugepages ji bo rizgariyê tê
Ji ber vê yekê em dikarin çi bikin da ku TLB zêde nebin? (Em texmîn dikin ku bername hîn jî bi heman mîqdara bîranînê hewce dike).
Li vir Hugepages tê de ye. Li şûna ku 4096 byte tenê yek têketinek TLB hewce bike, yek têketinek TLB niha dikare 2 megabaytên mezin nîşan bide. Werin em texmîn bikin ku TLB 512 navnîşan hene, li vir bêyî Hugepages em dikarin hev bikin:
4096 b⋅512=2 MBWê demê em çawa dikarin bi wan re bidin ber hev:
2 MB⋅512=1 GBJi ber vê yekê Hugepages bi heybet e. Ew dikarin bêyî hewldanek zêde hilberîneriyê baştir bikin. Lê li vir hişyariyên girîng hene.
Rûpelên mezin xapandin
Kernel bixweber dişopîne ka her rûpela bîranînê çiqasî tê bikar anîn. Ger têra bîranîna laşî (RAM) tune be, kernel dê rûpelên kêmtir girîng (kêmtir têne bikar anîn) biguhezîne ser dîskê da ku hin RAM ji bo rûpelên girîngtir azad bike.
Di prensîbê de, heman tişt ji bo Hugepages re derbas dibe. Lêbelê, kernel tenê dikare tevahiya rûpelan biguhezîne, ne biteyên kesane.
Em bibêjin bernameyeke me ya bi vî rengî heye:
char* mymemory = malloc(2*1024*1024); // Возьмем это за одну Hugepage!
// Заполним mymemory какими-либо данными
// Сделаем много других вещей,
// которые приведут к подмене страницы mymemory
// ...
// Запросим доступ только к первому байту
putchar(mymemory[0]); Di vê rewşê de, kernel dê hewce bike ku bi qasî 2 megabytes agahdariya ji ajokera hişk / SSD-ê biguhezîne (xwendin) tenê ji bo ku hûn yek byte bixwînin. Wekî ku ji bo rûpelên birêkûpêk, tenê 4096 bytes hewce ye ku ji dîska hişk / SSD were xwendin.
Ji ber vê yekê, ger rûpela mezin were paşguh kirin, ger hewce bike ku hûn bigihîjin tevahiya rûpelê, xwendin zûtir e. Ev tê vê wateyê ku heke hûn hewl didin ku bi rengek bêhemdî xwe bigihînin beşên cihêreng ên bîranînê û tenê çend kilobytes dixwînin, divê hûn rûpelên birêkûpêk bikar bînin û ji tiştek din netirsin.
Ji hêla din ve, heke hûn hewce ne ku bi rêkûpêk bigihîjin beşek mezin a bîranînê, rûpelên mezin dê performansa we baştir bikin. Lêbelê, hûn hewce ne ku wê xwe biceribînin (ne bi nermalava razber) û bibînin ka çi zûtir dixebite.
Dabeşkirina di bîranînê de
Heke hûn C-yê binivîsin, hûn dizanin ku hûn dikarin bi kêfî mîqdarên piçûk (an hema hema bi kêfî mezin) ji bîrê bi kar bînin. malloc(). Em bibêjin ku hûn hewceyê 30 baytên bîranînê ne:
char* mymemory = malloc(30);Ji bernamenûsek re, dibe ku xuya bibe ku hûn 30 bayt bîra ji pergala xebitandinê "daxwaz dikin" û nîşanek vedigerînin hin bîra virtual. Lê bi rastî malloc () tenê fonksiyonek C ye ku ji hundurê fonksiyonê bang dike ji bo daxwaza an bîra azad ji pergala xebatê.
Lêbelê, daxwazkirina bîranîna bêtir û bêtir ji bo her veqetandinê bêbandor e; îhtîmal e ku hin beşên bîranînê jixwe azad bûne (free()), û em dikarin wê ji nû ve bikar bînin. malloc() algorîtmayên pir tevlihev ji bo ji nû ve karanîna bîra azadkirî bicîh tîne.
Di heman demê de, her tişt ji we re nedîtî diqewime, ji ber vê yekê çima divê ew we xemgîn bike? Lê ji ber ku dijwar free() nayê wê wateyê .
Tiştek wekî perçebûna bîranînê heye. Di rewşên giran de, beşên girs hene ku tenê çend byte têne bikar anîn, di heman demê de her tişt di navberê de azad bûye (free()).
Ji kerema xwe not bikin ku perçebûna bîranînê mijarek bêkêmasî tevlihev e, û tewra guheztinên piçûk ên bernameyê dikare bandorek girîng hebe. Di pir rewşan de, bername dê nebin sedema perçebûna bîranînê ya girîng, lê divê hûn zanibin ku heke di hin deveran de pirsgirêkek perçebûnê hebe, rûpelên mezin dikarin rewşê xirabtir bikin.
Bikaranîna bijartî ya rûpelên mezin
Piştî xwendina vê gotarê, we diyar kir ku kîjan beşên bernameya we dikarin ji karanîna rûpelên mezin sûd werbigirin û kîjan nekarin. Ji ber vê yekê divê rûpelên mezin bi tevahî werin çalak kirin?
Xwezî hûn dikarin bikar bînin madvise()ku tenê ji bo wan deverên bîranînê yên ku ew ê bikêrhatî be, rûpela mezin çalak bike.
Pêşîn, kontrol bikin ka bigpages di moda madvise() de bi kar tê xebitandin di destpêka gotarê de.
Piştre, bikar bînin madvise()da ku ji kernelê re bi rastî vebêje ku meriv rûpelên mezin li ku derê bikar tîne.
#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)Têbînî ku ev rêbaz tenê şîretek ji kernelê re ye ku meriv çawa bîranînê birêve dibe. Ev nayê vê wateyê ku kernel dê bixweber ji bo bîranînek diyar rûpelên mezin bikar bîne.
Li belgeyê binihêrin ji bo hînbûna zêdetir li ser rêveberiya bîra û madvise(), ev mijar xwedan kêşeyek fêrbûnê ya bêhempa ye. Ji ber vê yekê heke hûn niyeta we heye ku hûn bi rastî jêhatî bibin, berî ku hûn li hêviya encamên erênî bin, amade bibin ku çend hefte bixwînin û ceribandinê bikin.
Çi bixwînin?
Pirsek heye? Di şîroveyan de binivîsin!
Source: www.habr.com
