Preċedentement, tkellimt dwar kif nittestja u nippermetti Hugepages fuq Linux.
Dan l-artikolu se jkun utli biss jekk fil-fatt ikollok post fejn tuża Hugepages. Iltqajt ma' ħafna nies li huma mqarrqa bil-prospett li Hugepages se jtejjeb il-produttività b'mod maġiku. Madankollu, hugepaging huwa suġġett kumpless u jista’ jiddegrada l-prestazzjoni jekk jintuża ħażin.
Parti 1: Verifika li hugepages huma attivati fuq Linux (oriġinali hawn)
Problema:
Trid tiċċekkja jekk HugePages hijiex attivata fis-sistema tiegħek.
soluzzjoni:
Huwa pjuttost sempliċi:
cat /sys/kernel/mm/transparent_hugepage/enabled
Int ser tirċievi xi ħaġa bħal din:
always [madvise] never
Se tara lista ta' għażliet disponibbli (dejjem, madvise, qatt), u l-għażla attiva bħalissa se tkun magħluqa fil-parentesi (b'mod awtomatiku madvise).
madvise ifisser li transparent hugepages ppermettiet biss għal żoni tal-memorja li espliċitament jitolbu l-użu ta 'paġni enormi ġenn (2).
dejjem ifisser li transparent hugepages dejjem attivat għall-proċessi kollha. Dan normalment itejjeb il-prestazzjoni, imma jekk għandek każ ta 'użu fejn ħafna proċessi qed jikkunsmaw ammont żgħir ta' memorja, allura t-tagħbija ġenerali tal-memorja tista 'tiżdied b'mod drammatiku.
qatt ifisser li transparent hugepages mhux se jiġu inklużi anki meta mitluba bl-użu ta’ madvise. Biex issir taf aktar, ikkuntattja dokumentazzjoni Qlub Linux.
Kif tibdel il-valur default
Għażla 1: Tibdel direttament sysfs (wara l-istartjar mill-ġdid il-parametru jerġa' lura għall-valur default tiegħu):
echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabled
Għażla 2: Ibdel id-default tas-sistema billi tikkompila mill-ġdid il-kernel b'konfigurazzjoni modifikata (din l-għażla hija rakkomandata biss jekk qed tuża għadma personalizzata):
Biex tissettja dejjem awtomatikament, uża:
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
# Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
Biex issettja madvise bħala default, uża:
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
# Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
Parti 2: Vantaġġi u Żvantaġġi ta 'HugePages
Se nippruvaw nispjegaw b'mod selettiv il-vantaġġi, l-iżvantaġġi u l-iżvantaġġi possibbli tal-użu ta 'Hugepages. Peress li artikolu teknoloġikament kumpless u pedantiku x'aktarx ikun diffiċli biex jinftiehem għal nies li huma deluded biex jaħsbu li Hugepages huwa rimedju, se nissagrifika l-eżattezza għas-sempliċità. Ta’ min iżomm f’moħħu li ħafna mis-suġġetti huma tassew kumplessi u għalhekk simplifikati ħafna.
Jekk jogħġbok innota li qed nitkellmu dwar sistemi x64 86-bit li jħaddmu Linux, u li qed nassumu sempliċiment li s-sistema tappoġġja hugepages trasparenti (peress li mhuwiex żvantaġġ li hugepages ma jinkitbux fuq il-post), kif inhu l-każ fi kważi kull Linux modern. ambjent.
Se nehmeż aktar deskrizzjoni teknika fil-links hawn taħt.
Memorja Virtwali
Jekk int programmatur C++, taf li l-oġġetti fil-memorja għandhom indirizzi speċifiċi (valuri tal-pointer).
Madankollu, dawn l-indirizzi mhux bilfors jirriflettu indirizzi fiżiċi fil-memorja (indirizzi RAM). Huma jirrappreżentaw indirizzi fil-memorja virtwali. Il-proċessur għandu modulu speċjali MMU (unità ta 'ġestjoni tal-memorja) li jgħin lill-kernel jimmappa memorja virtwali għal post fiżiku.
Dan l-approċċ għandu ħafna vantaġġi, iżda l-aktar importanti huma:
Prestazzjoni (għal diversi raġunijiet);
Iżolament tal-programm, jiġifieri, l-ebda programm ma jista 'jaqra mill-memorja ta' programm ieħor.
X'inhuma l-paġni?
Il-memorja virtwali hija maqsuma f'paġni. Kull paġna individwali tindika memorja fiżika speċifika, tista 'tipponta lejn żona fir-RAM, jew tista' tipponta lejn indirizz assenjat lil apparat fiżiku, bħal karta tal-vidjo.
Ħafna mill-paġni li tittratta magħhom jew jindikaw RAM jew huma skambjati, jiġifieri huma maħżuna fuq il-hard drive jew SSD tiegħek. Il-qalba tamministra t-tqassim fiżiku ta' kull paġna. Jekk tiġi aċċessata paġna spoofed, il-qalba twaqqaf il-ħajt li qed jipprova jaċċessa l-memorja, jaqra l-paġna mill-hard drive/SSD fir-RAM, u mbagħad ikompli tesegwixxi l-ħajta.
Dan il-proċess huwa fluss trasparenti, li jfisser li mhux neċessarjament jaqra direttament mill-HDD/SSD. Id-daqs tal-paġni normali huwa 4096 bytes. Id-daqs tal-paġni enormi huwa ta' 2 megabytes.
Buffer assoċjattiv tat-traduzzjoni (TLB)
Meta programm jaċċessa paġna tal-memorja, is-CPU għandu jkun jaf minn liema paġna fiżika jaqra d-dejta (jiġifieri, ikollu mappa tal-indirizz virtwali).
Il-kernel għandu struttura tad-dejta (tabella tal-paġna) li fiha l-informazzjoni kollha dwar il-paġni li qed jintużaw. Bl-użu ta' din l-istruttura tad-dejta, tista' timmappa indirizz virtwali għal indirizz fiżiku.
Madankollu, it-tabella tal-paġna hija pjuttost kumplessa u bil-mod, għalhekk sempliċement ma nistgħux nanalizzaw l-istruttura tad-dejta kollha kull darba li proċess jaċċessa l-memorja.
Fortunatament, il-proċessur tagħna għandu TLB li jżomm fil-caches l-immappjar bejn indirizzi virtwali u fiżiċi. Dan ifisser li għalkemm għandna bżonn naqraw it-tabella tal-paġna fl-ewwel tentattiv ta 'aċċess, l-aċċessi sussegwenti kollha għall-paġna jistgħu jiġu ttrattati fit-TLB, li jippermetti tħaddim mgħaġġel.
Minħabba li huwa implimentat bħala apparat fiżiku (li jagħmilha mgħaġġel fl-ewwel lok), il-kapaċità tagħha hija limitata. Mela jekk trid taċċessa aktar paġni, it-TLB mhux se jkun jista 'jaħżen mappings għalihom kollha, u b'hekk il-programm tiegħek jaħdem ħafna aktar bil-mod.
Hugepages jiġi għas-salvataġġ
Allura x'nistgħu nagħmlu biex nevitaw l-overflow TLB? (Nassumu li l-programm għadu jeħtieġ l-istess ammont ta 'memorja).
Dan huwa fejn jidħol Hugepages. Minflok 4096 bytes li jeħtieġu dħul TLB wieħed biss, dħul TLB wieħed issa jista' jindika 2 megabytes enormi. Ejja nassumu li t-TLB għandu 512 daħla, hawnhekk mingħajr Hugepages nistgħu nqabblu:
4096 b⋅512=2 MB
Imbagħad kif nistgħu nqabblu magħhom:
2 MB⋅512=1 GB
Huwa għalhekk li Hugepages huwa tal-biża '. Jistgħu jtejbu l-produttività mingħajr ħafna sforz. Iżda hemm twissijiet sinifikanti hawn.
Hugepages spoofing
Il-qalba timmonitorja awtomatikament kemm tintuża kull paġna tal-memorja. Jekk ma jkunx hemm biżżejjed memorja fiżika (RAM), il-qalba se tiċċaqlaq paġni inqas importanti (użu inqas frekwenti) għall-hard disk biex tillibera xi RAM għal paġni aktar importanti.
Fil-prinċipju, l-istess japplika għal Hugepages. Madankollu, il-kernel jista' jibdel biss paġni sħaħ, mhux bytes individwali.
Ejja ngħidu li għandna programm bħal dan:
char* mymemory = malloc(2*1024*1024); // Возьмем это за одну Hugepage!
// Заполним mymemory какими-либо данными
// Сделаем много других вещей,
// которые приведут к подмене страницы mymemory
// ...
// Запросим доступ только к первому байту
putchar(mymemory[0]);
F'dan il-każ, il-kernel ikollu bżonn jissostitwixxi (jaqra) daqs 2 megabytes ta 'informazzjoni mill-hard drive/SSD biss biex inti taqra byte wieħed. Fir-rigward tal-paġni regolari, 4096 bytes biss iridu jinqraw mill-hard drive/SSD.
Għalhekk, jekk hugepage jinqabeż, huwa biss aktar mgħaġġel biex taqra jekk ikollok bżonn taċċessa l-paġna kollha. Dan ifisser li jekk qed tipprova taċċessa b'mod każwali partijiet differenti tal-memorja u qed taqra ftit kilobytes, għandek tuża paġni regolari u ma tinkwieta dwar xi ħaġa oħra.
Min-naħa l-oħra, jekk ikollok bżonn taċċessa porzjon kbir tal-memorja b'mod sekwenzjali, hugepages se jtejjeb il-prestazzjoni tiegħek. Madankollu, għandek bżonn tittestja lilek innifsek (mhux b'softwer astratt) u tara x'jaħdem aktar malajr.
Allokazzjoni fil-memorja
Jekk tikteb C, taf li tista’ titlob ammonti arbitrarjament żgħar (jew kważi arbitrarjament kbar) ta’ memorja mill-borġ billi tuża malloc(). Ejja ngħidu li għandek bżonn 30 bytes ta 'memorja:
char* mymemory = malloc(30);
Għal programmatur, jista 'jidher li qed "titlob" 30 bytes ta' memorja mis-sistema operattiva u tirritorna pointer għal xi memorja virtwali. Imma fil-fatt malloc () hija biss funzjoni C li titlob minn ġewwa l-funzjoni brk u sbrk biex titlob jew teħles memorja mis-sistema operattiva.
Madankollu, li tintalab aktar u aktar memorja għal kull allokazzjoni hija ineffiċjenti; huwa l-aktar probabbli li xi segment tal-memorja diġà ġie meħlus (free()), u nistgħu nużawha mill-ġdid. malloc() jimplimenta algoritmi pjuttost kumplessi għall-użu mill-ġdid tal-memorja meħlusa.
Hemm ħaġa bħal frammentazzjoni tal-memorja. F'każijiet estremi, hemm segmenti ta' borġ fejn jintużaw ftit bytes biss, filwaqt li kollox bejn wieħed u ieħor ġie meħlus (free()).
Jekk jogħġbok innota li l-frammentazzjoni tal-memorja hija suġġett oerhört kumpless, u anke bidliet żgħar għal programm jista 'jkollhom impatt sinifikanti. Fil-biċċa l-kbira tal-każijiet, il-programmi mhux se jikkawżaw frammentazzjoni sinifikanti tal-memorja, iżda għandek tkun konxju li jekk ikun hemm problema bil-frammentazzjoni f'xi żona tal-borġ, paġni enormi jistgħu jagħmlu s-sitwazzjoni agħar.
Użu selettiv ta 'paġni enormi
Wara li qrajt l-artiklu, iddeterminajt liema partijiet tal-programm tiegħek jistgħu jibbenefikaw mill-użu ta 'paġni enormi u liema ma jistgħux. Allura għandhom ikunu attivati hugepages?
Fortunatament tista 'tuża madvise()biex tippermetti hugepaging biss għal dawk l-oqsma tal-memorja fejn ikun utli.
L-ewwel, iċċekkja li hugepages qed taħdem fil-modalità madvise() bl-użu istruzzjonijiet fil-bidu tal-artiklu.
Imbagħad, uża madvise()biex tgħid lill-qalba eżattament fejn tuża hugepages.
#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)
Innota li dan il-metodu huwa sempliċement parir lill-qalba dwar kif timmaniġġja l-memorja. Dan ma jfissirx li l-kernel awtomatikament juża hugepages għal memorja partikolari.
Irreferi għad-dokumentazzjoni (manpage)madvisebiex titgħallem aktar dwar il-ġestjoni tal-memorja u madvise(), dan is-suġġett għandu kurva ta 'tagħlim oerhört wieqaf. Mela jekk għandek il-ħsieb li tikseb verament tajjeb fiha, ipprepara biex taqra u tittestja għal ftit ġimgħat qabel ma tistenna xi riżultati pożittivi.