Abũbuwan amfãni da rashin amfani na Hugepages

Abũbuwan amfãni da rashin amfani na Hugepages

Fassara labarin da aka shirya don ɗaliban kwas "Linux Administrator".

A baya can, na yi magana game da yadda ake gwadawa da kunna Hugepages akan Linux.
Wannan labarin zai zama da amfani kawai idan da gaske kuna da wurin amfani da Hugepages. Na sadu da mutane da yawa waɗanda aka yaudare su da tsammanin cewa Hugepages zai inganta yawan aiki da sihiri. Koyaya, bigpaging batu ne mai rikitarwa kuma yana iya lalata aiki idan aka yi amfani da shi ba daidai ba.

Sashe na 1: Tabbatar da cewa an kunna manyan shafuka akan Linux (na asali a nan)

Matsala:
Kuna buƙatar bincika idan an kunna HugePages akan tsarin ku.

bayani:
Abu ne mai sauki:

cat /sys/kernel/mm/transparent_hugepage/enabled

Za ku sami wani abu kamar haka:

always [madvise] never

Za ku ga jerin zaɓuɓɓukan da ake da su (kullum, hauka, ba), kuma zaɓin da ke aiki a halin yanzu za a haɗa shi a cikin baka (ta tsohuwa hauka).

hauka yana nufin haka transparent hugepages an kunna shi kawai don wuraren ƙwaƙwalwar ajiya waɗanda ke buƙatar manyan shafuka a sarari ta amfani da su hauka(2).

ko da yaushe yana nufin haka transparent hugepages ko da yaushe kunna ga duk matakai. Wannan yawanci yana haɓaka aiki, amma idan kuna da yanayin amfani inda yawancin matakai ke cinye ƙaramin adadin ƙwaƙwalwar ajiya, to gaba ɗaya nauyin ƙwaƙwalwar ajiya na iya ƙaruwa sosai.

faufau yana nufin haka transparent hugepages ba za a haɗa ko da lokacin da aka nema ta amfani da madvise. Don ƙarin sani, tuntuɓi takardun Linux kernels.

Yadda za a canza tsohuwar ƙima

Zabin 1: Canza kai tsaye sysfs (bayan sake kunna siginar zata dawo zuwa ƙimar da ta dace):

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

