Manteision ac Anfanteision HugePages

Manteision ac Anfanteision HugePages

Cyfieithiad o'r erthygl a baratowyd ar gyfer myfyrwyr cwrs "Gweinyddwr Linux".

Yn flaenorol, siaradais am sut i brofi a galluogi Hugepages ar Linux.
Dim ond os oes gennych chi le i ddefnyddio Hugepages y bydd yr erthygl hon yn ddefnyddiol. Rwyf wedi cyfarfod â llawer o bobl sy'n cael eu twyllo gan y posibilrwydd y bydd Hugepages yn gwella cynhyrchiant yn hudol. Fodd bynnag, mae hugepaging yn bwnc cymhleth a gall ddiraddio perfformiad os caiff ei ddefnyddio'n anghywir.

Rhan 1: Gwirio bod tudalennau anferth wedi'u galluogi ar Linux (gwreiddiol yma)

Problem:
Mae angen i chi wirio a yw HugePages wedi'i alluogi ar eich system.

ateb:
Mae'n eithaf syml:

cat /sys/kernel/mm/transparent_hugepage/enabled

Byddwch yn cael rhywbeth fel hyn:

always [madvise] never

Fe welwch restr o opsiynau sydd ar gael (bob amser, madvise, byth), a bydd yr opsiwn gweithredol presennol yn cael ei amgáu mewn cromfachau (yn ddiofyn madvise).

madvise yn golygu hynny transparent hugepages wedi'i alluogi yn unig ar gyfer ardaloedd cof sy'n gofyn yn benodol am ddefnyddio tudalennau enfawr madvise(2).

bob amser yn yn golygu hynny transparent hugepages wedi'i alluogi bob amser ar gyfer pob proses. Mae hyn fel arfer yn gwella perfformiad, ond os oes gennych achos defnydd lle mae llawer o brosesau'n defnyddio ychydig bach o gof, yna gall y llwyth cof cyffredinol gynyddu'n ddramatig.

byth yn golygu hynny transparent hugepages ni chaiff ei gynnwys hyd yn oed pan ofynnir amdano gan ddefnyddio madvise. I gael gwybod mwy, cysylltwch dogfennaeth Cnewyllyn Linux.

Sut i newid y gwerth diofyn

Opsiwn 1: Newid yn uniongyrchol sysfs (ar ôl ailgychwyn bydd y paramedr yn dychwelyd i'w werth diofyn):

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

Opsiwn 2: Newidiwch ragosodiad y system trwy ail-grynhoi'r cnewyllyn gyda chyfluniad wedi'i addasu (dim ond os ydych chi'n defnyddio cnewyllyn wedi'i addasu yr argymhellir yr opsiwn hwn):

  • I osod bob amser yn ddiofyn, defnyddiwch:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • I osod madvise fel rhagosodiad, defnyddiwch:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Rhan 2: Manteision ac Anfanteision Tudalennau Anferth

Byddwn yn ceisio esbonio'n ddetholus fanteision, anfanteision a pheryglon posibl defnyddio Hugepages. Gan y bydd erthygl dechnegol gymhleth a phedantig yn debygol o fod yn anodd ei deall i bobl sy'n cael eu twyllo i feddwl bod Hugepages yn ateb i bob problem, byddaf yn aberthu cywirdeb er mwyn symlrwydd. Mae'n werth cofio bod llawer o'r pynciau'n wirioneddol gymhleth ac felly wedi'u symleiddio'n fawr.

Sylwch ein bod yn sôn am systemau 64-bit x86 sy'n rhedeg Linux, a fy mod yn cymryd yn ganiataol bod y system yn cefnogi tudalennau anferth tryloyw (gan nad yw'n anfantais nad yw tudalennau enfawr yn cael eu trosysgrifo), fel sy'n wir mewn bron unrhyw Linux modern Amgylchedd.

Atodaf ddisgrifiad mwy technegol yn y dolenni isod.

Cof Rhith

Os ydych chi'n rhaglennydd C++, rydych chi'n gwybod bod gan wrthrychau yn y cof gyfeiriadau penodol (gwerthoedd pwyntydd).

Fodd bynnag, nid yw'r cyfeiriadau hyn o reidrwydd yn adlewyrchu cyfeiriadau corfforol yn y cof (cyfeiriadau RAM). Maent yn cynrychioli cyfeiriadau mewn cof rhithwir. Mae gan y prosesydd fodiwl MMU (uned rheoli cof) arbennig sy'n helpu'r cnewyllyn i fapio cof rhithwir i leoliad ffisegol.

