Ny tombony sy ny tsy fahampian'ny HugePages

Ny tombony sy ny tsy fahampian'ny HugePages

Fandikana ny lahatsoratra nomanina ho an'ny mpianatra "Linux Administrator".

Teo aloha aho dia niresaka momba ny fomba fitsapana sy ahafahana mampiasa Hugepage amin'ny Linux.
Tena ilaina ity lahatsoratra ity raha tena manana toerana hampiasana Hugepage ianao. Nihaona tamin'ny olona maro izay voafitaky ny fahatsinjovana fa hanatsara amin'ny fomba mahagaga ny famokarana ny Hugpages. Na izany aza, lohahevitra saro-takarina ny hugepaging ary mety hanimba ny fampisehoana raha ampiasaina amin'ny fomba diso.

Fizarana 1: Fanamarinana fa ny pejy lehibe dia alefa amin'ny Linux (original eto)

olana:
Mila manamarina ianao raha alefa amin'ny rafitrao ny HugePages.

vahaolana:
Tsotra be izany:

cat /sys/kernel/mm/transparent_hugepage/enabled

Hahazo zavatra toy izao ianao:

always [madvise] never

Ho hitanao ny lisitry ny safidy misy (foana, madvise, tsy misy), ary ny safidy mavitrika amin'izao fotoana izao dia hofehezina ao anaty fononteny (amin'ny alΓ lan'ny default madvise).

madvise midika izany transparent hugepages natao ho an'ny faritra fitadidiana izay mangataka mazava amin'ny fampiasana pejy lehibe madvise (2).

foana midika izany transparent hugepages azo atao foana amin'ny dingana rehetra. Izany matetika dia manatsara ny fampandehanana, fa raha toa ianao ka manana tranga fampiasa maro izay mandany fahatsiarovana kely, dia mety hitombo be ny fitadidiana ankapobeny.

na oviana na oviana midika izany transparent hugepages tsy ampidirina na dia angatahana aza mampiasa madvise. Raha te hahalala bebe kokoa dia mifandraisa tahirin-kevitra Linux kernels.

Ahoana ny fanovana ny sanda default

Option 1: Miova mivantana sysfs (aorian'ny reboot ny parameter dia hiverina amin'ny sanda mahazatra azy):

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

Option 2: Hanova ny rafitra default amin'ny alΓ lan'ny famoriam-bola ny kernel miaraka amin'ny fanovana novaina (ity safidy ity dia atolotra raha tsy mampiasa kernel manokana ianao):

  • Raha hametraka foana amin'ny alΓ lan'ny default, ampiasao:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Raha hametraka madvise ho default dia ampiasao:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Fizarana 2: Ny tombony sy ny tsy fahampian'ny HugePages

Hiezaka izahay hanazava tsara ny tombony, ny tsy fahampiana ary ny mety ho fandrika amin'ny fampiasana Hugpages. Satria ny lahatsoratra be pitsiny ara-teknolojia sy manara-penitra dia mety ho sarotra takarina ho an'ny olona voafitaka amin'ny fiheverana fa ny Hugepages dia fanafody, dia hanao sorona ny fahamarinan'ny fahatsorana aho. Tsara hotadidina fa maro amin'ireo lohahevitra no tena sarotra ary noho izany dia tena tsotra.

Azafady, azafady fa miresaka momba ny rafitra 64-bit x86 mandeha amin'ny Linux izahay, ary heveriko fotsiny fa ny rafitra dia manohana pejy lehibe mangarahara (satria tsy misy fatiantoka ny hoe tsy voasoritra ny pejy lehibe), toy ny tranga amin'ny Linux maoderina rehetra. tontolo iainana.

Hametrahako famaritana ara-teknika bebe kokoa amin'ny rohy eto ambany.

Fahatsiarovana virtoaly

Raha mpandrindra C++ ianao dia fantatrao fa manana adiresy manokana (soatoavina pointer) ny zavatra ao anaty fitadidiana.

Na izany aza, ireo adiresy ireo dia tsy voatery maneho ny adiresy ara-batana ao amin'ny fitadidiana (adiresy RAM). Izy ireo dia maneho adiresy amin'ny fitadidiana virtoaly. Ny processeur dia manana mody MMU (fikambanana fitantanana fahatsiarovana) manokana izay manampy ny kernel sarintany fahatsiarovana virtoaly amin'ny toerana iray.

Ity fomba ity dia manana tombony maro, fa ny tena manan-danja dia:

  • Fampisehoana (noho ny antony samihafa);
  • Program isolation, izany hoe, tsy misy programa afaka mamaky ny fahatsiarovana ny programa hafa.

Inona no atao hoe pejy?

