HugePages priekŔrocības un trūkumi

HugePages priekŔrocības un trūkumi

Raksts tulkots studentiem kursā Linux administrators.

IepriekÅ” es stāstÄ«ju, kā pārbaudÄ«t un ieslēgt Hugepages izmantoÅ”anu Linux.
Å is raksts bÅ«s noderÄ«gs tikai tad, ja jums tieŔām ir vieta, kur izmantot Hugepages. Esmu saskāries ar daudz cilvēku, kuri tiek maldināti ar perspektÄ«vu, ka Hugepages maÄ£iski palielinās veiktspēju. Tomēr hugepaging ir sarežģīta tēma, un nepareizi to izmantojot, tā var samazināt veiktspēju.

1. daļa: pārbaudām, vai hugepages ir ieslēgti Linux (oriÄ£ināls Å”eit)

Problēma:
Jānoskaidro, vai jūsu sistēmā ir ieslēgti HugePages.

Risinājums:
Tas ir diezgan vienkārŔi:

cat /sys/kernel/mm/transparent_hugepage/enabled

JÅ«s saņemsiet kaut ko lÄ«dzÄ«gu Å”im:

always [madvise] never

JÅ«s redzēsit pieejamo opciju sarakstu (always, madvise, never), un paÅ”laik aktÄ«vā opcija bÅ«s iekļauta iekavās (noklusējuma madvise).

madvise norāda, ka transparent hugepages ir ieslēgti tikai atmiņas apgabalos, kuri skaidri pieprasÄ«juÅ”i hugepages, izmantojot madvise(2).

always norāda, ka transparent hugepages tiek vienmēr ieslēgti visiem procesiem. Parasti tas palielina veiktspēju, bet ja jums ir lietojums, kur vairāki procesi patērē nelielu daudzumu atmiņas, kopējā atmiņas slodze var strauji pieaugt.

never norāda, ka transparent hugepages netiks ieslēgti pat tad, ja tiek pieprasīti ar madvise. Lai uzzinātu vairāk, skatieties dokumentācijā Linux kodu.

Kā mainīt noklusējuma vērtību

Varianta 1: TieÅ”i mainÄ«t sysfs (pēc atsāknēŔanasparameters atgriezÄ«sies pie noklusējuma vērtÄ«bas):

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

Varianta 2: Mainiet sistēmas noklusējuma vērtÄ«bu, pārkompilējot kodu ar mainÄ«tu konfigurāciju (Å”is variants ieteicams tikai tad, ja izmantojat savu kodu):

  • Lai noklusējumā iestatÄ«tu always, izmantojiet:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Ierakstiet CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Lai noklusējumā iestatÄ«tu madvise, izmantojiet:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Ierakstiet CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

2. daļa: HugePages priekŔrocības un trūkumi

Mēs mēģināsim izvēlēti izskaidrot Hugepages priekÅ”rocÄ«bas, trÅ«kumus un iespējamās kļūdas to izmantoÅ”anā. Ņemot vērā, ka Å”is ir tehnoloÄ£iski sarežģīts un pedantisks raksts, tas, iespējams, bÅ«s grÅ«ti saprotams cilvēkiem, kuri maldÄ«gi uzskata, ka Hugepages ir panaceja, es upurēŔu precizitāti vienkārŔības labad. Jāatceras, ka daudzas tēmas ir patieŔām sarežģītas, un tāpēc tās tiek ievērojami vienkārÅ”otas.

LÅ«dzu, ņemiet vērā, ka mēs runājam par 64 bitu x86 sistēmām, kas darbojas uz Linux, un es vienkārÅ”i pieņemu, ka sistēma atbalsta transparent hugepages (jo tas, ka hugepages nav aizstājamas, nav trÅ«kums), kā tas notiek gandrÄ«z jebkurā mÅ«sdienu Linux vidē.

SaistÄ«tajās saitēs zemāk es pievienoÅ”u vairāk tehniskās informācijas.

Virtuālā atmiņa

Ja esat C++ programmētājs, jūs zināt, ka objektiem atmiņā ir konkrēti adreses (pienācības vērtības).

Tomēr Ŕīs adreses obligāti neatspoguļo fiziskās adreses atmiņā (adreses RAM). Tās ir adreses virtuālajā atmiņā. Procesoram ir Ä«paÅ”s MMU (atmiņas pārvaldÄ«bas vienÄ«ba) modulis, kas palÄ«dz kodolam saskaņot virtuālo atmiņu ar fizisko atraÅ”anās vietu.

Šāds pieeja ir ar daudzām priekÅ”rocÄ«bām, bet vispārējās no tām ir:

  • Veiktspēja (dažādu iemeslu dēļ);
  • Programmu izolācija, tas ir, neviena programma nevar lasÄ«t citas programmas atmiņu.

