Vantaġġi u Żvantaġġi ta 'HugePages

Vantaġġi u Żvantaġġi ta 'HugePages

Traduzzjoni tal-artiklu mħejjija għall-istudenti tal-kors "Amministratur tal-Linux".

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.

Fl-istess ħin, kollox jiġri inosservat għalik, allura għaliex għandu jinkwetak? Imma għax l-isfida free() ma jfissirx li memorja hija neċessarjament ritornata immedjatament lis-sistema operattiva.

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.

X'għandek taqra?

Għandek xi mistoqsija? Ikteb fil-kummenti!

Sors: www.habr.com

Żid kumment