Awọn anfani ati awọn alailanfani ti Awọn oju-iwe Huge

Awọn anfani ati awọn alailanfani ti Awọn oju-iwe Huge

Translation ti awọn article pese sile fun dajudaju omo ile "Alakoso Linux".

Ni iṣaaju, Mo ti sọrọ nipa bi o ṣe le ṣe idanwo ati mu lilo awọn Hugepages ṣiṣẹ lori Lainos.
Nkan yii yoo wulo nikan ti o ba ni aaye gangan lati lo Hugepages. Mo ti pade ọpọlọpọ eniyan ti o jẹ aṣiwere nipasẹ ifojusọna pe Hugepages yoo ṣe ilọsiwaju iṣẹ ṣiṣe ti idan. Sibẹsibẹ, hugepaging jẹ koko-ọrọ eka kan ati pe o le dinku iṣẹ ṣiṣe ti o ba lo ni aṣiṣe.

Apakan 1: Ijerisi pe awọn oju-iwe nla ti ṣiṣẹ lori Linux (atilẹba nibi)

Isoro:
O nilo lati ṣayẹwo boya HugePages ti ṣiṣẹ lori ẹrọ rẹ.

Solusan:
O rọrun pupọ:

cat /sys/kernel/mm/transparent_hugepage/enabled

Iwọ yoo gba nkan bii eyi:

always [madvise] never

Iwọ yoo wo atokọ ti awọn aṣayan to wa (nigbagbogbo, madvise, rara), ati pe aṣayan ti nṣiṣe lọwọ lọwọlọwọ yoo wa ni pipade ni awọn akomo (nipasẹ aiyipada aṣiwere).

aṣiwere tumo si pe transparent hugepages ṣiṣẹ nikan fun awọn agbegbe iranti ti o beere awọn oju-iwe nla ni gbangba ni lilo were(2).

nigbagbogbo tumo si pe transparent hugepages nigbagbogbo ṣiṣẹ fun gbogbo awọn ilana. Eyi nigbagbogbo mu iṣẹ ṣiṣe dara, ṣugbọn ti o ba ni ọran lilo nibiti ọpọlọpọ awọn ilana n gba iye kekere ti iranti, lẹhinna fifuye iranti gbogbogbo le pọ si ni iyalẹnu.

rara tumo si pe transparent hugepages kii yoo wa paapaa nigbati o ba beere fun lilo madvise. Lati wa diẹ sii, kan si iwe Linux kernels.

Bii o ṣe le yi iye aiyipada pada

Aṣayan 1: Taara yipada sysfs (lẹhin atunbere paramita naa yoo pada si iye aiyipada rẹ):

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

Aṣayan 2Yi aiyipada eto pada nipa ṣiṣe atunto ekuro pẹlu atunto ti a yipada (aṣayan yii ni a ṣeduro nikan ti o ba nlo ekuro aṣa):

  • Lati ṣeto nigbagbogbo nipasẹ aiyipada, lo:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Lati ṣeto madvise bi aiyipada, lo:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Apakan 2: Awọn anfani ati awọn alailanfani ti Awọn oju-iwe giga

A yoo gbiyanju lati yan alaye awọn anfani, awọn aila-nfani ati awọn ipalara ti o ṣeeṣe ti lilo awọn oju-iwe Hugepages. Niwọn igba ti eka imọ-ẹrọ ati nkan pedantic yoo nira lati ni oye fun awọn eniyan ti o tan sinu ironu pe Hugepages jẹ panacea, Emi yoo rubọ deede fun ayedero. O kan tọ lati tọju ni lokan pe ọpọlọpọ awọn koko-ọrọ jẹ idiju gaan ati nitorinaa o rọrun pupọ.

Jọwọ ṣe akiyesi pe a n sọrọ nipa awọn ọna ṣiṣe 64-bit x86 ti nṣiṣẹ Linux, ati pe Mo n ro pe eto naa ṣe atilẹyin awọn oju-iwe nla ti o han gbangba (niwọn bi kii ṣe aila-nfani pe awọn oju-iwe nla ko ni atunkọ), bii ọran ni o fẹrẹ to eyikeyi Linux ode oni. ayika.

Emi yoo so apejuwe imọ-ẹrọ diẹ sii ni awọn ọna asopọ ni isalẹ.

Iranti Foju

Ti o ba jẹ oluṣeto C ++, o mọ pe awọn nkan ti o wa ni iranti ni awọn adirẹsi kan pato (awọn iye itọkasi).

Sibẹsibẹ, awọn adirẹsi wọnyi ko ṣe afihan awọn adirẹsi ti ara ni iranti (awọn adirẹsi Ramu). Wọn ṣe aṣoju awọn adirẹsi ni iranti foju. Awọn isise ni o ni pataki kan MMU (iranti isakoso kuro) module ti o iranlọwọ ekuro maapu foju iranti to kan ti ara ipo.