Mae gan y dull hwn lawer o fanteision, ond y rhai pwysicaf yw:

  • Perfformiad (am wahanol resymau);
  • Ynysu rhaglen, hynny yw, ni all unrhyw raglen ddarllen o gof rhaglen arall.

Beth yw tudalennau?

Rhennir cof rhithwir yn dudalennau. Mae pob tudalen unigol yn pwyntio at gof corfforol penodol, gall bwyntio at ardal yn RAM, neu gall bwyntio at gyfeiriad a neilltuwyd i ddyfais gorfforol, fel cerdyn fideo.

Mae'r rhan fwyaf o'r tudalennau rydych chi'n delio â nhw naill ai'n cyfeirio at RAM neu'n cael eu cyfnewid, sy'n golygu eu bod yn cael eu storio ar eich gyriant caled neu SSD. Mae'r cnewyllyn yn rheoli cynllun ffisegol pob tudalen. Os cyrchir tudalen ffug, mae'r cnewyllyn yn atal yr edefyn sy'n ceisio cyrchu'r cof, yn darllen y dudalen o'r gyriant caled / SSD i RAM, ac yna'n parhau i weithredu'r edefyn.

Mae'r broses hon yn ffrwd dryloyw, sy'n golygu nad yw o reidrwydd yn darllen yn uniongyrchol o'r HDD/SSD. Maint tudalennau arferol yw 4096 beit. Maint tudalennau enfawr yw 2 megabeit.

Clustog Cyfieithu-Cysylltiadol (TLB)

Pan fydd rhaglen yn cyrchu tudalen o gof, rhaid i'r CPU wybod o ba dudalen ffisegol i ddarllen data (hynny yw, cael map cyfeiriad rhithwir).

Mae gan y cnewyllyn strwythur data (tabl tudalen) sy'n cynnwys yr holl wybodaeth am y tudalennau sy'n cael eu defnyddio. Gan ddefnyddio'r strwythur data hwn, gallwch fapio cyfeiriad rhithwir i gyfeiriad ffisegol.

Fodd bynnag, mae'r tabl tudalen yn eithaf cymhleth ac araf, felly ni allwn ddadansoddi'r strwythur data cyfan bob tro y bydd proses yn cyrchu cof.

Yn ffodus, mae gan ein prosesydd TLB sy'n storio'r mapio rhwng cyfeiriadau rhithwir a chorfforol. Mae hyn yn golygu, er bod angen i ni ddosrannu'r tabl tudalen ar yr ymgais mynediad cyntaf, y gellir trin pob mynediad dilynol i'r dudalen yn y TLB, gan ganiatáu ar gyfer gweithrediad cyflym.

