Avantaj ak dezavantaj HugePages

Avantaj ak dezavantaj HugePages

Tradiksyon atik la prepare pou elèv kou yo "Administratè Linux".

Précédemment, mwen te pale sou ki jan yo teste ak pèmèt itilizasyon Hugepages sou Linux.
Atik sa a pral itil sèlman si ou aktyèlman gen yon kote pou itilize Hugepages. Mwen te rankontre anpil moun ki twonpe pa pwospè ke Hugepages pral majik amelyore pwodiktivite. Sepandan, hugepaging se yon sijè konplèks epi li ka degrade pèfòmans si yo itilize mal.

Pati 1: Verifye ke hugepages yo aktive sou Linux (orijinal isit la)

Pwoblèm:
Ou bezwen tcheke si HugePages aktive sou sistèm ou an.

solisyon:
Li trè senp:

cat /sys/kernel/mm/transparent_hugepage/enabled

Ou pral jwenn yon bagay tankou sa a:

always [madvise] never

Ou pral wè yon lis opsyon ki disponib (toujou, fou, pa janm), epi opsyon aktif kounye a pral mete nan parantèz (pa default fou).

fou vle di sa transparent hugepages aktive sèlman pou zòn memwa ki mande klèman hugepages lè l sèvi avèk fou (2).

toujou vle di sa transparent hugepages toujou pèmèt pou tout pwosesis. Sa a anjeneral amelyore pèfòmans, men si ou gen yon ka itilize kote anpil pwosesis ap konsome yon ti kantite memwa, Lè sa a, chaj memwa jeneral la ka ogmante dramatikman.

pa janm vle di sa transparent hugepages pa pral enkli menm lè yo mande yo lè l sèvi avèk madvise. Pou jwenn plis enfòmasyon, kontakte dokiman Nwayo Linux.

Ki jan yo chanje valè default la

Opsyon 1: Chanje dirèkteman sysfs (apre rdemare paramèt la ap retounen nan valè default li yo):

echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabled

Opsyon 2: Chanje default sistèm lan lè w rekonpile nwayo a ak yon konfigirasyon modifye (opsyon sa a rekòmande sèlman si w ap itilize yon nwayo koutim):

  • Pou mete toujou pa default, sèvi ak:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Pou mete madvise kòm default, sèvi ak:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Pati 2: Avantaj ak Dezavantaj HugePages

Nou pral eseye oaza eksplike avantaj, dezavantaj ak enkonvenyans posib lè w sèvi ak Hugepages. Depi yon atik teknolojik konplèks ak pedant ap difisil pou moun konprann pou moun ki twonpe nan panse Hugepages se yon mirak, mwen pral sakrifye presizyon pou senplisite. Li jis vo kenbe nan tèt ou ke yon anpil nan sijè yo se reyèlman konplèks ak Se poutèt sa anpil senplifye.

Tanpri sonje ke nou ap pale de sistèm x64 86-bit ki kouri Linux, e ke mwen tou senpleman sipoze ke sistèm nan sipòte transparan hugepages (piske se pa yon dezavantaj ke hugepages yo pa ranplase), menm jan se ka a nan prèske nenpòt Linux modèn. anviwònman.

Mwen pral tache plis deskripsyon teknik nan lyen ki anba yo.

Vityèl memwa

Si ou se yon pwogramè C++, ou konnen objè ki nan memwa gen adrès espesifik (valè konsèy).

Sepandan, adrès sa yo pa nesesèman reflete adrès fizik nan memwa (adrès RAM). Yo reprezante adrès nan memwa vityèl. Pwosesis la gen yon modil espesyal MMU (inite jesyon memwa) ki ede kat jeyografik nwayo memwa vityèl nan yon kote fizik.

Apwòch sa a gen anpil avantaj, men sa ki pi enpòtan yo se:

  • Pèfòmans (pou plizyè rezon);
  • Izolasyon pwogram, sa vle di, pa gen okenn pwogram ki ka li nan memwa yon lòt pwogram.