Ny fahatsiarovana virtoaly dia mizara ho pejy. Ny pejy tsirairay dia manondro fahatsiarovana ara-batana manokana, afaka manondro faritra iray ao amin'ny RAM, na afaka manondro adiresy voatondro ho an'ny fitaovana ara-batana, toy ny karatra video.

Ny ankamaroan'ny pejy karakarainao dia manondro RAM na avadika, midika izany fa voatahiry ao amin'ny kapila mafy na SSD ianao. Ny kernel no mitantana ny fisehon'ny pejy tsirairay. Raha misy pejy misy tsikombakomba idirana, dia ajanon'ny kernel ilay kofehy izay manandrana miditra amin'ny fitadidiana, mamaky ny pejy avy amin'ny kapila mafy/SSD ho RAM, ary avy eo dia manohy manatanteraka ilay kofehy.

Mangarahara ity dingana ity, midika izany fa tsy voatery mamaky mivantana avy amin'ny HDD/SSD. Ny haben'ny pejy mahazatra dia 4096 octet. Ny haben'ny pejy lehibe dia 2 megabytes.

Fandikan-teny mifandray (TLB)

Rehefa miditra amin'ny pejin'ny fitadidiana ny programa iray dia tsy maintsy fantarin'ny CPU izay pejy ara-batana hamakiana angon-drakitra (izany hoe manana sarintany adiresy virtoaly).

Ny kernel dia manana rafitra angon-drakitra (tabilao pejy) mirakitra ny fampahalalana rehetra momba ny pejy ampiasaina. Amin'ny fampiasana an'io firafitry ny angon-drakitra io dia azonao atao ny manao sarintany adiresy virtoaly amin'ny adiresy ara-batana.

Na izany aza, sarotra sy miadana ny latabatra pejy, noho izany dia tsy afaka mamakafaka ny firafitry ny angona manontolo isika isaky ny miditra amin'ny fitadidiana ny dingana iray.

Soa ihany fa manana TLB ny processeur-nay izay mitahiry ny sarintany eo anelanelan'ny adiresy virtoaly sy ara-batana. Midika izany fa na dia mila manara-maso ny latabatra pejy amin'ny andrana fidirana voalohany aza isika, ny fidirana manaraka amin'ny pejy dia azo fehezina ao amin'ny TLB, ahafahana miasa haingana.

Satria ampiharina amin'ny maha-fitaovana ara-batana azy (izay mahatonga azy haingana amin'ny voalohany), voafetra ny fahafahany. Ka raha te-hiditra pejy bebe kokoa ianao dia tsy afaka mitahiry sarintany ho an'ny rehetra ny TLB, ka mahatonga ny fandaharanao handeha miadana kokoa.

Tonga hamonjy ny Hugpages

Inona Γ ry no azontsika atao mba hisorohana ny fihoaran'ny TLB? (Heverintsika fa mbola mila fahatsiarovana mitovy ny fandaharana).

Eto no hidiran'i Hugpages. Raha tokony ho 4096 bytes mila fidirana TLB iray monja, ny fidirana TLB iray dia afaka manondro 2 megabytes. Andeha hatao hoe manana fidirana 512 ny TLB, eto raha tsy misy Hugpages dia afaka mifanandrify:

4096 bβ‹…512=2 MB

Dia ahoana ny fampitahana azy ireo:

2 MBβ‹…512=1 GB

Izany no mahatonga ny Hugpages ho mahafinaritra. Afaka manatsara ny famokarana tsy misy ezaka be izy ireo. Saingy misy fampitandremana lehibe eto.

Hugpages spoofing

Ny kernel dia manara-maso ho azy hoe impiry ny pejy fitadidiana tsirairay no ampiasaina. Raha tsy ampy ny fitadidiana ara-batana (RAM), ny kernel dia hamindra pejy tsy dia manan-danja (tsy dia ampiasaina matetika) mankany amin'ny kapila mafy mba hanafaka ny RAM sasany ho an'ny pejy manan-danja kokoa.
Amin'ny ankapobeny, mitovy amin'izany koa ny Hugepages. Na izany aza, ny kernel dia afaka manova pejy iray manontolo, fa tsy bytes tsirairay.

Andeha atao hoe manana programa toy izao isika:

char* mymemory = malloc(2*1024*1024); // Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ это Π·Π° ΠΎΠ΄Π½Ρƒ Hugepage!
// Π—Π°ΠΏΠΎΠ»Π½ΠΈΠΌ mymemory ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
// Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ,
// ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅ страницы mymemory
// ...
// Запросим доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ
putchar(mymemory[0]); 

Amin'ity tranga ity, ny kernel dia mila manolo (mamaky) hatramin'ny 2 megabytes ny fampahalalana avy amin'ny kapila mafy / SSD mba hamakianao byte iray. Raha ny pejy mahazatra dia 4096 bytes ihany no mila vakiana avy amin'ny kapila mafy/SSD.

