HugePagesin edut ja haitat

HugePagesin edut ja haitat

Kurssin opiskelijoille laaditun artikkelin käännös "Linux-järjestelmänvalvoja".

Aiemmin puhuin Hugepagesin testaamisesta ja käyttöönotosta Linuxissa.
Tämä artikkeli on hyödyllinen vain, jos sinulla on todella paikka käyttää Hugepagesia. Olen tavannut monia ihmisiä, joita huijaa näkemys, että Hugepages parantaa taianomaisesti tuottavuutta. Huippusivutus on kuitenkin monimutkainen aihe ja voi huonontaa suorituskykyä, jos sitä käytetään väärin.

Osa 1: Sen varmistaminen, että valtavat sivut ovat käytössä Linuxissa (alkuperäinen täällä)

Ongelma:
Sinun on tarkistettava, onko HugePages käytössä järjestelmässäsi.

ratkaisu:
Se on melko yksinkertainen:

cat /sys/kernel/mm/transparent_hugepage/enabled

Saat jotain tällaista:

always [madvise] never

Näet luettelon käytettävissä olevista vaihtoehdoista (aina, hullu, ei koskaan), ja tällä hetkellä aktiivinen vaihtoehto on suljettujen sisällä (oletusarvoisesti hullua).

hullua tarkoittaa että transparent hugepages käytössä vain muistialueilla, jotka nimenomaisesti pyytävät suuria sivuja käyttämällä madvise (2).

aina tarkoittaa että transparent hugepages aina käytössä kaikissa prosesseissa. Tämä yleensä parantaa suorituskykyä, mutta jos sinulla on käyttötapaus, jossa monet prosessit kuluttavat vähän muistia, muistin kokonaiskuormitus voi kasvaa dramaattisesti.

ei ikinä tarkoittaa että transparent hugepages ei sisälly edes madvisen avulla pyydettäessä. Jos haluat lisätietoja, ota yhteyttä dokumentointi Linux-ytimet.

Kuinka muuttaa oletusarvoa

Vaihtoehto 1: Muuta suoraan sysfs (uudelleenkäynnistyksen jälkeen parametri palaa oletusarvoonsa):

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

Vaihtoehto 2: Muuta järjestelmän oletusasetusta kääntämällä ydin uudelleen muokatulla kokoonpanolla (tätä vaihtoehtoa suositellaan vain, jos käytät mukautettua ydintä):

  • Jos haluat määrittää aina oletuksena, käytä:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Aseta madvise oletukseksi käyttämällä:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Osa 2: HugePagesin edut ja haitat

Yritämme valikoivasti selittää Hugepagesin käytön edut, haitat ja mahdolliset sudenkuopat. Koska teknisesti monimutkaista ja pedanttista artikkelia on todennäköisesti vaikea ymmärtää ihmisille, jotka ovat harhaanjohtavia uskomaan, että Hugepages on ihmelääke, uhraan tarkkuuden yksinkertaisuuden vuoksi. On vain syytä pitää mielessä, että monet aiheet ovat todella monimutkaisia ​​ja siksi suuresti yksinkertaistettuja.

Huomaa, että puhumme 64-bittisistä x86-järjestelmistä, jotka käyttävät Linuxia, ja oletan yksinkertaisesti, että järjestelmä tukee läpinäkyviä suuria sivuja (koska ei ole haitta, että suuria sivuja ei kirjoiteta päälle), kuten lähes kaikissa nykyaikaisissa Linuxeissa ympäristöön.

Liitän alla oleviin linkkeihin lisää teknisiä kuvauksia.

Virtuaalimuisti

Jos olet C++-ohjelmoija, tiedät, että muistissa olevilla objekteilla on tietyt osoitteet (osoitinarvot).

Nämä osoitteet eivät kuitenkaan välttämättä heijasta muistissa olevia fyysisiä osoitteita (RAM-osoitteita). Ne edustavat osoitteita virtuaalimuistissa. Prosessorissa on erityinen MMU (memory management unit) -moduuli, joka auttaa ydintä yhdistämään virtuaalimuistin fyysiseen sijaintiin.

