Qhov zoo thiab qhov tsis zoo ntawm HugePages

Qhov zoo thiab qhov tsis zoo ntawm HugePages

Kev txhais cov lus uas tau npaj rau cov menyuam kawm ntawv "Linux Administrator".

Yav dhau los, kuv tau tham txog yuav ua li cas kuaj thiab pab Hugepages ntawm Linux.
Kab lus no tsuas yog siv tau yog tias koj muaj qhov chaw siv Hugepages tiag tiag. Kuv tau ntsib ntau tus neeg uas dag los ntawm kev cia siab tias Hugepages yuav ua kom muaj txiaj ntsig zoo. Txawm li cas los xij, hugepaging yog ib lub ntsiab lus nyuaj thiab tuaj yeem txo qis kev ua haujlwm yog tias siv tsis raug.

Ntu 1: Txheeb xyuas tias cov nplooj ntawv loj loj tau qhib rau ntawm Linux (thawj no)

Teeb meem:
Koj yuav tsum xyuas seb HugePages tau qhib rau koj lub cev.

tshuaj:
Nws yog qhov yooj yim zoo nkauj:

cat /sys/kernel/mm/transparent_hugepage/enabled

Koj yuav tau txais qee yam zoo li no:

always [madvise] never

Koj yuav pom cov npe ntawm cov kev xaiv muaj (ib txwm, madvise, yeej tsis), thiab qhov kev xaiv tam sim no yuav raug kaw hauv kab lus (los ntawm lub neej ntawd madvise ua).

madvise ua txhais tau tias transparent hugepages enabled tsuas yog rau cov chaw nco uas qhia meej thov cov nplooj ntawv loj siv madvise (2).

yeej ib txwm txhais tau tias transparent hugepages ib txwm enabled rau tag nrho cov txheej txheem. Qhov no feem ntau txhim kho kev ua tau zoo, tab sis yog tias koj muaj cov ntaub ntawv siv uas ntau cov txheej txheem tau noj me me ntawm lub cim xeeb, ces tag nrho cov cim xeeb tuaj yeem nce ntau.

yeej tsis txhais tau tias transparent hugepages yuav tsis suav nrog txawm tias thaum thov siv madvise. Yog xav paub ntxiv, hu rau cov ntaub ntawv Linux kernels.

Yuav hloov tus nqi li cas

Qhov 1: Hloov ncaj qha sysfs (tom qab reboot lub parameter yuav rov qab mus rau nws tus nqi qub):

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

Qhov 2: Hloov cov txheej txheem ua ntej los ntawm kev rov ua cov ntsiav nrog kev hloov kho (qhov kev xaiv no tsuas yog pom zoo yog tias koj siv cov ntsiav kev cai):

  • Txhawm rau teeb tsa ib txwm los ntawm lub neej ntawd, siv:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Txhawm rau teeb tsa madvise ua lub neej ntawd, siv:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Ntu 2: Qhov zoo thiab qhov tsis zoo ntawm HugePages

Peb yuav sim xaiv piav qhia qhov zoo, qhov tsis zoo thiab qhov ua tau zoo ntawm kev siv Hugepages. Txij li cov txheej txheem thev naus laus zis thiab cov kab lus pedantic yuav nyuaj rau kev nkag siab rau cov neeg uas xav tsis thoob rau hauv kev xav Hugepages yog panacea, Kuv yuav txi qhov tseeb rau qhov yooj yim. Nws tsuas yog tsim nyog nco ntsoov tias ntau lub ntsiab lus yog qhov nyuaj thiab yog li yooj yim heev.

Thov nco ntsoov tias peb tab tom tham txog 64-ntsis x86 tshuab khiav Linux, thiab kuv tsuas yog xav tias lub kaw lus txhawb nqa cov nplooj ntawv loj loj (vim tias nws tsis yog qhov tsis zoo uas cov nplooj ntawv loj tsis tau sau dua), ib yam li cov ntaub ntawv hauv yuav luag txhua niaj hnub Linux. ib puag ncig.

Kuv yuav muab cov lus piav qhia ntxiv hauv cov ntawv txuas hauv qab no.

Virtual Memory

Yog tias koj yog C ++ programmer, koj paub tias cov khoom hauv lub cim xeeb muaj qhov chaw nyob tshwj xeeb (tus nqi pointer).

Txawm li cas los xij, cov chaw nyob no tsis tas yuav cuam tshuam qhov chaw nyob hauv lub cim xeeb (RAM chaw nyob). Lawv sawv cev qhov chaw nyob hauv lub cim xeeb virtual. Lub processor muaj ib qho tshwj xeeb MMU (memory tswj unit) module uas pab lub ntsiav daim ntawv qhia virtual nco mus rau lub cev qhov chaw.

Txoj kev no muaj ntau qhov zoo, tab sis qhov tseem ceeb tshaj plaws yog:

  • Kev ua tau zoo (rau ntau yam laj thawj);
  • Kev cais tawm, uas yog, tsis muaj qhov kev pab cuam tuaj yeem nyeem los ntawm lub cim xeeb ntawm lwm qhov kev pab cuam.