Noho izany, raha asiana pejy lehibe dia haingana kokoa ny mamaky raha mila miditra amin'ny pejy iray manontolo ianao. Midika izany fa raha miezaka miditra kisendrasendra amin'ny ampahany samihafa amin'ny fitadidiana ianao ary mamaky kilobytes roa fotsiny, dia tokony hampiasa pejy mahazatra ianao fa tsy hanahy na inona na inona.

Amin'ny lafiny iray, raha mila miditra amin'ny ampahany betsaka amin'ny fitadidiana ianao, dia hanatsara ny fahombiazanao ny pejy lehibe. Na izany aza, mila manandrana azy ianao (fa tsy amin'ny rindrambaiko abstract) ary jereo izay miasa haingana kokoa.

Hiverina any amin'ny allocation

Raha manoratra C ianao dia fantatrao fa afaka mangataka fahatsiarovan-tena kely (na saika be loatra) avy amin'ny heap ianao. malloc(). Andeha atao hoe mila fitadidiana 30 bytes ianao:

char* mymemory = malloc(30);

Ho an'ny mpandrindra iray dia mety ho toa "mangataka" fahatsiarovana 30 bytes avy amin'ny rafitra fiasana ianao ary mamerina tondro ho fahatsiarovana virtoaly. Fa raha ny marina malloc () dia asa C izay miantso avy ao anatin'ilay asa brk sy sbrk mangataka na manafaka fahatsiarovana amin'ny rafitra fiasana.

Na izany aza, ny fangatahana fitadidiana bebe kokoa ho an'ny fizarana tsirairay dia tsy mahomby; azo inoana fa efa afaka ny ampahany fahatsiarovana sasany (free()), ary afaka mampiasa azy indray isika. malloc() Mampihatra algorithm saro-pady amin'ny fampiasana indray ny fahatsiarovana afaka.

Amin'izay fotoana izay ihany, ny zava-drehetra dia mitranga tsy voamarikao, koa nahoana no tokony hanahy anao izany? Fa noho ny fanamby free() tsy midika izany ny fahatsiarovana dia tsy maintsy averina avy hatrany amin'ny rafitra miasa.

Misy zavatra toy ny fanaparitahana fahatsiarovana. Amin'ny toe-javatra faran'izay mafy, dia misy ampahan-tsarimihetsika izay tsy misy afa-tsy bytes ampiasaina, fa ny zavatra rehetra eo anelanelany dia navotsotra. (free()).

Mariho fa lohahevitra saro-takarina ny fizarana fahatsiarovana, ary na dia ny fanovana kely amin'ny programa aza dia mety hisy fiantraikany lehibe. Amin'ny ankabeazan'ny toe-javatra, ny programa dia tsy hiteraka fizarazarana fahatsiarovana lehibe, saingy tokony ho fantatrao fa raha misy olana amin'ny fizarazarana amin'ny faritra sasany amin'ny antontan-taratasy, dia mety hiharatsy ny toe-javatra ny pejy lehibe.

Fampiasana pejy lehibe

Rehefa avy namaky ilay lahatsoratra ianao dia nanapa-kevitra hoe iza amin'ireo ampahany amin'ny programanao no mahazo tombony amin'ny fampiasana pejy lehibe ary iza no tsy afaka. Ka tokony haverina ve ny pejy lehibe?

Soa ihany fa azonao ampiasaina madvise()mba hahafahan'ny hugepaging ho an'ireo faritra fitadidiana izay mahasoa azy ihany.

Voalohany, jereo fa ny largepages dia mandeha amin'ny fomba madvise() mampiasa toromarika eo am-piandohan’ny lahatsoratra.

Avy eo, ampiasao madvise()mba hilaza amin'ny kernel hoe aiza no hampiasana pejy lehibe.

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

Mariho fa ity fomba ity dia torohevitra fotsiny amin'ny kernel momba ny fomba fitantanana ny fitadidiana. Tsy midika akory izany fa hampiasa pejy be ho azy ho an'ny fahatsiarovana nomena ny kernel.

Jereo ny documentation (manpage)madviseraha te hianatra bebe kokoa momba ny fitantanana fahatsiarovana sy madvise(), ity lohahevitra ity dia manana filaharana fianarana be dia be. Koa raha mikasa ny hahomby amin'izany ianao dia miomΓ na hamaky sy hizaha toetra mandritra ny herinandro vitsivitsy alohan'ny hanantenanao vokatra tsara.

Inona no hovakiana?

Manana fanontaniana? Soraty ao amin'ny fanehoan-kevitra!

Source: www.habr.com

Add a comment