Buntáistí agus Míbhuntáistí HugePages

Buntáistí agus Míbhuntáistí HugePages

Aistriúchán ar an alt a ullmhaíodh do mhic léinn an chúrsa "Riarthóir Linux".

Roimhe seo, labhair mé faoi conas Hugepages ar Linux a thástáil agus a chumasú.
Ní bheidh an t-alt seo úsáideach ach amháin má tá áit agat chun Hugepages a úsáid. Chas mé le go leor daoine atá meallta ag an ionchas go bhfeabhsóidh Hugepages táirgiúlacht go draíochta. Mar sin féin, is ábhar casta í an phábháil ollmhór agus féadann sé feidhmíocht a dhíghrádú má úsáidtear go mícheart é.

Cuid 1: Ag fíorú go bhfuil leathanaigh ollmhóra cumasaithe ar Linux (bunaidh anseo)

Fadhb:
Ní mór duit seiceáil an bhfuil HugePages cumasaithe ar do chóras.

réiteach:
Tá sé simplí go leor:

cat /sys/kernel/mm/transparent_hugepage/enabled

Gheobhaidh tú rud mar seo:

always [madvise] never

Feicfidh tú liosta de na roghanna atá ar fáil (i gcónaí, madvise, riamh), agus beidh an rogha atá gníomhach faoi láthair faoi iamh i lúibíní (de réir réamhshocraithe madvise).

madvise ciallaíonn sin transparent hugepages cumasaithe ach amháin le haghaidh réimsí cuimhne a iarrann go sainráite leathanaigh ollmhóra ag baint úsáide as madvise(2).

i gcónaí ciallaíonn sin transparent hugepages cumasaithe i gcónaí do gach próiseas. Feabhsaíonn sé seo feidhmíocht de ghnáth, ach má tá cás úsáide agat ina n-ídíonn go leor próiseas méid beag cuimhne, is féidir go dtiocfaidh méadú suntasach ar an ualach cuimhne iomlán.

riamh ciallaíonn sin transparent hugepages ní chuirfear san áireamh fiú nuair a iarrtar é ag baint úsáide as madvise. Chun tuilleadh a fháil amach, déan teagmháil le doiciméadú Eithne Linux.

Conas an luach réamhshocraithe a athrú

Rogha 1: Athrú go díreach sysfs (tar éis atosaithe fillfidh an paraiméadar ar a luach réamhshocraithe):

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

Rogha 2: Athraigh réamhshocrú an chórais tríd an eithne a ath-thiomsú le cumraíocht mhodhnaithe (ní mholtar an rogha seo ach amháin má tá eithne saincheaptha in úsáid agat):

  • Chun socrú i gcónaí de réir réamhshocraithe, úsáid:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Chun madvise a shocrú mar réamhshocrú, úsáid:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Cuid 2: Buntáistí agus Míbhuntáistí Leathanaigh Ollmhór

Déanfaimid iarracht na buntáistí, na míbhuntáistí agus na contúirtí a d'fhéadfadh a bheith ann maidir le Hugepages a úsáid a mhíniú go roghnach. Ós rud é go mbeidh sé deacair airteagal atá casta ó thaobh na teicneolaíochta de agus pedantic a thuiscint do dhaoine atá meallta ag smaoineamh gur uile-íoc é Hugepages, íobairteoidh mé cruinneas ar mhaithe le simplíocht. Is fiú a mheabhrú go bhfuil go leor de na topaicí fíor-chasta agus dá bhrí sin simplithe go mór.

Tabhair faoi deara le do thoil go bhfuil muid ag caint faoi chórais 64-giotán x86 ag rith Linux, agus go bhfuil mé ag glacadh leis go simplí go dtacaíonn an córas le leathanaigh ollmhóra trédhearcacha (ós rud é nach míbhuntáiste é nach bhfuil leathanaigh ollmhóra ró-scríofa), mar atá an cás i mbeagnach aon Linux nua-aimseartha. timpeallacht.

Ceanglóidh mé cur síos teicniúil níos mó sna naisc thíos.

Cuimhne Fíorúil

Más ríomhchláraitheoir C++ tú, tá a fhios agat go bhfuil seoltaí sonracha (luachanna pointeora) ag rudaí atá i gcuimhne.

Mar sin féin, ní gá go léiríonn na seoltaí seo seoltaí fisiceacha sa chuimhne (seoltaí RAM). Léiríonn siad seoltaí i gcuimhne fíorúil. Tá modúl speisialta MMU (aonad bainistíochta cuimhne) ag an bpróiseálaí a chuidíonn le léarscáil eithne cuimhne fhíorúil chuig suíomh fisiceach.

Tá go leor buntáistí ag baint leis an gcur chuige seo, ach is iad na cinn is tábhachtaí ná:

  • Feidhmíocht (ar chúiseanna éagsúla);
  • Aonrú cláir, is é sin, ní féidir aon ríomhchlár a léamh ó chuimhne clár eile.