Oherwydd ei fod yn cael ei weithredu fel dyfais gorfforol (sy'n ei gwneud yn gyflym yn y lle cyntaf), mae ei allu yn gyfyngedig. Felly os ydych chi eisiau cyrchu mwy o dudalennau, ni fydd y TLB yn gallu storio mapiau ar gyfer pob un ohonynt, gan achosi i'ch rhaglen redeg yn llawer arafach.

Daw Hugepages i'r adwy

Felly beth allwn ni ei wneud i osgoi gorlif TLB? (Rydym yn tybio bod angen yr un faint o gof o hyd ar y rhaglen).

Dyma lle mae Hugepages yn dod i mewn. Yn lle 4096 beit sydd angen un cofnod TLB yn unig, gall un cofnod TLB nawr bwyntio at 2 megabeit syfrdanol. Gadewch i ni dybio bod gan y TLB 512 o gofnodion, yma heb Hugepages gallwn ni baru:

4096 b⋅512=2 MB

Yna sut allwn ni gymharu â nhw:

2 MB⋅512=1 GB

Dyma pam mae Hugepages yn anhygoel. Gallant wella cynhyrchiant heb lawer o ymdrech. Ond mae rhybuddion sylweddol yma.

Tudalennau enfawr yn spoofing

Mae'r cnewyllyn yn monitro'n awtomatig pa mor aml y defnyddir pob tudalen cof. Os nad oes digon o gof corfforol (RAM), bydd y cnewyllyn yn symud tudalennau llai pwysig (a ddefnyddir yn llai aml) i'r ddisg galed i ryddhau rhywfaint o RAM ar gyfer tudalennau pwysicach.
Mewn egwyddor, mae'r un peth yn wir am Hugepages. Fodd bynnag, dim ond tudalennau cyfan y gall y cnewyllyn eu cyfnewid, nid beit unigol.

Gadewch i ni ddweud bod gennym ni raglen fel hon:

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

Yn yr achos hwn, bydd angen i'r cnewyllyn ddisodli (darllen) cymaint â 2 megabeit o wybodaeth o'r gyriant caled / SSD dim ond i chi ddarllen un beit. Fel ar gyfer tudalennau rheolaidd, dim ond 4096 beit sydd angen eu darllen o'r gyriant caled / SSD.

Felly, os caiff tudalen enfawr ei diystyru, dim ond yn gyflymach i'w darllen os oes angen i chi gael mynediad i'r dudalen gyfan. Mae hyn yn golygu, os ydych chi'n ceisio cyrchu gwahanol rannau o'r cof ar hap a'ch bod chi'n darllen ychydig o kilobytes yn unig, dylech chi ddefnyddio tudalennau rheolaidd a pheidio â phoeni am unrhyw beth arall.

Ar y llaw arall, os oes angen i chi gael mynediad at gyfran fawr o'r cof yn ddilyniannol, bydd tudalennau anferth yn gwella'ch perfformiad. Fodd bynnag, mae angen i chi ei brofi eich hun (nid gyda meddalwedd haniaethol) a gweld beth sy'n gweithio'n gyflymach.

Dyraniad er cof

Os ydych chi'n ysgrifennu C, rydych chi'n gwybod y gallwch chi ofyn am symiau bach o gof (neu bron yn fympwyol) o'r domen gan ddefnyddio malloc(). Gadewch i ni ddweud bod angen 30 beit o gof arnoch chi:

char* mymemory = malloc(30);

I raglennydd, gall ymddangos eich bod yn “gofyn” 30 beit o gof o'r system weithredu ac yn dychwelyd pwyntydd i rywfaint o gof rhithwir. Ond mewn gwirionedd malloc () yn swyddogaeth C yn unig sy'n galw o'r tu mewn i'r swyddogaeth brk a sbrk i ofyn am neu ryddhau cof o'r system weithredu.

Fodd bynnag, mae gofyn am fwy a mwy o gof ar gyfer pob dyraniad yn aneffeithlon; mae'n fwyaf tebygol bod rhywfaint o segment cof eisoes wedi'i ryddhau (free()), a gallwn ei ailddefnyddio. malloc() yn gweithredu algorithmau eithaf cymhleth ar gyfer ailddefnyddio cof rhydd.

Ar yr un pryd, mae popeth yn digwydd heb i neb sylwi, felly pam ddylai eich poeni chi? Ond oherwydd yr her free() nid yw'n golygu hynny mae cof o reidrwydd yn cael ei ddychwelyd ar unwaith i'r system weithredu.

Mae y fath beth â darnio cof. Mewn achosion eithafol, mae yna segmentau pentwr lle dim ond ychydig o beitau sy'n cael eu defnyddio, tra bod popeth rhyngddynt wedi'i ryddhau (free()).

Sylwch fod darnio cof yn bwnc hynod gymhleth, a gall hyd yn oed mân newidiadau i raglen gael effaith sylweddol. Yn y rhan fwyaf o achosion, ni fydd rhaglenni'n achosi darnio cof sylweddol, ond dylech fod yn ymwybodol, os oes problem gyda darnio mewn rhyw ardal o'r domen, gall tudalennau anferth wneud y sefyllfa'n waeth.

Defnydd detholus o dudalennau anferth

Ar ôl darllen yr erthygl hon, rydych chi wedi penderfynu pa rannau o'ch rhaglen all elwa o ddefnyddio hugepages a pha rai na allant. Felly a ddylai hugepages gael eu galluogi o gwbl?

Yn ffodus gallwch chi ddefnyddio madvise()i alluogi hugepaging dim ond ar gyfer y meysydd cof hynny lle byddai'n ddefnyddiol.

Yn gyntaf, gwiriwch fod hugepages yn rhedeg yn y modd madvise () gan ddefnyddio cyfarwyddiadau ar ddechrau'r erthygl.

Yna, defnyddiwch madvise()i ddweud wrth y cnewyllyn yn union ble i ddefnyddio 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)

Sylwch mai cyngor syml i'r cnewyllyn ar sut i reoli cof yw'r dull hwn. Nid yw hyn yn golygu y bydd y cnewyllyn yn defnyddio tudalennau anferth yn awtomatig ar gyfer cof penodol.

Cyfeiriwch at y ddogfennaeth (manpage)madvisei ddysgu mwy am reoli cof a madvise(), mae gan y pwnc hwn gromlin ddysgu hynod o serth. Felly os ydych chi'n bwriadu gwneud yn dda iawn, paratowch i ddarllen a phrofi am ychydig wythnosau cyn i chi ddisgwyl unrhyw ganlyniadau cadarnhaol.

Beth i'w ddarllen?

Oes gennych chi gwestiwn? Ysgrifennwch yn y sylwadau!

Ffynhonnell: hab.com

Ychwanegu sylw