Tällä lähestymistavalla on monia etuja, mutta tärkeimmät ovat:

  • Suorituskyky (eri syistä);
  • Ohjelman eristäminen, eli mikään ohjelma ei voi lukea toisen ohjelman muistista.

Mitä sivut ovat?

Virtuaalimuisti on jaettu sivuihin. Jokainen yksittäinen sivu osoittaa tiettyyn fyysiseen muistiin, se voi osoittaa alueeseen RAM-muistissa tai se voi osoittaa osoitteeseen, joka on määritetty fyysiselle laitteelle, kuten näytönohjaimelle.

Suurin osa käsittelemistäsi sivuista osoittaa joko RAM-muistiin tai ne vaihdetaan, mikä tarkoittaa, että ne on tallennettu kiintolevyllesi tai SSD-levyllesi. Ydin hallitsee kunkin sivun fyysistä asettelua. Jos väärennetty sivu avataan, ydin pysäyttää säikeen, joka yrittää käyttää muistia, lukee sivun kiintolevyltä/SSD-levyltä RAM-muistiin ja jatkaa sitten säikeen suorittamista.

Tämä prosessi on läpinäkyvä stream, eli se ei välttämättä lue suoraan HDD/SSD-levyltä. Normaalien sivujen koko on 4096 tavua. Valtavien sivujen koko on 2 megatavua.

Käännösassosiaatiopuskuri (TLB)

Kun ohjelma hakee muistisivua, CPU:n on tiedettävä, miltä fyysiseltä sivulta tietoja tulee lukea (eli sillä on oltava virtuaalinen osoitekartta).

Ytimessä on tietorakenne (sivutaulukko), joka sisältää kaikki tiedot käytettävistä sivuista. Tämän tietorakenteen avulla voit yhdistää virtuaalisen osoitteen fyysiseen osoitteeseen.

Sivutaulukko on kuitenkin melko monimutkainen ja hidas, joten emme yksinkertaisesti voi analysoida koko tietorakennetta aina, kun prosessi käyttää muistia.

Onneksi prosessorissamme on TLB, joka tallentaa virtuaalisten ja fyysisten osoitteiden välisen kartoituksen. Tämä tarkoittaa, että vaikka meidän on jäsennettävä sivutaulukko ensimmäisellä pääsyyrityksellä, kaikki myöhemmät sivun käyttökerrat voidaan käsitellä TLB:ssä, mikä mahdollistaa nopean toiminnan.

Koska se on toteutettu fyysisenä laitteena (mikä tekee siitä ensinnäkin nopean), sen kapasiteetti on rajallinen. Joten jos haluat käyttää useampia sivuja, TLB ei pysty tallentamaan niiden kaikkien kartoituksia, jolloin ohjelmasi toimii paljon hitaammin.

Hugepages tulee apuun

Mitä voimme tehdä välttääksemme TLB-ylivuodon? (Oletamme, että ohjelma tarvitsee edelleen saman määrän muistia).

Tässä Hugepages tulee mukaan. Sen sijaan, että 4096 tavua vaatisi vain yhden TLB-merkinnän, yksi TLB-merkintä voi nyt osoittaa huikeat 2 megatavua. Oletetaan, että TLB:ssä on 512 merkintää, tässä ilman Hugepages-sivuja voimme vastata:

4096 b⋅512=2 MB

Miten voimme sitten verrata niitä:

2 MB⋅512=1 GB

Tästä syystä Hugepages on mahtava. Ne voivat parantaa tuottavuutta ilman paljon vaivaa. Mutta tässä on merkittäviä varoituksia.

Valtavien sivujen huijausta

Ydin valvoo automaattisesti, kuinka usein kutakin muistisivua käytetään. Jos fyysistä muistia (RAM) ei ole tarpeeksi, ydin siirtää vähemmän tärkeät (harvemmin käytetyt) sivut kiintolevylle vapauttaakseen RAM-muistia tärkeimmille sivuille.
Periaatteessa sama pätee Hugepagesiin. Ydin voi kuitenkin vaihtaa vain kokonaisia ​​sivuja, ei yksittäisiä tavuja.

Oletetaan, että meillä on tällainen ohjelma:

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

Tässä tapauksessa ytimen on korvattava (luettava) jopa 2 megatavua tietoa kiintolevyltä/SSD-levyltä, jotta voit lukea yhden tavun. Kuten tavallisilla sivuilla, vain 4096 tavua tarvitsee lukea kiintolevyltä/SSD:ltä.

Siksi, jos valtava sivu ohitetaan, se on nopeampi lukea vain, jos sinun on käytettävä koko sivua. Tämä tarkoittaa, että jos yrität käyttää satunnaisesti erilaisia ​​muistin osia ja luet vain muutaman kilotavun, sinun tulee käyttää tavallisia sivuja eikä murehtia mistään muusta.

Toisaalta, jos sinun on käytettävä suurta osaa muistista peräkkäin, valtavat sivut parantavat suorituskykyäsi. Sinun on kuitenkin testattava se itse (ei abstraktilla ohjelmistolla) ja katsottava, mikä toimii nopeammin.

Varaus muistissa

Jos kirjoitat C, tiedät, että voit pyytää mielivaltaisen pieniä (tai melkein mielivaltaisen suuria) muistimääriä kasasta käyttämällä malloc(). Oletetaan, että tarvitset 30 tavua muistia:

char* mymemory = malloc(30);

Ohjelmoijalle saattaa näyttää siltä, ​​että "pyydät" 30 tavua muistia käyttöjärjestelmästä ja palautat osoittimen johonkin virtuaalimuistiin. Mutta oikeasti malloc () on vain C-funktio, joka kutsuu funktion sisältä brk ja sbrk pyytää tai vapauttaa muistia käyttöjärjestelmästä.

Kuitenkin yhä enemmän muistin pyytäminen jokaiselle varaukselle on tehotonta; todennäköisimmin jokin muistisegmentti on jo vapautettu (free()), ja voimme käyttää sitä uudelleen. malloc() toteuttaa melko monimutkaisia ​​algoritmeja vapautuneen muistin uudelleenkäyttöön.

Samalla kaikki tapahtuu sinulle huomaamatta, joten miksi sen pitäisi huolestua? Mutta koska haaste free() ei tarkoita sitä muisti palautetaan välittömästi käyttöjärjestelmään.

On olemassa sellainen asia kuin muistin pirstoutuminen. Äärimmäisissä tapauksissa on kasosegmenttejä, joissa käytetään vain muutama tavu, kun taas kaikki siltä väliltä on vapautettu (free()).

Huomaa, että muistin pirstoutuminen on uskomattoman monimutkainen aihe, ja jopa pienilläkin ohjelman muutoksilla voi olla merkittävä vaikutus. Useimmissa tapauksissa ohjelmat eivät aiheuta merkittävää muistin pirstoutumista, mutta sinun tulee olla tietoinen siitä, että jos jollakin kasan alueella on pirstoutumisongelma, suuret sivut voivat pahentaa tilannetta.

Valikoiva suurien sivujen käyttö

Luettuasi artikkelin olet päättänyt, mitkä ohjelmasi osat voivat hyötyä valtavien sivujen käytöstä ja mitkä eivät. Pitäisikö valtavat sivut siis ottaa käyttöön?

Onneksi voit käyttää madvise()sallia valtava sivutus vain niille muistialueille, joissa se olisi hyödyllistä.

Tarkista ensin, että hugepages toimii madvise()-tilassa käyttämällä ohjeet artikkelin alussa.

Käytä sitten madvise()kertoaksesi ytimelle tarkalleen, missä suuria sivuja tulee käyttää.

#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)

Huomaa, että tämä menetelmä on yksinkertaisesti neuvo ytimelle muistin hallinnassa. Tämä ei tarkoita, että ydin käyttää automaattisesti valtavia sivuja tietylle muistille.

Katso dokumentaatio (manpage)madvisesaadaksesi lisätietoja muistinhallinnasta ja madvise(), tällä aiheella on uskomattoman jyrkkä oppimiskäyrä. Joten jos aiot oppia siinä todella hyväksi, valmistaudu lukemaan ja testaamaan muutaman viikon ajan, ennen kuin odotat positiivisia tuloksia.

Mitä lukea?

On kysymys? Kirjoita kommentteihin!

Lähde: will.com

Lisää kommentti