Cad is leathanaigh ann?

Tá cuimhne fhíorúil roinnte ina leathanaigh. Díríonn gach leathanach aonair cuimhne fhisiciúil ar leith, féadfaidh sé achar i RAM a dhíriú, nó is féidir leis seoladh a shanntar d’fheiste fisiciúil a chur in iúl, mar chárta físeáin.

Déanann an chuid is mó de na leathanaigh a ndéileálann tú leo tagairt do RAM nó déantar iad a mhalartú, rud a chiallaíonn go bhfuil siad stóráilte ar do thiomáint crua nó ar SSD. Bainistíonn an eithne leagan amach fisiceach gach leathanach. Má fhaightear rochtain ar leathanach spoofed, stopann an eithne an snáithe atá ag iarraidh rochtain a fháil ar an gcuimhne, léann sé an leathanach ón tiomántán crua/SSD go RAM, agus ansin leanann sé ar aghaidh ag déanamh an tsnáithe.

Tá an próiseas seo sruth-trédhearcach, rud a chiallaíonn nach gá go léann sé go díreach ón HDD/SSD. Is é méid na ngnáthleathanach ná 4096 beart. Is é méid leathanaigh ollmhóra ná 2 meigibheart.

Maolán comhthiomsaitheach aistriúcháin (TLB)

Nuair a fhaigheann clár rochtain ar leathanach cuimhne, ní mór go mbeadh a fhios ag an LAP cén leathanach fisiceach chun sonraí a léamh uaidh (is é sin, léarscáil seoltaí fíorúil a bheith agat).

Tá struchtúr sonraí ag an eithne (tábla leathanach) ina bhfuil an fhaisnéis go léir faoi na leathanaigh atá in úsáid. Ag baint úsáide as an struchtúr sonraí seo, is féidir leat seoladh fíorúil a mhapáil go seoladh fisiceach.

Mar sin féin, tá an tábla leathanaigh sách casta agus mall, mar sin ní féidir linn anailís a dhéanamh ar struchtúr iomlán na sonraí gach uair a fhaigheann próiseas rochtain ar chuimhne.

Go fortunately, tá TLB ag ár bpróiseálaí a dhéanann an léarscáiliú idir seoltaí fíorúla agus fisiceacha a thaisceadh. Ciallaíonn sé seo, cé go gcaithfimid an tábla leathanaigh a pharsáil ar an gcéad iarracht rochtana, is féidir gach rochtain ar an leathanach ina dhiaidh sin a láimhseáil sa TLB, rud a ligeann d'oibriú tapa.

Toisc go gcuirtear i bhfeidhm é mar fheiste fisiceach (rud a fhágann go bhfuil sé go tapa ar an gcéad dul síos), tá a chumas teoranta. Mar sin más mian leat rochtain a fháil ar níos mó leathanach, ní bheidh an TLB in ann mapálacha a stóráil dóibh go léir, rud a fhágann go n-imeoidh do chlár i bhfad níos moille.

Tagann leathanaigh ollmhóra chun tarrthála

Mar sin cad is féidir linn a dhéanamh chun ró-shreabhadh TLB a sheachaint? (Glacaimid leis go bhfuil an méid céanna cuimhne fós ag teastáil ón gclár).

Seo an áit a dtagann Hugepages isteach. In ionad 4096 beart a éilíonn iontráil TLB amháin, is féidir le hiontráil TLB amháin 2 mheigibheart a chur in iúl anois. Glacaimid leis go bhfuil 512 iontráil ag an TLB, anseo gan leathanaigh Ollmhóra is féidir linn a mheaitseáil:

4096 b⋅512=2 MB

Ansin conas is féidir linn comparáid a dhéanamh leo:

2 MB⋅512=1 GB

Sin é an fáth go bhfuil Hugepages uamhnach. Is féidir leo táirgiúlacht a fheabhsú gan mórán iarrachta. Ach tá caveats suntasacha anseo.

Leathanaigh ollmhóra spoofing

Déanann an eithne monatóireacht go huathoibríoch ar cé chomh minic a úsáidtear gach leathanach cuimhne. Mura bhfuil go leor cuimhne fhisiciúil (RAM), bogfaidh an eithne leathanaigh nach bhfuil chomh tábhachtach (nach n-úsáidtear chomh minic) chuig an diosca crua chun roinnt RAM a shaoradh le haghaidh leathanaigh níos tábhachtaí.
I bprionsabal, baineann an rud céanna le Hugepages. Mar sin féin, ní féidir leis an eithne ach leathanaigh iomlána a mhalartú, ní beart aonair.

Ligean le rá go bhfuil clár mar seo againn:

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

Sa chás seo, beidh ar an eithne suas le 2 mheigeavata faisnéise a chur in ionad (léamh) ón tiomántán crua/SSD ionas gur féidir leat beart amháin a léamh. Maidir le leathanaigh rialta, ní gá ach 4096 beart a léamh ón tiomántán crua/SSD.