Kas ir lapas?

Virtuālā atmiņa ir sadalÄ«ta lapās. Katrs atseviŔķs lapa norāda uz konkrētu fizisko atmiņu, tā var norādÄ«t uz jomu operatÄ«vajā atmiņā, vai arÄ« uz adresi, ko pieŔķir fiziskais ierÄ«ce, piemēram, videokarte.

Lielākā daļa lapu, ar kurām jūs saskaraties, norāda vai nu uz RAM, vai ir aizvietotas (swap), tas ir, glabājas cietajā diskā vai SSD. Kodolaimi pārvalda katras lapas fizisko izvietojumu. Ja piekļūst aizvietotai lapai, kodols aptur pavedienu, kas mēģina piekļūt atmiņai, nolasot lapu no cietā diska/SSD uz operatīvo atmiņu un pēc tam turpina pavediena izpildi.

Å is process ir caurspÄ«dÄ«gs pavedienam, tas ir, tas obligāti nelasa tieÅ”i no cietā diska/SSD. Normālo lapu izmērs ir 4096 baiti. Hugepages izmērs ir 2 megabaiti.

SaistÄ«to pārvērÅ”anu buferis (TLB)

Kad programma piekļūst noteiktai atmiņas lapai, centrālajam procesoram jāzina, no kuras fiziskās lapas nolasīt datus (t.i., jābūt virtuālajai adresācijas kartei).

Kodola struktÅ«rā ir datu struktÅ«ra (lapu tabula), kas satur visu informāciju par izmantotajām lapām. Ar Ŕīs datu struktÅ«ras palÄ«dzÄ«bu var pārvērst virtuālo adresi fiziskajā adresē.

Tomēr lapu tabula ir diezgan sarežģīta un darbojas lēni, tāpēc mēs nevaram katru reizi analizēt visu datu struktūru, kad kāds process piekļūst atmiņai.

Par laimi, mÅ«su procesorā ir TLB, kas keŔē adresāciju starp virtuālajām un fiziskajām adresēm. Tas nozÄ«mē, ka, lai arÄ« mums ir jāpārvērÅ” lapu tabula pie pirmā piekļūŔanas mēģinājuma, visi turpmākie piekļuves mēģinājumi var tikt apstrādāti TLB, kas nodroÅ”ina ātrāku darbÄ«bu.

Kā tas ir ieviests kā fiziska ierÄ«ce (kas padara to primāri ātru), tā kapacitāte ir ierobežota. Tāpēc, ja vēlaties piekļūt lielākam skaitam lapu, TLB nespēs glabāt kartēŔanu visām tām, kā rezultātā jÅ«su programma strādās daudz lēnāk.

Hugepages nāk palīgā

Tātad, ko mēs varam darÄ«t, lai izvairÄ«tos no TLB pārpildīŔanas? (Pieņemam, ka programmai joprojām ir nepiecieÅ”ama tāda pati atmiņas jauda.)

Šeit parādās Hugepages. Tā vietā, lai izmantotu 4096 baitus, kas prasa tikai vienu ierakstu TLB, viens ieraksts TLB tagad var norādīt uz milzīgiem 2 megabaitiem. Pieņemsim, ka TLB ir 512 ierakstu, tad bez Hugepages mēs varam kartēt:

4096 bā‹…512=2 MB

Tad ar tiem mēs varam kartēt:

2 MBā‹…512=1 GB

Tāpēc Hugepages ir lieliska lieta. Tie var uzlabot veiktspēju bez būtiskas piepūles. Bet ir dažas būtiskas atrunas.

Hugepages apmaiņa

Kodols automātiski seko katras atmiņas lapas izmantoÅ”anas biežumam. Ja fiziskās atmiņas (RAM) nepietiek, kodols pārvietos mazāk svarÄ«gas (retāk lietotas) lapas uz cieto disku, lai atbrÄ«votu daļu RAM svarÄ«gākām lapām.
Principā tas pats attiecas uz Hugepages. Tomēr kodols var apmainÄ«t tikai veselas lapas, nevis atseviŔķus baitus.

Pieņemot, ka mums ir Ŕāda programma:

char* mymemory = malloc(2*1024*1024); 
// Ņemsim to par vienu Hugepage!
// Aizpildīsim mymemory ar kādiem datiem
// Veiksim daudz citu lietu,
// kas novedīs pie mymemory lapu maiņas
// ...
// Pieprasīsim piekļuvi tikai pirmajam baitam
putchar(mymemory[0]); 

Šajā gadījumā kodolam būs jāizlasa veseli 2 megabaiti informācijas no cietā diska/SSD tikai, lai jūs varētu izlasīt vienu baitu. Attiecībā uz parastām lapām no cietā diska/SSD jāizlasa tikai 4096 baiti.