Ọna yii ni ọpọlọpọ awọn anfani, ṣugbọn awọn pataki julọ ni:

  • Iṣẹ ṣiṣe (fun awọn idi oriṣiriṣi);
  • Iyasọtọ eto, iyẹn ni, ko si eto ti o le ka lati iranti eto miiran.

Kini awọn oju-iwe?

Iranti foju ti pin si awọn oju-iwe. Oju-iwe kọọkan n tọka si iranti ti ara kan pato, o le tọka si agbegbe kan ninu Ramu, tabi o le tọka si adirẹsi ti a yàn si ẹrọ ti ara, gẹgẹbi kaadi fidio kan.

Pupọ julọ awọn oju-iwe ti o ṣe pẹlu boya tọka si Ramu tabi ti wa ni paarọ, afipamo pe wọn ti fipamọ sori dirafu lile tabi SSD. Ekuro n ṣakoso iṣeto ti ara ti oju-iwe kọọkan. Ti o ba ti wọle si oju-iwe spoofed, ekuro naa da okun ti o ngbiyanju lati wọle si iranti, ka oju-iwe naa lati dirafu lile/SSD sinu Ramu, lẹhinna tẹsiwaju lati ṣiṣẹ o tẹle ara.

Ilana yii jẹ ṣiṣan ṣiṣan, afipamo pe ko dandan ka taara lati HDD/SSD. Iwọn awọn oju-iwe deede jẹ 4096 awọn baiti. Iwọn awọn oju-iwe nla jẹ megabyte 2.

Ifipamọ-itumọ (TLB)

Nigbati eto ba wọle si oju-iwe iranti kan, Sipiyu gbọdọ mọ iru oju-iwe ti ara lati ka data lati (iyẹn ni, ni maapu adirẹsi foju kan).

Ekuro naa ni eto data kan (tabili oju-iwe) ti o ni gbogbo alaye ninu nipa awọn oju-iwe ti a lo. Lilo eto data yii, o le ṣe maapu adirẹsi foju kan si adirẹsi ti ara.

Sibẹsibẹ, tabili oju-iwe jẹ eka pupọ ati o lọra, nitorinaa a ko le ṣe itupalẹ gbogbo eto data ni gbogbo igba ti ilana kan ba wọle si iranti.

O da, ero isise wa ni TLB kan ti o ṣafipamọ aworan agbaye laarin awọn adirẹsi foju ati ti ara. Eyi tumọ si pe botilẹjẹpe a nilo lati ṣe itupalẹ tabili oju-iwe lori igbiyanju iwọle akọkọ, gbogbo awọn iraye si oju-iwe ti o tẹle ni a le mu ni TLB, gbigba fun iṣẹ ni iyara.

Nitoripe o ti ṣe imuse bi ẹrọ ti ara (eyiti o jẹ ki o yara ni ibẹrẹ), agbara rẹ ni opin. Nitorinaa ti o ba fẹ wọle si awọn oju-iwe diẹ sii, TLB kii yoo ni anfani lati tọju awọn aworan agbaye fun gbogbo wọn, nfa ki eto rẹ ṣiṣẹ losokepupo.

Awọn oju-iwe nla wa si igbala

Nitorinaa kini a le ṣe lati yago fun apọju TLB? (A ro pe eto naa tun nilo iye kanna ti iranti).

Eyi ni ibi ti Hugepages wa. Dipo 4096 awọn baiti to nilo titẹsi TLB kan, titẹ sii TLB kan le tọka si awọn megabyte 2 nla kan. Jẹ ki a ro pe TLB ni awọn titẹ sii 512, nibi laisi Hugepages a le baramu:

4096 b⋅512=2 MB

Lẹhinna bawo ni a ṣe le ṣe afiwe pẹlu wọn:

2 MB⋅512=1 GB

Eyi ni idi ti Hugepages jẹ oniyi. Wọn le mu ilọsiwaju ṣiṣẹ laisi igbiyanju pupọ. Ṣugbọn nibẹ ni o wa pataki caveats nibi.

Bigpages spoofing

Ekuro laifọwọyi ṣe abojuto iye igba ti oju-iwe iranti kọọkan nlo. Ti ko ba si iranti ti ara ti o to (Ramu), ekuro yoo gbe awọn oju-iwe ti ko ṣe pataki (kii ṣe lo nigbagbogbo) si disiki lile lati ṣe ominira diẹ ninu Ramu fun awọn oju-iwe pataki diẹ sii.
Ni opo, kanna kan si Hugepages. Sibẹsibẹ, ekuro le paarọ gbogbo awọn oju-iwe nikan, kii ṣe awọn baiti kọọkan.

Jẹ ki a sọ pe a ni eto bii eyi:

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

