Buannachdan agus Eas-bhuannachdan Duilleagan Mòra

Buannachdan agus Eas-bhuannachdan Duilleagan Mòra

Eadar-theangachadh den artaigil a chaidh ullachadh airson oileanaich cùrsa "Rianadair Linux".

Roimhe sin, bhruidhinn mi air mar a nì thu deuchainn agus comas a thoirt do Hugepages air Linux.
Cha bhith an artaigil seo feumail ach ma tha àite agad airson Hugepages a chleachdadh. Tha mi air coinneachadh ri mòran dhaoine a tha air an sàrachadh leis an dùil gun leasaich Hugepages cinneasachd gu draoidheil. Ach, tha mòr-dhuilleag na chuspair iom-fhillte agus faodaidh e coileanadh a lughdachadh ma thèid a chleachdadh gu ceàrr.

Pàirt 1: A’ dearbhadh gu bheil duilleagan mòra air an comasachadh air Linux (tùsail an seo)

Problem:
Feumaidh tu dèanamh cinnteach a bheil HugePages air a chomasachadh air an t-siostam agad.

fuasgladh:
Tha e gu math sìmplidh:

cat /sys/kernel/mm/transparent_hugepage/enabled

Gheibh thu rudeigin mar seo:

always [madvise] never

Chì thu liosta de na roghainnean a tha rim faighinn (an-còmhnaidh, gu bràth, gu bràth), agus bidh an roghainn a tha gnìomhach an-dràsta air a chuartachadh ann am brathan (gu bunaiteach madvise).

madvise a' ciallachadh sin transparent hugepages air a chomasachadh a-mhàin airson raointean cuimhne a dh ’iarras gu sònraichte duilleagan mòra a’ cleachdadh madvise (2).

an còmhnaidh a' ciallachadh sin transparent hugepages an-còmhnaidh comasach airson a h-uile pròiseas. Mar as trice bidh seo a’ leasachadh coileanadh, ach ma tha cùis cleachdaidh agad far a bheil mòran phròiseasan a’ caitheamh beagan cuimhne, faodaidh an eallach cuimhne àrdachadh gu mòr.

riamh a' ciallachadh sin transparent hugepages cha tèid a thoirt a-steach eadhon nuair a thèid iarraidh ort a’ cleachdadh madvise. Airson tuilleadh fiosrachaidh, cuir fios gu sgrìobhainnean Draibhearan airson linux.

Mar a dh'atharraicheas tu an luach bunaiteach

Roghainn 1: Atharraich gu dìreach sysfs (às deidh ath-thòiseachadh tillidh am paramadair chun luach bunaiteach aige):

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

Roghainn 2: Atharraich bunait an t-siostaim le bhith ag ath-chruinneachadh an kernel le rèiteachadh atharraichte (chan eil an roghainn seo air a mholadh ach ma tha thu a’ cleachdadh kernel àbhaisteach):

  • Gus a shuidheachadh an-còmhnaidh gu bunaiteach, cleachd:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Gus madvise a shuidheachadh mar an àbhaist, cleachd:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Pàirt 2: Buannachdan agus Eas-bhuannachdan de HugePages

Feuchaidh sinn ri mìneachadh roghnach a dhèanamh air na buannachdan, na h-eas-bhuannachdan agus na duilgheadasan a dh’ fhaodadh a bhith ann bho bhith a’ cleachdadh Hugepages. Leis gum bi e coltach gum bi artaigil a tha iom-fhillte gu teicneòlach agus pedantic duilich a thuigsinn dha daoine a tha air am mealladh gu bhith a’ smaoineachadh gur e panacea a th’ ann an Hugepages, ìobraidh mi cruinneas airson sìmplidheachd. Is fhiach a bhith mothachail gu bheil tòrr de na cuspairean gu math toinnte agus mar sin air an dèanamh nas sìmplidhe.