Cov nplooj ntawv yog dab tsi?

Lub cim xeeb virtual muab faib ua nplooj ntawv. Txhua nplooj ntawv taw qhia rau qhov tshwj xeeb lub cev nco, nws tuaj yeem taw tes rau thaj tsam hauv RAM, lossis nws tuaj yeem taw tes rau qhov chaw nyob muab rau lub cev, xws li daim npav video.

Feem ntau ntawm cov nplooj ntawv koj cuam tshuam nrog taw tes rau RAM lossis hloov pauv, txhais tau tias lawv khaws cia rau hauv koj lub hard drive lossis SSD. Lub kernel tswj lub cev layout ntawm txhua nplooj ntawv. Yog tias nplooj ntawv spoofed nkag mus, cov ntsiav nres cov xov uas sim nkag mus rau lub cim xeeb, nyeem nplooj ntawv los ntawm hard drive / SSD rau hauv RAM, thiab tom qab ntawd txuas ntxiv ua cov xov.

Cov txheej txheem no yog kwj pob tshab, txhais tau tias nws tsis tas nyeem ncaj qha los ntawm HDD / SSD. Qhov loj ntawm nplooj ntawv ib txwm yog 4096 bytes. Cov nplooj loj loj yog 2 megabytes.

Translation-associative buffer (TLB)

Thaum ib qho kev pab cuam nkag mus rau nplooj ntawv ntawm lub cim xeeb, CPU yuav tsum paub tias nplooj ntawv twg los nyeem cov ntaub ntawv los ntawm (uas yog, muaj daim ntawv qhia chaw nyob virtual).

Lub kernel muaj cov qauv ntaub ntawv (nplooj ntawv) uas muaj tag nrho cov ntaub ntawv hais txog cov nplooj ntawv siv. Siv cov qauv ntaub ntawv no, koj tuaj yeem qhia qhov chaw nyob virtual rau qhov chaw nyob ntawm lub cev.

Txawm li cas los xij, nplooj ntawv cov lus yog qhov nyuaj thiab qeeb, yog li peb tsuas tuaj yeem tsis tuaj yeem txheeb xyuas tag nrho cov ntaub ntawv qauv txhua zaus cov txheej txheem nkag mus rau lub cim xeeb.

Hmoov zoo, peb cov processor muaj TLB uas caches daim ntawv qhia ntawm qhov chaw nyob virtual thiab lub cev. Qhov no txhais tau hais tias txawm hais tias peb yuav tsum txheeb xyuas nplooj ntawv ntawm thawj qhov kev sim nkag, txhua qhov kev nkag mus rau nplooj ntawv tom ntej tuaj yeem ua haujlwm hauv TLB, tso cai rau kev ua haujlwm ceev.

Vim tias nws tau siv los ua lub cev lub cev (uas ua rau nws ceev ceev hauv thawj qhov chaw), nws lub peev xwm tsuas yog txwv. Yog li yog tias koj xav nkag mus rau ntau nplooj ntawv, TLB yuav tsis tuaj yeem khaws cov ntawv qhia rau txhua tus ntawm lawv, ua rau koj qhov kev pabcuam ua haujlwm qeeb dua.

Cov nplooj loj loj los cawm

Yog li peb tuaj yeem ua li cas kom tsis txhob TLB dhau? (Peb xav tias qhov program tseem xav tau tib lub cim xeeb).

Qhov no yog qhov uas Hugepages tuaj rau hauv. Hloov chaw ntawm 4096 bytes tsuas yog xav tau ib qho TLB nkag, ib qho TLB nkag tam sim no tuaj yeem taw tes rau 2 megabytes. Cia peb xav tias TLB muaj 512 qhov nkag, ntawm no tsis muaj Hugepages peb tuaj yeem phim:

4096 bβ‹…512=2 MB

Tom qab ntawd peb tuaj yeem piv nrog lawv li cas:

2 MBβ‹…512=1 GB

Qhov no yog vim li cas Hugepages yog txaus. Lawv tuaj yeem txhim kho cov khoom tsim tau yam tsis muaj kev siv zog ntau. Tab sis muaj cov caveats tseem ceeb ntawm no.

Hugepages spoofing

Lub kernel cia li saib xyuas ntau npaum li cas txhua nplooj ntawv nco tau siv. Yog tias tsis muaj lub cim xeeb txaus (RAM), cov ntsiav yuav txav cov nplooj ntawv tseem ceeb (tsawg dua siv) cov nplooj ntawv rau lub hard disk kom tso qee RAM rau nplooj ntawv tseem ceeb dua.
Hauv txoj cai, tib yam siv rau Hugepages. Txawm li cas los xij, cov ntsiav tuaj yeem hloov pauv tag nrho nplooj ntawv, tsis yog ib tus bytes.

Cia peb hais tias peb muaj qhov program zoo li no:

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

Hauv qhov no, cov ntsiav yuav xav tau hloov (nyeem) ntau npaum li 2 megabytes ntawm cov ntaub ntawv los ntawm hard drive / SSD tsuas yog rau koj nyeem ib byte. Raws li cov nplooj ntawv tsis tu ncua, tsuas yog 4096 bytes yuav tsum tau nyeem los ntawm lub hard drive / SSD.