Ki sa ki paj?

Memwa vityèl divize an paj. Chak paj endividyèl lonje dwèt sou yon memwa fizik espesifik, li ka lonje dwèt sou yon zòn nan RAM, oswa li ka lonje dwèt sou yon adrès ki asiyen nan yon aparèy fizik, tankou yon kat videyo.

Pifò nan paj ou fè fas ak yo swa montre RAM oswa yo chanje, sa vle di yo estoke sou kondwi difisil ou oswa SSD. Kernel la jere layout fizik chak paj. Si yo jwenn aksè nan yon paj ki twonpe, nwayo a sispann fil la ki ap eseye jwenn aksè nan memwa a, li paj la ki soti nan kondwi a difisil / SSD nan RAM, ak Lè sa a, kontinye egzekite fil la.

Pwosesis sa a transparan, sa vle di li pa nesesèman li dirèkteman nan HDD/SSD la. Gwosè paj nòmal yo se 4096 octets. Gwosè Hugepages se 2 megabyte.

Tanpon tradiksyon-asosyativ (TLB)

Lè yon pwogram jwenn aksè nan yon paj memwa, CPU a dwe konnen ki paj fizik pou li done yo (sa vle di, gen yon kat adrès vityèl).

Kernel la gen yon estrikti done (tablo paj) ki genyen tout enfòmasyon sou paj yo itilize. Sèvi ak estrikti done sa a, ou ka kat yon adrès vityèl nan yon adrès fizik.

Sepandan, tablo paj la byen konplèks ak dousman, kidonk nou tou senpleman pa ka analize tout estrikti done a chak fwa yon pwosesis jwenn aksè nan memwa.

Erezman, processeur nou an gen yon TLB ki kachèt kat ki genyen ant adrès vityèl ak adrès fizik. Sa vle di ke byenke nou bezwen analize tab paj la sou premye tantativ aksè a, tout aksè ki vin apre a nan paj la ka okipe nan TLB la, sa ki pèmèt pou operasyon rapid.

Paske li aplike kòm yon aparèy fizik (ki fè li vit an plas an premye), kapasite li limite. Se konsa, si ou vle jwenn aksè nan plis paj, TLB la pa pral kapab sere kat pou tout nan yo, sa ki lakòz pwogram ou a kouri pi dousman.

Hugepages vini nan sekou a

Se konsa, ki sa nou ka fè pou evite TLB debòde? (Nou sipoze pwogram nan toujou bezwen menm kantite memwa).

Sa a se kote Hugepages antre. Olye pou yo 4096 bytes ki egzije yon sèl antre TLB, yon sèl antre TLB kapab kounye a lonje dwèt sou yon kolosal 2 megabyte. Ann sipoze TLB a gen 512 antre, isit la san Hugepages nou ka matche:

4096 b⋅512=2 MB

Lè sa a, ki jan nou ka konpare ak yo:

2 MB⋅512=1 GB

Se poutèt sa Hugepages se awizom. Yo ka amelyore pwodiktivite san anpil efò. Men, gen opozisyon enpòtan isit la.

Hugepages spoofing

Kernel la otomatikman kontwole konbyen fwa yo itilize chak paj memwa. Si pa gen ase memwa fizik (RAM), nwayo a ap deplase paj mwens enpòtan (mwens souvan itilize) nan disk la pou libere kèk RAM pou paj ki pi enpòtan.
Nan prensip, menm bagay la tou aplike nan Hugepages. Sepandan, nwayo a ka sèlman chanje paj tout antye, pa byte endividyèl.

Ann di nou gen yon pwogram tankou sa a:

char* mymemory = malloc(2*1024*1024); // Возьмем это за одну Hugepage!
// Заполним mymemory какими-либо данными
// Сделаем много других вещей,
// которые приведут к подмене страницы mymemory
// ...
// Запросим доступ только к первому байту
putchar(mymemory[0]); 

