Melemo le Mefokolo ea HugePages

Melemo le Mefokolo ea HugePages

Phetolelo ea sengoloa e lokiselitsoeng baithuti ba thupelo "Linux Administrator".

Pejana, ke buile ka mokhoa oa ho leka le ho nolofalletsa tšebeliso ea Hugepages ho Linux.
Sengoliloeng sena se tla ba molemo ha feela u na le sebaka sa ho sebelisa Hugepages. Ke kopane le batho ba bangata ba thetsitsoeng ke tebello ea hore Hugepages e tla ntlafatsa tlhahiso ka boselamose. Leha ho le joalo, ho etsa leqephe le leholo ke taba e rarahaneng 'me e ka theola ts'ebetso ha e sebelisoa ka phoso.

Karolo ea 1: Ho netefatsa hore maqephe a maholo a lumelloa ho Linux (ea pele mona)

Bothata:
U hloka ho hlahloba hore na HugePages e nolofalitsoe ho sistimi ea hau.

tharollo:
E bonolo haholo:

cat /sys/kernel/mm/transparent_hugepage/enabled

U tla fumana ntho e kang ena:

always [madvise] never

U tla bona lethathamo la likhetho tse fumanehang (kamehla, madvise, ha ho mohla), 'me khetho e sebetsang hajoale e tla kengoa ka masakaneng (ka ho sa feleng madvise).

madvise ho bolela hore transparent hugepages e lumelloa feela bakeng sa libaka tsa memori tse kopang maqephe a maholo ka ho hlaka madvise(2).

kamehla ho bolela hore transparent hugepages kamehla e lumelletsoe bakeng sa lits'ebetso tsohle. Hangata sena se ntlafatsa ts'ebetso, empa haeba u na le ts'ebeliso ea ts'ebetso moo lits'ebetso tse ngata li jang mohopolo o fokolang, joale moroalo oa mohopolo o ka eketseha haholo.

ha ho mohla ho bolela hore transparent hugepages e ke ke ea kenyelletsoa le ha e kopuoa ho sebelisoa madvise. Ho tseba haholoanyane, ikopanye litokomane Lithako tsa Linux.

Mokhoa oa ho fetola boleng ba kamehla

Khetho ea 1: Fetola ka ho toba sysfs (kamora ho qala bocha paramente e tla khutlela boleng ba eona ba kamehla):

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

Khetho ea 2: Fetola sebopeho sa sistimi ka ho khutlisa kernel ka tlhophiso e fetotsoeng (khetho ena e khothaletsoa feela ha o sebelisa kernel e tloaelehileng):

  • Ho seta ka linako tsohle, sebelisa:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Ho seta madvise joalo ka kamehla, sebelisa:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Karolo ea 2: Melemo le Mefokolo ea HugePages

Re tla leka ho hlalosa ka mokhoa o ikhethileng melemo, mathata le mathata a ka bang teng a ho sebelisa Hugepages. Kaha ho ka ba thata ho utloisisa sengoloa se rarahaneng sa thekenoloji le sa pedantic bakeng sa batho ba thetsitsoeng ho nahana hore Hugepages ke panacea, ke tla tela ho nepahala bakeng sa ho nolofatsa. Ke habohlokoa ho hopola hore lihlooho tse ngata li hlile li rarahane, kahoo li nolofalitsoe haholo.

Ka kopo hlokomela hore re bua ka litsamaiso tsa 64-bit x86 tse tsamaisang Linux, le hore ke nka feela hore sistimi e ts'ehetsa maqephe a maholo a hlakileng (kaha ha se kotsi hore maqephe a maholo ha a ngoloe), joalo ka ha ho le joalo ho Linux efe kapa efe ea sejoale-joale. tikoloho.

Ke tla hokela tlhaloso e eketsehileng ea tekheniki lihokelong tse ka tlase.

Memori ea Virtual

Haeba u C++ programmer, ua tseba hore lintho tse mohopolong li na le liaterese tse itseng (litekanyetso tsa pointer).

Leha ho le joalo, liaterese tsena ha li hlile ha li bontše liaterese tsa 'mele mohopolong (liaterese tsa RAM). Li emela liaterese mohopolong oa sebele. The processor e na le module e khethehileng ea MMU (memory management unit) e thusang 'mapa oa kernel oa mohopolo o teng sebakeng sa 'mele.

Mokhoa ona o na le melemo e mengata, empa ea bohlokoa ka ho fetisisa ke:

  • Tshebetso (ka mabaka a fapaneng);
  • Ho itšehla thajana ha lenaneo, ke hore, ha ho lenaneo le ka balang mohopolong oa lenaneo le leng.