Thoir an aire gu bheil sinn a’ bruidhinn mu dheidhinn siostaman 64-bit x86 a’ ruith Linux, agus gu bheil mi dìreach a’ gabhail ris gu bheil an siostam a’ toirt taic do dhuilleagan mòra follaiseach (leis nach eil e na ana-cothrom nach eil duilleagan mòra air an sgrìobhadh thairis), mar a tha fìor ann an cha mhòr Linux ùr-nodha sam bith. àrainneachd.

Cuiridh mi barrachd tuairisgeul teignigeach an cois na ceanglaichean gu h-ìosal.

Cuimhne brìgheil

Mas e prògramadair C ++ a th’ annad, tha fios agad gu bheil seòlaidhean sònraichte (luachan puing) aig nithean mar chuimhneachan.

Ach, chan eil na seòlaidhean sin gu riatanach a’ nochdadh seòlaidhean corporra mar chuimhneachan (seòlaidhean RAM). Bidh iad a’ riochdachadh sheòlaidhean ann an cuimhne bhrìgheil. Tha modal sònraichte MMU (aonad riaghlaidh cuimhne) aig a’ phròiseasar a chuidicheas an kernel a’ mapadh cuimhne bhrìgheil gu àite fiosaigeach.

Tha mòran bhuannachdan aig an dòigh-obrach seo, ach is iad an fheadhainn as cudromaiche:

  • Coileanadh (airson diofar adhbharan);
  • Iomallachd prògram, is e sin, chan urrainn do phrògram sam bith leughadh bho chuimhne prògram eile.

Dè th' ann an duilleagan?

Tha cuimhne mas-fhìor air a roinn ann an duilleagan. Bidh gach duilleag fa leth a’ comharrachadh cuimhne corporra sònraichte, faodaidh e comharrachadh gu raon ann an RAM, no faodaidh e comharrachadh gu seòladh a chaidh a shònrachadh do inneal corporra, leithid cairt bhidio.

Bidh a’ mhòr-chuid de na duilleagan ris am bi thu a’ dèiligeadh an dàrna cuid a’ comharrachadh RAM no air an iomlaid, a’ ciallachadh gu bheil iad air an stòradh air do chlàr cruaidh no SSD. Bidh an kernel a’ riaghladh cruth fiosaigeach gach duilleag. Ma gheibhear cothrom air duilleag spùtach, bidh an kernel a’ stad an t-snàthainn a tha a’ feuchainn ri faighinn chun chuimhne, a’ leughadh an duilleag bhon chlàr cruaidh / SSD gu RAM, agus an uairsin a’ leantainn air adhart a’ cur an t-snàthainn an gnìomh.

Tha am pròiseas seo sruthach follaiseach, a’ ciallachadh nach fheum e leughadh gu dìreach bhon HDD/SSD. Is e meud nan duilleagan àbhaisteach 4096 bytes. Tha meud nan duilleagan mòra 2 megabytes.

Bufair co-cheangailte eadar-theangachadh (TLB)

Nuair a gheibh prògram cothrom air duilleag cuimhne, feumaidh fios a bhith aig an CPU dè an duilleag fiosaigeach a leughas dàta bhuapa (is e sin, mapa seòlaidh brìgheil).

Tha structar dàta aig an kernel (clàr na duilleige) anns a bheil a h-uile fiosrachadh mu na duilleagan a thathar a’ cleachdadh. A’ cleachdadh an structair dàta seo, faodaidh tu seòladh brìgheil a mhapadh gu seòladh fiosaigeach.

Ach, tha clàr na duilleige gu math iom-fhillte agus slaodach, agus mar sin chan urrainn dhuinn dìreach structar an dàta gu lèir a sgrùdadh a h-uile uair a gheibh pròiseas cothrom air cuimhne.