Zabin 2Canja tsohowar tsarin ta hanyar sake tattara kernel tare da ingantaccen tsari (wannan zaɓin ana bada shawarar ne kawai idan kuna amfani da kwaya ta al'ada):

  • Don saita koyaushe ta tsohuwa, yi amfani da:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Don saita madvise azaman tsoho, yi amfani da:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Sashe na 2: Fa'idodi da Rashin Amfanin Manyan Shafukan

Za mu yi ƙoƙari mu zaɓi yin bayanin fa'idodi, rashin amfani da yuwuwar illolin amfani da Hugepages. Tun da hadaddun fasaha da labarin zai yi wuya a fahimta ga mutanen da aka ruɗe su cikin tunanin Hugepages magani ne, zan sadaukar da daidaito don sauƙi. Yana da kyau a tuna cewa yawancin batutuwan suna da rikitarwa da gaske don haka an sauƙaƙa sosai.

Da fatan za a lura cewa muna magana ne game da tsarin 64-bit x86 da ke gudana Linux, kuma kawai ina ɗauka cewa tsarin yana goyan bayan manyan shafuka (tun da ba asara ba ne cewa manyan shafuka ba a sake rubuta su ba), kamar yadda lamarin yake a kusan kowane Linux na zamani. muhalli.

Zan haɗa ƙarin bayanin fasaha a cikin hanyoyin haɗin da ke ƙasa.

Ƙwaƙwalwar Ƙwaƙwalwa

Idan kai mai shirye-shiryen C++ ne, ka san cewa abubuwan da ke cikin ƙwaƙwalwar ajiya suna da takamaiman adireshi (ƙimar ma'ana).

Koyaya, waɗannan adiresoshin ba lallai ba ne su nuna adiresoshin jiki a cikin ƙwaƙwalwar ajiya (adiresoshin RAM). Suna wakiltar adireshi a cikin ƙwaƙwalwar ajiya. Mai sarrafa na'ura yana da tsarin MMU na musamman (naúrar sarrafa ƙwaƙwalwar ajiya) wanda ke taimakawa taswirar kernel ƙwaƙwalwar ajiya zuwa wuri na zahiri.

Wannan hanyar tana da fa'idodi da yawa, amma mafi mahimmanci sune:

  • Ayyukan aiki (saboda dalilai daban-daban);
  • Keɓewar shirin, wato, babu wani shirin da zai iya karantawa daga ƙwaƙwalwar ajiyar wani shirin.

Menene shafuka?

Ƙwaƙwalwar ƙwaƙwalwa ta kasu zuwa shafuka. Kowane shafi ɗaya yana nuna takamaiman ƙwaƙwalwar ajiyar jiki, yana iya nuna wani yanki a cikin RAM, ko yana iya nuna adireshin da aka sanya wa na'urar zahiri, kamar katin bidiyo.

Yawancin shafukan da kuke hulɗa da su ko dai suna nuna RAM ko kuma an canza su, ma'ana ana adana su a kan rumbun kwamfutarka ko SSD. Kwaya tana sarrafa tsarin jiki na kowane shafi. Idan an shiga shafin da aka zuga, kernel yana dakatar da zaren da ke ƙoƙarin shiga ƙwaƙwalwar ajiya, karanta shafin daga rumbun kwamfutarka/SSD zuwa RAM, sannan ya ci gaba da aiwatar da zaren.

Wannan tsari yana gudana a bayyane, ma'ana ba lallai ba ne a karanta shi kai tsaye daga HDD/SSD. Girman shafukan al'ada shine 4096 bytes. Girman manyan shafuka shine megabyte 2.

Fassara-haɗin kai (TLB)

Lokacin da shirin ya shiga shafin ƙwaƙwalwar ajiya, CPU dole ne ya san wane shafi na zahiri don karanta bayanai daga (wato, yana da taswirar adireshin kama-da-wane).

Kwayar tana da tsarin bayanai (tebur na shafi) wanda ya ƙunshi duk bayanan shafukan da ake amfani da su. Yin amfani da wannan tsarin bayanan, zaku iya taswirar adireshin kama-da-wane zuwa adireshin jiki.

Koyaya, teburin shafin yana da rikitarwa sosai kuma yana jinkirin, don haka ba za mu iya yin nazarin dukkan tsarin bayanai ba duk lokacin da kowane tsari ya sami damar ƙwaƙwalwar ajiya.

Abin farin ciki, mai sarrafa mu yana da TLB wanda ke adana taswira tsakanin adiresoshin kama-da-wane da na zahiri. Wannan yana nufin cewa ko da yake muna buƙatar rarraba teburin shafi akan ƙoƙarin samun dama na farko, duk hanyoyin shiga shafin na gaba za a iya sarrafa su a cikin TLB, yana ba da damar yin aiki cikin sauri.

Domin ana aiwatar da shi azaman na'urar jiki (wanda ke sa shi sauri a farkon wuri), ƙarfinsa yana da iyaka. Don haka idan kuna son samun dama ga ƙarin shafuka, TLB ba zai iya adana taswira ga duka su ba, yana sa shirin ku ya yi tafiya a hankali.

Manyan shafuka suna zuwa don ceto

Don haka me za mu iya yi don guje wa ambaliya TLB? (Mun ɗauka cewa shirin har yanzu yana buƙatar adadin ƙwaƙwalwar ajiya).

Wannan shine inda Hugepages ke shigowa. Maimakon 4096 bytes da ke buƙatar shigarwar TLB ɗaya kawai, shigarwar TLB ɗaya na iya nunawa zuwa megabyte 2 mai girma. Bari mu ɗauka cewa TLB yana da shigarwar 512, anan ba tare da Hugepages ba za mu iya daidaitawa:

4096 b⋅512=2 MB

To ta yaya za mu kwatanta da su:

2 MB⋅512=1 GB

Wannan shine dalilin da ya sa Hugepages yana da ban mamaki. Za su iya inganta yawan aiki ba tare da ƙoƙari mai yawa ba. Amma akwai mahimman fa'idodi a nan.

Manyan pages spoofing

Kwayar tana duba ta atomatik sau nawa ake amfani da kowane shafi na ƙwaƙwalwar ajiya. Idan babu isassun ƙwaƙwalwar ajiyar jiki (RAM), kernel ɗin zai motsa ƙasa da mahimmanci (wanda ba a saba amfani da shi ba) shafukan zuwa rumbun kwamfutarka don yantar da wasu RAM don ƙarin shafuka masu mahimmanci.
A ka'ida, iri ɗaya ya shafi Hugepages. Koyaya, kwaya na iya musanya gabaɗayan shafuka kawai, ba ɗaya ba bytes.

A ce muna da shiri kamar haka:

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

A wannan yanayin, kernel zai buƙaci maye gurbin (karanta) har zuwa megabyte 2 na bayanai daga rumbun kwamfutarka/SSD kawai don karanta byte ɗaya. Dangane da shafuka na yau da kullun, 4096 bytes ne kawai ake buƙatar karantawa daga rumbun kwamfutarka/SSD.

Don haka, idan an share babban shafi, yana da sauri kawai don karantawa idan kuna buƙatar isa ga duka shafin. Wannan yana nufin cewa idan kuna ƙoƙarin samun dama ga sassa daban-daban na ƙwaƙwalwar ajiya ba da gangan kuma kuna karatun kilobytes biyu kawai, yakamata kuyi amfani da shafuka na yau da kullun kuma kada ku damu da wani abu daban.

A gefe guda, idan kuna buƙatar samun dama ga babban ɓangaren ƙwaƙwalwar ajiya bi da bi, manyan shafuka za su inganta aikinku. Koyaya, kuna buƙatar gwada shi da kanku (ba tare da software ba) kuma ku ga abin da ke aiki da sauri.

Rabawa a cikin ƙwaƙwalwar ajiya

Idan ka rubuta C, ka san cewa za ka iya buƙatar ƙarami kaɗan (ko kusan babba) adadin ƙwaƙwalwar ajiya daga tudun ta amfani da malloc(). Bari mu ce kuna buƙatar 30 bytes na ƙwaƙwalwar ajiya:

char* mymemory = malloc(30);

Ga mai tsara shirye-shirye, yana iya zama alama cewa kuna "neman" 30 bytes na ƙwaƙwalwar ajiya daga tsarin aiki da mayar da mai nuni zuwa wasu ƙwaƙwalwar ajiya. Amma a zahiri malloc () aikin C ne kawai wanda ke kira daga cikin aikin brk da sbrk don nema ko kyauta ƙwaƙwalwar ajiya daga tsarin aiki.

Koyaya, neman ƙarin ƙwaƙwalwar ajiya don kowane rabo ba shi da inganci; yana yiwuwa an riga an 'yantar da wasu ɓangaren ƙwaƙwalwar ajiya (free()), kuma za mu iya sake amfani da shi. malloc() yana aiwatar da algorithms masu sarƙaƙƙiya don sake amfani da ƙwaƙwalwar da aka saki.

A lokaci guda, komai yana faruwa a gare ku ba tare da lura ba, don me zai damu da ku? Amma saboda kalubale free() ba haka yake nufi ba dole ne a mayar da ƙwaƙwalwar ajiya nan da nan zuwa tsarin aiki.

Akwai irin wannan abu kamar ɓarna ƙwaƙwalwar ajiya. A cikin matsanancin yanayi, akwai ɓangarorin tsibi inda ake amfani da ƴan bytes kaɗan, yayin da duk abin da ke tsakanin an warware shi. (free()).

Lura cewa rarrabuwar ƙwaƙwalwar ajiya batu ne mai ban mamaki, kuma ko da ƙananan canje-canje ga shirin na iya yin tasiri mai mahimmanci. A mafi yawan lokuta, shirye-shiryen ba zai haifar da rarrabuwar ƙwaƙwalwar ajiya mai mahimmanci ba, amma ya kamata ku sani cewa idan akwai matsala tare da rarrabuwa a wasu yanki na tsibi, manyan shafuka na iya sa lamarin ya yi muni.

Zaɓin amfani da manyan shafuka

Bayan karanta wannan labarin, kun ƙayyade waɗanne sassa na shirin ku za su iya amfana ta amfani da manyan shafuka da waɗanda ba za su iya ba. Don haka ya kamata a kunna manyan shafuka kwata-kwata?

Sa'a za ku iya amfani madvise()don ba da damar bigpaging kawai ga wuraren ƙwaƙwalwar ajiya inda zai zama da amfani.

Da farko, duba cewa manyan shafuka suna gudana cikin yanayin madvise() ta amfani da umarnin a farkon labarin.

Sa'an nan, amfani madvise()don gaya wa kernel daidai inda za a yi amfani da manyan shafuka.

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

Lura cewa wannan hanya ita ce kawai shawara ga kernel kan yadda ake sarrafa ƙwaƙwalwar ajiya. Wannan baya nufin cewa kwaya za ta yi amfani da manyan shafuka kai tsaye don ƙwaƙwalwar ajiya.

Koma zuwa takardu (manpage) mahaukacidon ƙarin koyo game da sarrafa ƙwaƙwalwar ajiya da madvise(), wannan batu yana da tsarin koyo mai ban mamaki. Don haka idan kuna da niyyar yin kyau sosai a ciki, shirya don karantawa da gwadawa na ƴan makonni kafin ku yi tsammanin samun sakamako mai kyau.

Me za a karanta?

Kuna da tambaya? Rubuta a cikin sharhi!

source: www.habr.com

Add a comment