Tāpēc, ja hugepage tiek nomainÄ«ts, tās lasīŔana notiek ātrāk, tikai ja jums ir nepiecieÅ”ams piekļūt visai lapai. Tas nozÄ«mē, ka, ja jÅ«s mēģināt piekļūt nejauÅ”i dažādām atmiņas daļām un vienkārÅ”i izlasāt pāris kilobaitus, jums vajadzētu izmantot parastas lapas un vairs par neko neuztraukties.

Savukārt, ja jums nepiecieÅ”ams piekļūt lielai atmiņas daļai secÄ«gi, hugepages palielinās jÅ«su veiktspēju. Tomēr jums paÅ”iem tas jāiz pārbauda (nevis abstraktā vietnē) un jāpārbauda, kas strādās ātrāk.

Atmiņas alokācija

Ja jÅ«s rakstāt C valodā, jÅ«s zināt, ka varat pieprasÄ«t tik mazas (vai gandrÄ«z tik lielas) atmiņas daļas no kaudzes, izmantojot malloc(). Pieņemsim, ka jums nepiecieÅ”ami 30 baiti atmiņas:

char* mymemory = malloc(30);

Programmētājam varētu Ŕķist, ka jÅ«s "pieprasāt" 30 baitus atmiņas no operētājsistēmas un atgriežat rādÄ«tāju uz kādu virtuālo atmiņu. Bet patiesÄ«bā malloc () ir vienkārÅ”i C funkcija, kas iekŔēji sauc funkcijas brk un sbrk lai pieprasÄ«tu vai atbrÄ«votu atmiņu no operētājsistēmas.

Tomēr, pieprasīt arvien vairāk un vairāk atmiņas katrai alokācijai nav efektīvi; visdrīzāk kāds atmiņas segments jau tika atbrīvots (free()), un mēs varam to atkārtoti izmantot. malloc() īsteno diezgan sarežģītus algoritmus, lai atkārtoti izmantotu atbrīvoto atmiņu.

Tajā paŔā laikā viss jums notiek nemanāmi, tāpēc kāpēc tam bÅ«tu jāpievērÅ” uzmanÄ«ba? Tāpēc, ka izsaukums free() nenozÄ«mē, ka atmiņa obligāti tiek atgriezta nekavējoties operētājsistēmai.

Ir pastāv tāds jēdziens kā atmiņas fragmentācija. Ekstremālos gadījumos ir kaudzes segmenti, kur tiek izmantoti tikai daži baiti, kamēr viss, kas atrodas starp tiem, ir atbrīvots. (free()).

LÅ«dzu, ņemiet vērā, ka atmiņas fragmentācija ir ārkārtÄ«gi sarežģīta tēma, un pat nelielas izmaiņas programmā var bÅ«t ievērojami ietekmēt to. Lielākajā daļā gadÄ«jumu programmas neizraisa nozÄ«mÄ«gu atmiņas fragmentāciju, taču jāatceras, ka, ja ir raduŔās problēmas ar fragmentāciju kādā kaudzes apgabalā, hugepages var tikai pasliktināt situāciju.

Izvēles hugepages izmantoÅ”ana

Pēc raksta izlasīŔanas esat noteikuÅ”i, kādas jÅ«su programmas daļas var gÅ«t labumu no hugepages izmantoÅ”anas, un kādas – nē. Tātad, vai vispār bÅ«tu jāieslēdz hugepages?

Par laimi, jūs varat izmantot madvise(), lai aktivizētu hugepaging tikai tām atmiņas jomām, kur tas būs noderīgi.

Vispirms pārliecinieties, ka hugepages darbojas madvise() režīmā, izmantojot norādījumā raksta sākumā.

Pēc tam izmantojiet madvise(), lai norādÄ«tu kodolam, kur tieÅ”i izmantot 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)

LÅ«dzu, ņemiet vērā, ka Ŕī metode ir tikai ieteikums kodolam par atmiņas pārvaldÄ«bu. Tas nenozÄ«mē, ka kodols automātiski izmantos hugepages norādÄ«tajai atmiņai.

LÅ«dzu, skatieties dokumentāciju (manpage) madvise, lai uzzinātu vairāk par atmiņas pārvaldÄ«bu un madvise(), Å”ai tēmai ir neticami stāva mācÄ«bu lÄ«kne. Tātad, ja jÅ«s patieŔām vēlaties to izprast, gatavojieties lasÄ«t un testēt vairākas nedēļas, pirms cerat uz kaut kādu pozitÄ«vu rezultātu.

Ko lasīt?

Vai jums ir jautājums? Rakstiet komentāros!

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster