Voor- en nadele van HugePages

Voor- en nadele van HugePages

Vertaling van die artikel wat voorberei is vir studente van die kursus "Linux Administrateur".

Voorheen het ek gepraat oor hoe om Hugepages op Linux te toets en te aktiveer.
Hierdie artikel sal slegs nuttig wees as jy werklik 'n plek het om Hugepages te gebruik. Ek het baie mense ontmoet wat geflous word deur die vooruitsig dat Hugepages produktiwiteit magies sal verbeter. Hugepaging is egter 'n komplekse onderwerp en kan prestasie verswak as dit verkeerd gebruik word.

Deel 1: Verifieer dat groot bladsye op Linux geaktiveer is (oorspronklike hier)

probleem:
Jy moet kyk of HugePages op jou stelsel geaktiveer is.

oplossing:
Dit is redelik eenvoudig:

cat /sys/kernel/mm/transparent_hugepage/enabled

Jy sal so iets kry:

always [madvise] never

Jy sal 'n lys van beskikbare opsies sien (altyd, gek, nooit), en die tans aktiewe opsie sal tussen hakies ingesluit word (by verstek malvise).

malvise beteken dat transparent hugepages slegs geaktiveer vir geheue-areas wat uitdruklik groot bladsye gebruik madvise (2).

altyd beteken dat transparent hugepages altyd geaktiveer vir alle prosesse. Dit verbeter gewoonlik werkverrigting, maar as jy 'n gebruiksgeval het waar baie prosesse 'n klein hoeveelheid geheue verbruik, dan kan die algehele geheuelading dramaties toeneem.

nooit beteken dat transparent hugepages sal nie ingesluit word nie, selfs wanneer dit versoek word met behulp van madvise. Om meer uit te vind, kontak dokumentasie Linux-kerne.

Hoe om die verstekwaarde te verander

Opsie 1: Verander direk sysfs (na herselflaai sal die parameter terugkeer na sy verstekwaarde):

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

Opsie 2: Verander die stelsel verstek deur die kern saam te stel met 'n gewysigde konfigurasie (hierdie opsie word slegs aanbeveel as jy 'n pasgemaakte kern gebruik):

  • Om altyd by verstek te stel, gebruik:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Om madvise as verstek te stel, gebruik:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Deel 2: Voor- en nadele van HugePages

Ons sal probeer om die voordele, nadele en moontlike slaggate van die gebruik van Hugepages selektief te verduidelik. Aangesien 'n tegnologies komplekse en pedantiese artikel waarskynlik moeilik sal wees om te verstaan ​​vir mense wat mislei word om te dink dat Hugepages 'n wondermiddel is, sal ek akkuraatheid opoffer vir eenvoud. Dit is net die moeite werd om in gedagte te hou dat baie van die onderwerpe regtig kompleks is en dus baie vereenvoudig is.

Neem asseblief kennis dat ons praat van 64-bis x86-stelsels wat Linux gebruik, en dat ek bloot aanvaar dat die stelsel deursigtige grootbladsye ondersteun (aangesien dit nie 'n nadeel is dat groot bladsye nie oorskryf word nie), soos die geval is in byna enige moderne Linux omgewing.

Ek sal meer tegniese beskrywing in die skakels hieronder aanheg.

Virtuele geheue

As jy 'n C++ programmeerder is, weet jy dat voorwerpe in die geheue spesifieke adresse (wyserwaardes) het.

Hierdie adresse weerspieël egter nie noodwendig fisiese adresse in die geheue (RAM-adresse) nie. Hulle verteenwoordig adresse in virtuele geheue. Die verwerker het 'n spesiale MMU (geheuebestuurseenheid)-module wat die kern help om virtuele geheue na 'n fisiese ligging te karteer.

Hierdie benadering het baie voordele, maar die belangrikste is:

  • Prestasie (om verskeie redes);
  • Programisolasie, dit wil sê, geen program kan uit die geheue van 'n ander program lees nie.

Wat is bladsye?

Virtuele geheue word in bladsye verdeel. Elke individuele bladsy wys na 'n spesifieke fisiese geheue, dit kan na 'n area in RAM wys, of dit kan verwys na 'n adres wat aan 'n fisiese toestel toegeken is, soos 'n videokaart.

Die meeste van die bladsye waarmee jy te doen het, wys óf na RAM óf word omgeruil, wat beteken dat hulle op jou hardeskyf of SSD gestoor word. Die kern bestuur die fisiese uitleg van elke bladsy. As 'n bedrieglike bladsy verkry word, stop die kern die draad wat probeer om toegang tot die geheue te kry, lees die bladsy vanaf die hardeskyf/SSD in RAM, en gaan dan voort om die draad uit te voer.

Hierdie proses is stroomdeursigtig, wat beteken dat dit nie noodwendig direk vanaf die HDD/SSD lees nie. Die grootte van normale bladsye is 4096 grepe. Groot bladsye is 2 megagrepe.

Vertaling-assosiatiewe buffer (TLB)

Wanneer 'n program toegang tot 'n bladsy van geheue verkry, moet die SVE weet van watter fisiese bladsy om data te lees (dit wil sê, 'n virtuele adreskaart hê).

Die kern het 'n datastruktuur (bladsytabel) wat al die inligting bevat oor die bladsye wat gebruik word. Deur hierdie datastruktuur te gebruik, kan jy 'n virtuele adres na 'n fisiese adres karteer.

Die bladsytabel is egter redelik kompleks en stadig, so ons kan eenvoudig nie die hele datastruktuur ontleed elke keer as 'n proses toegang tot geheue kry nie.

Gelukkig het ons verwerker 'n TLB wat die kartering tussen virtuele en fisiese adresse kas. Dit beteken dat alhoewel ons die bladsytabel met die eerste toegangspoging moet ontleed, alle daaropvolgende toegang tot die bladsy in die TLB hanteer kan word, wat vinnige werking moontlik maak.

Omdat dit as 'n fisiese toestel geïmplementeer word (wat dit in die eerste plek vinnig maak), is sy kapasiteit beperk. As jy dus toegang tot meer bladsye wil hê, sal die TLB nie kaarte vir almal kan stoor nie, wat veroorsaak dat jou program baie stadiger loop.

Hugepages kom tot die redding

So, wat kan ons doen om TLB-oorloop te vermy? (Ons neem aan die program benodig nog dieselfde hoeveelheid geheue).

Dit is waar Hugepages inkom. In plaas daarvan dat 4096 grepe net een TLB-inskrywing benodig, kan een TLB-inskrywing nou na 'n yslike 2 megagrepe wys. Kom ons neem aan die TLB het 512 inskrywings, hier sonder Hugepages kan ons ooreenstem:

4096 b⋅512=2 MB

Hoe kan ons dan met hulle vergelyk:

2 MB⋅512=1 GB

Dit is hoekom Hugepages fantasties is. Hulle kan produktiwiteit verbeter sonder veel moeite. Maar hier is beduidende waarskuwings.

Hugepages spoofing

Die kern monitor outomaties hoe gereeld elke geheuebladsy gebruik word. As daar nie genoeg fisiese geheue (RAM) is nie, sal die kern minder belangrike (minder gereeld gebruik) bladsye na die hardeskyf skuif om 'n bietjie RAM vir meer belangrike bladsye vry te maak.
In beginsel geld dieselfde vir Hugepages. Die kern kan egter net hele bladsye ruil, nie individuele grepe nie.

Kom ons sê ons het 'n program soos hierdie:

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

In hierdie geval sal die kern soveel as 2 megagrepe se inligting vanaf die hardeskyf/SSD moet vervang (lees) net sodat jy een greep kan lees. Wat gewone bladsye betref, hoef slegs 4096 grepe vanaf die hardeskyf/SSD gelees te word.

As groot bladsy dus oorskryf word, is dit net vinniger om te lees as jy toegang tot die hele bladsy moet kry. Dit beteken dat as jy probeer om lukraak toegang tot verskillende dele van geheue te kry en net 'n paar kilogrepe lees, moet jy gewone bladsye gebruik en nie oor enigiets anders bekommer nie.

Aan die ander kant, as jy opeenvolgend toegang tot 'n groot gedeelte van die geheue moet kry, sal groot bladsye jou werkverrigting verbeter. Jy moet dit egter self toets (nie met abstrakte sagteware nie) en kyk wat vinniger werk.

Toekenning in geheue

As jy C skryf, weet jy dat jy arbitrêr klein (of amper arbitrêr groot) hoeveelhede geheue van die hoop kan aanvra deur malloc(). Kom ons sê jy benodig 30 grepe geheue:

char* mymemory = malloc(30);

Vir 'n programmeerder kan dit voorkom asof jy 30 grepe geheue van die bedryfstelsel "versoek" en 'n wyser na die een of ander virtuele geheue terugstuur. Maar eintlik malloc () is net 'n C-funksie wat van binne die funksie oproep brk en sbrk om geheue van die bedryfstelsel te versoek of vry te maak.

Dit is egter ondoeltreffend om meer en meer geheue vir elke toekenning aan te vra; dit is heel waarskynlik dat een of ander geheuesegment reeds vrygestel is (free()), en ons kan dit hergebruik. malloc() implementeer redelik komplekse algoritmes vir die hergebruik van vrygestelde geheue.

Terselfdertyd gebeur alles ongemerk vir jou, so hoekom moet dit jou bekommer? Maar omdat die uitdaging free() beteken dit nie geheue word noodwendig onmiddellik na die bedryfstelsel teruggestuur.

Daar is iets soos geheuefragmentasie. In uiterste gevalle is daar hoopsegmente waar slegs 'n paar grepe gebruik word, terwyl alles tussenin bevry is (free()).

Neem asseblief kennis dat geheuefragmentasie 'n ongelooflike komplekse onderwerp is, en selfs geringe veranderinge aan 'n program kan 'n beduidende impak hê. In die meeste gevalle sal programme nie beduidende geheuefragmentasie veroorsaak nie, maar u moet bewus wees dat as daar 'n probleem met fragmentasie in 'n sekere area van die hoop is, groot bladsye die situasie kan vererger.

Selektiewe gebruik van groot bladsye

Nadat u die artikel gelees het, het u vasgestel watter dele van u program kan baat by die gebruik van groot bladsye en watter nie. Moet groot bladsye dus enigsins geaktiveer word?

Gelukkig kan jy gebruik madvise()om groot epaging slegs vir daardie geheueareas moontlik te maak waar dit nuttig sou wees.

Maak eers seker dat hugepages in madvise()-modus loop met behulp van instruksies aan die begin van die artikel.

Gebruik dan madvise()om die kern presies te vertel waar om groot bladsye te gebruik.

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

Let daarop dat hierdie metode bloot advies aan die kern is oor hoe om geheue te bestuur. Dit beteken nie dat die kern outomaties groot bladsye vir 'n gegewe geheue sal gebruik nie.

Verwys na dokumentasie (manpage)madviseom meer te wete te kom oor geheuebestuur en madvise(), hierdie onderwerp het 'n ongelooflike steil leerkurwe. As jy dus van plan is om regtig goed daarmee te word, berei voor om vir 'n paar weke te lees en te toets voordat jy enige positiewe resultate verwag.

Wat om te lees?

Het jy 'n vraag? Skryf in die kommentaar!

Bron: will.com

Voeg 'n opmerking