Ni idi eyi, ekuro yoo nilo lati rọpo (ka) bi 2 megabytes ti alaye lati dirafu lile/SSD kan fun ọ lati ka baiti kan. Fun awọn oju-iwe deede, awọn baiti 4096 nikan nilo lati ka lati dirafu lile/SSD.

Nitorinaa, ti oju-iwe nla ba bori, o yara yiyara lati ka ti o ba nilo lati wọle si gbogbo oju-iwe naa. Eyi tumọ si pe ti o ba n gbiyanju lati wọle si awọn oriṣiriṣi awọn ẹya ti iranti laileto ati pe o kan ka awọn kilobytes meji, o yẹ ki o lo awọn oju-iwe deede ati ki o maṣe ṣe aniyan nipa ohunkohun miiran.

Ni apa keji, ti o ba nilo lati wọle si apakan nla ti iranti ni atẹlera, awọn oju-iwe nla yoo mu iṣẹ rẹ dara si. Sibẹsibẹ, o nilo lati ṣe idanwo funrarẹ (kii ṣe pẹlu sọfitiwia áljẹbrà) ati wo ohun ti o ṣiṣẹ ni iyara.

Pipin ni iranti

Ti o ba kọ C, o mọ pe o le beere awọn iye iranti lainidii kekere (tabi ti o tobi lainidii) lati okiti nipa lilo malloc(). Jẹ ki a sọ pe o nilo awọn baiti 30 ti iranti:

char* mymemory = malloc(30);

Si olupilẹṣẹ, o le han pe o “nbere” awọn baiti iranti 30 lati ẹrọ ṣiṣe ati dapada itọka kan si iranti foju kan. Sugbon kosi malloc () jẹ iṣẹ C kan ti o pe lati inu iṣẹ naa brk ati sbrk lati beere tabi iranti ofe lati ẹrọ ṣiṣe.

Sibẹsibẹ, nbere iranti siwaju ati siwaju sii fun ipin kọọkan jẹ ailagbara; o ṣeese julọ pe diẹ ninu apakan iranti ti ni ominira tẹlẹ (free()), ati pe a le tun lo. malloc() n ṣe awọn algoridimu eka pupọ fun atunlo iranti ominira.

Ni akoko kanna, ohun gbogbo n ṣẹlẹ lai ṣe akiyesi fun ọ, nitorina kilode ti o yẹ ki o ṣe aniyan rẹ? Ṣugbọn nitori ipenija free() ko tumọ si pe iranti jẹ dandan pada lẹsẹkẹsẹ si ẹrọ ṣiṣe.

Nibẹ ni iru ohun bi iranti Fragmentation. Ni awọn ọran ti o buruju, awọn apakan okiti wa nibiti awọn baiti diẹ ti lo, lakoko ti ohun gbogbo ti o wa laarin ti ni ominira (free()).

Jọwọ ṣe akiyesi pe pipin iranti jẹ koko-ọrọ ti iyalẹnu, ati paapaa awọn ayipada kekere si eto le ni ipa pataki. Ni ọpọlọpọ awọn ọran, awọn eto kii yoo fa ipinya iranti pataki, ṣugbọn o yẹ ki o mọ pe ti iṣoro ba wa pẹlu pipin ni diẹ ninu awọn agbegbe ti okiti, awọn oju-iwe nla le jẹ ki ipo naa buru si.

Lilo yiyan ti awọn oju-iwe nla

Lẹhin kika nkan yii, o ti pinnu iru awọn apakan ti eto rẹ le ni anfani lati lilo awọn oju-iwe nla ati eyiti ko le. Nitorinaa o yẹ ki awọn oju-iwe nla ṣiṣẹ ni gbogbo?

Oriire o le lo madvise()lati mu ki tobipaging ṣiṣẹ nikan fun awọn agbegbe iranti nibiti yoo wulo.

Ni akọkọ, ṣayẹwo pe awọn oju-iwe nla n ṣiṣẹ ni ipo madvise () nipa lilo awọn ilana ni ibere ti awọn article.

Lẹhinna, lo madvise()lati sọ fun ekuro ni pato ibiti o ti lo awọn oju-iwe nla.

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

Ṣe akiyesi pe ọna yii jẹ imọran lasan si ekuro lori bii o ṣe le ṣakoso iranti. Eyi ko tumọ si pe ekuro yoo lo awọn oju-iwe nla laifọwọyi fun iranti kan.

Tọkasi awọn iwe aṣẹ (manpage)madviselati ni imọ siwaju sii nipa iṣakoso iranti ati madvise(), koko-ọrọ yii ni ipa ikẹkọ giga ti iyalẹnu. Nitorinaa ti o ba pinnu lati dara gaan ni rẹ, mura lati ka ati idanwo fun ọsẹ diẹ ṣaaju ki o to reti awọn abajade rere eyikeyi.

Kini lati ka?

Ni ibeere kan? Kọ ninu awọn comments!

orisun: www.habr.com

Fi ọrọìwòye kun