Yog li ntawd, yog tias nplooj ntawv loj loj dhau mus, nws tsuas yog nyeem sai dua yog tias koj xav tau nkag mus rau tag nrho nplooj ntawv. Qhov no txhais tau hais tias yog tias koj tab tom sim nkag mus rau qhov sib txawv ntawm lub cim xeeb thiab tsuas yog nyeem ob peb kilobytes, koj yuav tsum siv nplooj ntawv tsis tu ncua thiab tsis txhob txhawj txog lwm yam.

Ntawm qhov tod tes, yog tias koj xav tau nkag mus rau ib feem loj ntawm kev nco ua ntu zus, cov nplooj ntawv loj loj yuav txhim kho koj qhov kev ua tau zoo. Txawm li cas los xij, koj yuav tsum sim nws tus kheej (tsis yog nrog cov software paub daws teeb) thiab pom tias ua haujlwm sai dua.

Muab faib rau hauv nco

Yog tias koj sau C, koj paub tias koj tuaj yeem thov qhov me me (lossis yuav luag arbitrarily loj) cov cim xeeb los ntawm heap siv malloc(). Cia peb hais tias koj xav tau 30 bytes ntawm lub cim xeeb:

char* mymemory = malloc(30);

Rau ib tus programmer, nws yuav tshwm sim tias koj tab tom "thov" 30 bytes ntawm lub cim xeeb los ntawm kev ua haujlwm thiab xa rov qab tus taw tes rau qee lub cim xeeb virtual. Tab sis ua tau malloc () tsuas yog C muaj nuj nqi uas hu los ntawm hauv cov haujlwm brk thiab sbrk thov los yog pub dawb nco los ntawm lub operating system.

Txawm li cas los xij, kev thov ntau thiab ntau lub cim xeeb rau txhua qhov kev faib yog tsis muaj txiaj ntsig; Nws yog feem ntau hais tias qee ntu nco tau raug tso tawm lawm (free()), thiab peb tuaj yeem rov siv tau. malloc() siv cov algorithms nyuaj heev rau rov siv lub cim xeeb dawb.

Nyob rau tib lub sijhawm, txhua yam tshwm sim tsis pom rau koj, yog li vim li cas nws yuav tsum txhawj xeeb koj? Tab sis vim qhov kev sib tw free() tsis txhais hais tias nco yuav tsum rov qab tam sim ntawd mus rau lub operating system.

Muaj xws li ib yam li nco fragmentation. Hauv qhov xwm txheej hnyav, muaj ntu ntu uas tsuas yog siv ob peb bytes thaum txhua yam hauv nruab nrab tau tso tawm. (free()).

Thov nco ntsoov tias kev sib cais ntawm lub cim xeeb yog ib lub ntsiab lus nyuaj heev, thiab txawm tias qhov kev hloov me me rau qhov kev zov me nyuam tuaj yeem muaj kev cuam tshuam loj. Feem ntau, cov kev pab cuam yuav tsis ua rau lub cim xeeb tsis zoo, tab sis koj yuav tsum paub tias yog tias muaj teeb meem nrog kev tawg ntawm qee thaj tsam ntawm cov heap, cov nplooj loj loj tuaj yeem ua rau qhov xwm txheej tsis zoo.

Xaiv siv cov nplooj ntawv loj loj

Tom qab nyeem tsab xov xwm no, koj tau txiav txim siab qhov twg ntawm koj qhov kev pab cuam tuaj yeem tau txais txiaj ntsig los ntawm kev siv cov nplooj ntawv loj thiab qhov twg tsis tuaj yeem. Yog li puas yuav tsum tau qhib cov nplooj ntawv loj ntawm txhua qhov?

Hmoov zoo koj tuaj yeem siv tau madvise()txhawm rau pab kom loj hlob tsuas yog rau cov chaw nco uas nws yuav pab tau.

Ua ntej, xyuas tias cov nplooj ntawv loj loj tau khiav hauv madvise() hom siv cov lus qhia thaum pib ntawm tsab xov xwm.

Tom qab ntawd, siv madvise()qhia lub kernel raws nraim qhov twg siv cov nplooj ntawv loj.

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

Nco ntsoov tias txoj kev no tsuas yog cov lus qhia rau lub kernel ntawm kev tswj kev nco. Qhov no tsis txhais hais tias cov ntsiav yuav cia li siv cov nplooj ntawv loj loj rau lub cim xeeb.

Xa mus rau cov ntaub ntawv (manpage)madvisekom paub ntau ntxiv txog kev tswj kev nco thiab madvise(), lub ncauj lus no muaj ib qho kev kawm nkhaus incredibly. Yog li yog tias koj npaj siab yuav tau txais qhov zoo ntawm nws, npaj nyeem thiab sim ob peb lub lis piam ua ntej koj xav tias yuav tau txais txiaj ntsig zoo.

Yuav nyeem dab tsi?

Muaj lus nug? Sau rau hauv cov lus!

Tau qhov twg los: www.hab.com

Ntxiv ib saib