Nan ka sa a, nwayo a ap bezwen ranplase (li) otan ke 2 megabyte nan enfòmasyon ki soti nan kondwi a difisil / SSD jis pou ou li yon byte. Kòm pou paj regilye, sèlman 4096 bytes bezwen li nan kondwi a difisil / SSD.

Se poutèt sa, si hugepage anile, li se sèlman pi vit pou li si ou bezwen jwenn aksè nan tout paj la. Sa vle di ke si w ap eseye owaza jwenn aksè nan diferan pati nan memwa epi yo jis li yon koup de kilobyte, ou ta dwe itilize paj regilye epi pa enkyete sou nenpòt lòt bagay.

Nan lòt men an, si ou bezwen jwenn aksè nan yon gwo pòsyon nan memwa sekans, hugepages pral amelyore pèfòmans ou. Sepandan, ou bezwen teste li tèt ou (pa avèk lojisyèl abstrè) epi wè sa ki travay pi vit.

Alokasyon nan memwa

Si ou ekri C, ou konnen ke ou ka mande abitrèman ti (oswa prèske abitrèman gwo) kantite memwa nan pil la lè l sèvi avèk malloc(). Ann di ou bezwen 30 byte memwa:

char* mymemory = malloc(30);

Pou yon pwogramè, li ka parèt ke w ap "mande" 30 byte memwa nan sistèm opere a epi retounen yon konsèy sou kèk memwa vityèl. Men, aktyèlman malloc () se jis yon fonksyon C ki rele nan fonksyon an brk ak sbrk pou mande oswa gratis memwa nan sistèm operasyon an.

Sepandan, mande plis ak plis memwa pou chak alokasyon pa efikas; gen plis chans kèk segman memwa te deja libere (free()), epi nou ka reitilize li. malloc() aplike algoritm byen konplèks pou reitilize memwa libere.

An menm tan an, tout bagay rive inapèsi pou ou, kidonk poukisa li ta dwe enkyete w? Men, paske defi a free() pa vle di sa memwa nesesèman retounen imedyatman nan sistèm operasyon an.

Gen yon bagay tankou fwagmantasyon memwa. Nan ka ekstrèm yo, gen segman pil kote sèlman kèk byte yo itilize, pandan tout bagay an ant yo te libere. (free()).

Tanpri sonje ke fwagmantasyon memwa se yon sijè ekstrèmman konplèks, e menm ti chanjman nan yon pwogram ka gen yon enpak enpòtan. Nan pifò ka yo, pwogram yo pa pral lakòz siyifikatif fwagmantasyon memwa, men ou ta dwe konnen ke si gen yon pwoblèm ak fwagmantasyon nan kèk zòn nan pil wòch la, hugepages ka fè sitiyasyon an vin pi mal.

Selektif itilizasyon hugepages

Apre w fin li atik sa a, ou te detèmine ki pati nan pwogram ou an ka benefisye lè w sèvi ak hugepages ak ki pa kapab. Se konsa, ta dwe hugepages dwe aktive nan tout?

Erezman ou ka itilize madvise()pou pèmèt hugepaging sèlman pou zòn memwa sa yo kote li ta itil.

Premyèman, tcheke si hugepages ap kouri nan mòd madvise() lè l sèvi avèk enstriksyon nan kòmansman atik la.

Lè sa a, sèvi ak madvise()pou di nwayo a egzakteman ki kote pou itilize 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)

Remake byen ke metòd sa a se tou senpleman konsèy pou nwayo a sou kòman yo jere memwa. Sa pa vle di ke nwayo a pral otomatikman itilize hugepages pou yon memwa bay yo.

Gade dokiman (manpage)madvisepou aprann plis sou jesyon memwa ak madvise(), sijè sa a gen yon koub aprantisaj ekstrèmman apik. Se konsa, si ou gen entansyon jwenn reyèlman bon nan li, prepare li ak tès pou kèk semèn anvan ou atann nenpòt rezilta pozitif.

Kisa pou li?

Gen yon kesyon? Ekri nan kòmantè yo!

Sous: www.habr.com

Add nouvo kòmantè