Maqephe ke eng?

Memori ea Virtual e arotsoe ka maqephe. Leqephe le leng le le leng le supa mohopolong o itseng oa 'mele, le ka supa sebaka se ho RAM, kapa le ka supa aterese e abetsoeng sesebelisoa sa 'mele, joalo ka karete ea video.

Boholo ba maqephe ao u sebetsanang le 'ona a supa ho RAM kapa a fetotsoe, ho bolelang hore a bolokiloe ho hard drive ea hau kapa SSD. Kernel e laola sebopeho sa leqephe ka leng. Haeba leqephe le senyehileng le fumaneha, kernel e emisa khoele e lekang ho fihlella mohopolong, e bala leqephe ho tloha hard drive / SSD ho RAM, ebe e tsoela pele ho etsa khoele.

Ts'ebetso ena e hlakile, ho bolelang hore ha e balehe ka kotloloho ho tsoa ho HDD/SSD. Boholo ba maqephe a tloaelehileng ke 4096 bytes. Boholo ba maqephe ke 2 megabytes.

Phetolelo-Asociative buffer (TLB)

Ha lenaneo le fihlella leqephe la memori, CPU e tlameha ho tseba hore na e ka bala leqephe lefe la 'mele (ke hore, e be le' mapa oa aterese).

Kernel e na le sebopeho sa data (tafole ea leqephe) e nang le tlhaiso-leseling eohle mabapi le maqephe a sebelisoang. U sebelisa sebopeho sena sa data, u ka 'mapa aterese ea sebele ho aterese ea sebaka.

Leha ho le joalo, leqephe la leqephe le rarahane haholo ebile le lieha, kahoo ha re khone ho sekaseka sebopeho sa data nako le nako ha ts'ebetso e fihla mohopolong.

Ka lehlohonolo, processor ea rona e na le TLB e bolokang 'mapa lipakeng tsa liaterese tsa sebele le tsa 'mele. Sena se bolela hore le hoja re hloka ho bapisa tafole ea leqephe tekong ea pele ea ho fihlella, mekhoa eohle e latelang ea ho kena leqepheng e ka sebetsanoa le TLB, e leng se lumellang ts'ebetso e potlakileng.

Hobane e kenngoa ts'ebetsong e le sesebelisoa sa 'mele (se etsang hore se potlake pele), bokhoni ba sona bo lekanyelitsoe. Kahoo haeba u batla ho fumana maqephe a mangata, TLB e ke ke ea khona ho boloka limmapa bakeng sa tsona kaofela, e leng ho etsang hore lenaneo la hau le tsamaee butle haholo.

Maqephe a maholo a tla thusa

Joale re ka etsa eng ho qoba ho tlala TLB? (Re nahana hore lenaneo le ntse le hloka mohopolo o lekanang).

Mona ke moo Hugepages e kenang teng. Sebakeng sa li-byte tse 4096 tse hlokang ho kenoa ha TLB e le 'ngoe feela, ho kena TLB e le 'ngoe joale ho ka supa boholo ba 2 megabytes. Ha re nke hore TLB e na le likenyelletso tse 512, mona ntle le Hugepages re ka bapisa:

4096 b⋅512=2 MB

Joale re ka ipapisa le bona joang:

2 MB⋅512=1 GB

Ke ka lebaka leo Hugepages e ntle haholo. Ba ka ntlafatsa tlhahiso ntle le boiteko bo boholo. Empa ho na le litemoso tsa bohlokoa mona.

Hugepages spoofing

Kernel e hlokomela ka bo eona hore na leqephe le leng le le leng la memori le sebelisoa hangata hakae. Haeba ho se na mohopolo o lekaneng oa 'mele (RAM), kernel e tla tsamaisa maqephe a seng bohlokoa (a sa sebelisoeng khafetsa) ho hard disk ho lokolla RAM bakeng sa maqephe a bohlokoa haholo.
Ha e le hantle, se tšoanang se sebetsa ho Hugepages. Leha ho le joalo, kernel e ka fetola maqephe a felletseng feela, eseng li-byte ka bomong.

Ha re re re na le lenaneo le kang lena:

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

Tabeng ena, kernel e tla hloka ho khutlisa (bala) e ka bang 2 megabytes ea tlhahisoleseding ho tswa ho hard drive/SSD hore feela u ka bala byte e le 'ngoe. Ha e le maqephe a tloaelehileng, ke li-byte tse 4096 feela tse lokelang ho baloa ho tswa ho hard drive/SSD.