Gu fortanach, tha TLB aig a’ phròiseasar againn a bhios a’ clàradh a’ mhapadh eadar seòlaidhean mas-fhìor agus corporra. Tha seo a’ ciallachadh ged a dh’ fheumas sinn clàr na duilleige a pharsadh air a’ chiad oidhirp ruigsinneachd, gun gabh a h-uile slighe a-steach don duilleag às deidh sin a làimhseachadh san TLB, a’ toirt cothrom airson obrachadh luath.

Leis gu bheil e air a chur an gnìomh mar inneal corporra (a tha ga dhèanamh luath sa chiad àite), tha a comas cuingealaichte. Mar sin ma tha thu airson barrachd dhuilleagan fhaighinn, cha bhith e comasach don TLB mapaichean a stòradh dhaibh uile, ag adhbhrachadh gum bi am prògram agad a’ ruith tòrr nas slaodaiche.

Bidh duilleagan mòra a’ tighinn gu teasairginn

Mar sin dè as urrainn dhuinn a dhèanamh gus cus TLB a sheachnadh? (Tha sinn a 'gabhail ris gu bheil feum aig a' phrògram fhathast air an aon uiread de chuimhne).

Seo far a bheil Hugepages a’ tighinn a-steach. An àite 4096 bytes a dh’ fheumas dìreach aon inntrigeadh TLB, faodaidh aon inntrigeadh TLB a-nis comharrachadh gu 2 megabytes whopping. Gabhamaid ris gu bheil 512 inntrigeadh aig an TLB, an seo às aonais Duilleagan Mòra is urrainn dhuinn a mhaidseadh:

4096 b⋅512=2 MB

An uairsin ciamar as urrainn dhuinn coimeas a dhèanamh riutha:

2 MB⋅512=1 GB

Sin as coireach gu bheil Hugepages sgoinneil. Faodaidh iad cinneasachd a leasachadh gun mòran oidhirp. Ach tha uabhasan cudromach an seo.

Duilleagan mòra a’ spùtadh

Bidh an kernel gu fèin-obrachail a’ cumail sùil air dè cho tric sa thèid gach duilleag cuimhne a chleachdadh. Mura h-eil cuimhne corporra gu leòr (RAM), gluaisidh an kernel duilleagan nach eil cho cudromach (nach eil cho tric air an cleachdadh) chun chlàr cruaidh gus beagan RAM a shaoradh airson duilleagan nas cudromaiche.
Ann am prionnsabal, tha an aon rud a 'buntainn ri Hugepages. Ach, chan urrainn don kernel ach duilleagan slàn atharrachadh, chan e bytes fa leth.

Canaidh sinn gu bheil prògram mar seo againn:

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

Anns a 'chùis seo, feumaidh an kernel suas ri 2 megabytes de dh'fhiosrachadh a chur an àite (leugh) bhon chlàr cruaidh / SSD dìreach airson gun leugh thu aon bhthach. A thaobh duilleagan cunbhalach, chan fheumar ach 4096 bytes a leughadh bhon chlàr cruaidh / SSD.

Mar sin, ma tha duilleag mhòr air a thoirt thairis, chan eil e ach nas luaithe a leughadh ma dh'fheumas tu faighinn chun duilleag gu lèir. Tha seo a 'ciallachadh ma tha thu a' feuchainn ri faighinn gu diofar phàirtean de chuimhne air thuaiream agus gu bheil thu dìreach a 'leughadh beagan kilobytes, bu chòir dhut duilleagan cunbhalach a chleachdadh agus gun a bhith draghail mu rud sam bith eile.

Air an làimh eile, ma dh'fheumas tu faighinn gu cuibhreann mòr de chuimhne ann an òrdugh, leasaichidh duilleagan mòra do choileanadh. Ach, feumaidh tu deuchainn a dhèanamh ort fhèin (chan ann le bathar-bog eas-chruthach) agus faicinn dè a tha ag obair nas luaithe.

Riarachadh mar chuimhneachan