Mar sin, má sháraítear leathanach ollmhór, ní bheidh sé níos tapúla é a léamh más gá duit an leathanach iomlán a rochtain. Ciallaíonn sé seo má tá tú ag iarraidh rochtain randamach a dhéanamh ar chodanna éagsúla de chuimhne agus nach bhfuil tú ach ag léamh cúpla cilibheart, ba cheart duit leathanaigh rialta a úsáid agus gan a bheith buartha faoi rud ar bith eile.

Ar an láimh eile, más gá duit rochtain a fháil ar chuid mhór den chuimhne go seicheamhach, feabhsóidh leathanaigh mhóra do fheidhmíocht. Mar sin féin, ní mór duit é a thástáil leat féin (ní le bogearraí teibí) agus féach cad a oibríonn níos tapúla.

Leithdháileadh i gcuimhne

Má scríobhann tú C, tá a fhios agat gur féidir leat méideanna cuimhne atá beag (nó beagnach treallach mór) a iarraidh ón gcarn ag baint úsáide as malloc(). Ligean le rá go bhfuil 30 beart de chuimhne ag teastáil uait:

char* mymemory = malloc(30);

Do ríomhchláraitheoir, féadfaidh sé a bheith le feiceáil go bhfuil tú ag “iarraidh” 30 beart cuimhne ón gcóras oibriúcháin agus ag tabhairt pointeoir ar ais chuig cuimhne fhíorúil éigin. Ach i ndáiríre malloc () ach feidhm C a ghlaonn ón taobh istigh den fheidhm brk agus sbrk cuimhne a iarraidh nó a shaoradh ón gcóras oibriúcháin.

Mar sin féin, tá sé neamhéifeachtach cuimhne níos mó agus níos mó a iarraidh le haghaidh gach leithdháilte; is dóichí go bhfuil roinnt teascán cuimhne saortha cheana féin (free()), agus is féidir linn é a athúsáid. malloc() cuireann sé algartam casta go leor i bhfeidhm chun cuimhne shaor a athúsáid.

Ag an am céanna, tarlaíonn gach rud nach dtugtar faoi deara duit, mar sin cén fáth ar chóir dó a bheith buartha duit? Ach mar gheall ar an dúshlán free() ní chiallaíonn sé sin is gá go gcuirfí cuimhne ar ais láithreach chuig an gcóras oibriúcháin.

Tá a leithéid de rud ann agus ilroinnt cuimhne. I gcásanna tromchúiseacha, tá codanna carnacha ann nach n-úsáidtear ach cúpla beart, agus saortar gach rud eatarthu (free()).

Tabhair faoi deara le do thoil gur topaic thar a bheith casta é ilroinnt cuimhne, agus is féidir tionchar suntasach a bheith ag athruithe beaga fiú ar chlár. I bhformhór na gcásanna, ní bheidh cláir ina chúis le ilroinnt cuimhne suntasach, ach ba chóir duit a bheith ar an eolas má tá fadhb le ilroinnt i limistéar éigin den gcarn, is féidir le leathanaigh ollmhóra an scéal a dhéanamh níos measa.

Úsáid roghnach leathanaigh ollmhóra

Tar éis duit an t-alt seo a léamh, tá tú tar éis a chinneadh cé na codanna de do chlár is féidir leas a bhaint as leathanaigh ollmhóra a úsáid agus nach féidir. Mar sin ar chóir leathanaigh mhóra a chumasú ar chor ar bith?

Luckily is féidir leat é a úsáid madvise()chun págáil ollmhór a chumasú ach amháin do na réimsí cuimhne sin ina mbeadh sé úsáideach.

Ar dtús, seiceáil go bhfuil leathanaigh mhóra ag rith i mód madvise() ag baint úsáide as treoracha ag tús an ailt.

Ansin, bain úsáid as madvise()a insint don eithne go díreach nuair is féidir leathanaigh ollmhóra a úsáid.

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

Tabhair faoi deara nach bhfuil sa mhodh seo ach comhairle don eithne maidir le conas cuimhne a bhainistiú. Ní chiallaíonn sé seo go n-úsáidfidh an eithne leathanaigh mhóra go huathoibríoch le haghaidh cuimhne ar leith.

Déan tagairt don doiciméadú (manpage)madvisechun níos mó a fhoghlaim faoi bhainistiú cuimhne agus madvise(), tá cuar foghlama thar a bheith géar ag an ábhar seo. Mar sin má tá sé ar intinn agat éirí go han-mhaith leis, ullmhaigh le léamh agus tástáil a dhéanamh ar feadh cúpla seachtain sula mbeidh tú ag súil le haon torthaí dearfacha.

Cad atá le léamh?

An bhfuil ceist agat? Scríobh sna tuairimí!

Foinse: will.com

Add a comment