Ka hona, haeba leqephe le leholo le ngotsoe, ho potlakile feela ho bala ha o hloka ho fihlella leqephe lohle. Sena se bolela hore haeba u leka ho fumana likarolo tse fapaneng tsa mohopolo ka mokhoa o sa reroang 'me u ntse u bala li-kilobyte tse' maloa, u lokela ho sebelisa maqephe a tloaelehileng 'me u se ke ua tšoenyeha ka letho.

Ka lehlakoreng le leng, haeba u hloka ho fihlella karolo e kholo ea mohopolo ka tatellano, maqephe a maholo a tla ntlafatsa ts'ebetso ea hau. Leha ho le joalo, u lokela ho itlhahloba (eseng ka software e sa bonahaleng) 'me u bone se sebetsang ka potlako.

Kabo mohopolong

Haeba u ngola C, ua tseba hore u ka kopa memori e nyane (kapa e batlang e le kholo ka ho fetelletseng) ho tsoa qubung u sebelisa malloc(). Ha re re u hloka li-byte tse 30 tsa memori:

char* mymemory = malloc(30);

Ho moetsi oa mananeo, ho ka 'na ha bonahala eka u "kōpa" 30 bytes ea memori ho tloha tsamaisong ea ts'ebetso le ho khutlisetsa pointer mohopolong o itseng oa sebele. Empa bonneteng malloc () ke ts'ebetso ea C feela e bitsang ho tsoa ka har'a ts'ebetso brk le sbrk ho kopa kapa ho lokolla memori ho sistimi e sebetsang.

Leha ho le joalo, ho kopa mohopolo o eketsehileng bakeng sa kabo e 'ngoe le e' ngoe ha ho na thuso; mohlomong karolo e 'ngoe ea memori e se e lokolotsoe (free()), 'me re ka e sebelisa hape. malloc() e sebelisa li-algorithms tse rarahaneng bakeng sa ho sebelisa mohopolo o lokolohileng hape.

Ka nako e ts'oanang, ntho e 'ngoe le e' ngoe e etsahala e sa hlokomeloe ho uena, kahoo ke hobane'ng ha e lokela ho u tšoenya? Empa hobane phephetso free() ha e bolele seo memori e hlile e khutlisetsoa hang-hang ho sistimi e sebetsang.

Ho na le ntho e kang ho arohana ha memori. Maemong a feteletseng, ho na le likarolo tsa qubu moo ho sebelisoang li-byte tse 'maloa feela, athe tsohle tse lipakeng li lokolotsoe. (free()).

Ka kopo hlokomela hore ho arohana ha memori ke taba e rarahaneng haholo, mme le liphetoho tse nyane lenaneong li ka ba le tšusumetso e kholo. Maemong a mangata, mananeo a ke ke a baka karohano e kholo ea mohopolo, empa o lokela ho hlokomela hore haeba ho na le bothata ba ho arohana sebakeng se seng sa qubu, maqephe a maholo a ka mpefatsa boemo.

Tšebeliso e khethehileng ea maqephe a maholo

Kamora ho bala sengoloa sena, u entse qeto ea hore na ke likarolo life tsa lenaneo la hau tse ka ruang molemo ka ho sebelisa maqephe a maholo le tse sa khoneheng. Joale na maqephe a maholo a tlameha ho lumelloa ho hang?

Ka lehlohonolo u ka sebelisa madvise()ho etsa hore ho be le maqephe a maholo feela bakeng sa libaka tsa memori moo ho ka bang molemo.

Ntlha ea pele, hlahloba hore na maqephe a maholo a sebetsa ka mokhoa oa madvise () o sebelisa litaelo qalong ea sehlooho.

Joale, sebelisa madvise()ho bolella kernel hantle moo e ka sebedisang maqephe a maholo.

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

Hlokomela hore mokhoa ona ke keletso feela ho kernel mabapi le mokhoa oa ho laola memori. Sena ha se bolele hore kernel e tla sebelisa maqephe a maholo bakeng sa mohopolo o fanoeng.

Sheba litokomane (manpage)madviseho ithuta haholoanyane ka tsamaiso ea memori le madvise(), sehlooho sena se na le moepa o moholo oa ho ithuta. Kahoo haeba u ikemiselitse ho e etsa hantle, itokisetse ho bala le ho etsa liteko libeke tse 'maloa pele u lebella litholoana tse ntle.

Ho bala eng?

O na le potso? Ngola litlhalosong!

Source: www.habr.com

Eketsa ka tlhaloso