Ma sgrìobhas tu C, tha fios agad gun urrainn dhut meudan cuimhne iarraidh gu neo-riaghailteach beag (no cha mhòr gu neo-riaghailteach) bhon chàrn a’ cleachdadh malloc(). Canaidh sinn gu bheil feum agad air 30 bytes de chuimhne:

char* mymemory = malloc(30);

Gu prògramadair, is dòcha gum bi e coltach gu bheil thu “ag iarraidh” 30 bytes de chuimhne bhon t-siostam obrachaidh agus a’ tilleadh puing gu beagan cuimhne brìgheil. Ach dha-rìribh malloc () dìreach gnìomh C a tha ag iarraidh bhon taobh a-staigh den ghnìomh brk agus sbrk gus cuimhne iarraidh no saor bhon t-siostam obrachaidh.

Ach, tha e neo-èifeachdach iarraidh barrachd is barrachd cuimhne airson gach riarachadh; tha e nas coltaiche gun deach cuid de chuimhne a leigeil ma sgaoil mu thràth (free()), agus is urrainn dhuinn a chleachdadh a-rithist. malloc() a’ cur an gnìomh algorithms gu math toinnte airson cuimhne shaor ath-chleachdadh.

Aig an aon àm, bidh a h-uile dad a ’tachairt gun mhothachadh dhut, mar sin carson a bu chòir dragh a bhith ort? Ach air sgàth an dùbhlan free() chan eil sin a' ciallachadh feumar cuimhne a thilleadh sa bhad chun t-siostam obrachaidh.

Tha leithid de rud ann ri briseadh cuimhne. Ann an cùisean fìor, tha earrannan tiùrr ann far nach eilear a’ cleachdadh ach beagan bytes fhad ‘s a tha a h-uile càil eatarra air a shaoradh (free()).

Thoir an aire gu bheil briseadh cuimhne na chuspair air leth toinnte, agus faodaidh eadhon atharrachaidhean beaga air prògram buaidh mhòr a thoirt. Anns a 'mhòr-chuid de shuidheachaidhean, cha toir prògraman bacadh mòr air cuimhne, ach bu chòir dhut a bhith mothachail ma tha duilgheadas ann le briseadh ann an cuid de raointean den chrann, faodaidh duilleagan mòra an suidheachadh a dhèanamh nas miosa.

Cleachdadh roghnach de dhuilleagan mòra

Às deidh dhut an artaigil seo a leughadh, tha thu air dearbhadh dè na pàirtean den phrògram agad a gheibh buannachd bho bhith a’ cleachdadh dhuilleagan mòra agus nach urrainn. Mar sin am bu chòir duilleagan mòra a bhith air an comasachadh idir?

Gu fortanach faodaidh tu a chleachdadh madvise()gus duilleagan mòra a chomasachadh a-mhàin airson na raointean cuimhne sin far am biodh e feumail.

An toiseach, dèan cinnteach gu bheil duilleagan mòra a’ ruith ann am modh madvise () a’ cleachdadh stiùireadh aig toiseach an artaigil.

An uairsin, cleachd madvise()gus innse don kernel gu dìreach càite an cleachd thu duilleagan mòra.

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

Thoir an aire nach eil anns an dòigh seo ach comhairle don kernel air mar a stiùireas tu cuimhne. Chan eil seo a’ ciallachadh gun cleachd an kernel duilleagan mòra gu fèin-ghluasadach airson cuimhne shònraichte.

Thoir sùil air na sgrìobhainnean (manpage) madvisegus barrachd ionnsachadh mu riaghladh cuimhne agus madvise(), tha lùb ionnsachaidh air leth cas aig a’ chuspair seo. Mar sin ma tha thu an dùil a bhith fìor mhath air, ullaich airson leughadh agus deuchainn airson beagan sheachdainean mus bi dùil agad ri toraidhean adhartach.

Dè a leughas tu?

A bheil ceist agad? Sgrìobh anns na beachdan!

Source: www.habr.com

Cuir beachd ann