Kaunggulan jeung kalemahan HugePages

Kaunggulan jeung kalemahan HugePages

Tarjamahan tina artikel disusun pikeun siswa tangtu "Linux Administrator".

Saméméhna, kuring ngobrol ngeunaan kumaha carana nguji sareng ngaktipkeun Hugpages dina Linux.
Tulisan ieu ngan ukur mangpaat upami anjeun leres-leres ngagaduhan tempat pikeun ngagunakeun Hugepages. Kuring geus papanggih loba jalma anu fooled ku prospek nu Hugpageges magically bakal ningkatkeun produktivitas. Nanging, hugepaging mangrupikeun topik anu rumit sareng tiasa ngirangan kinerja upami dianggo teu leres.

Bagian 1: Verifikasi yén halaman ageung diaktipkeun dina Linux (asli di dieu)

masalahna:
Anjeun kedah pariksa naha HugePages diaktipkeun dina sistem anjeun.

solusi:
Ieu cukup basajan:

cat /sys/kernel/mm/transparent_hugepage/enabled

Anjeun bakal nampi sapertos kieu:

always [madvise] never

Anjeun bakal ningali daptar pilihan anu sayogi (salawasna, madvise, pernah), sareng pilihan anu ayeuna aktip bakal diapit ku kurung (sacara standar madvise).

madvise hartina éta transparent hugepages diaktipkeun ngan pikeun wewengkon memori nu eksplisit menta hugepages ngagunakeun madvise (2).

salawasna hartina éta transparent hugepages salawasna diaktipkeun pikeun sakabéh prosés. Ieu biasana ngaronjatkeun kinerja, tapi lamun boga kasus pamakéan dimana loba prosés consuming jumlah leutik memori, lajeng beban memori sakabéh bisa ningkatkeun nyirorot.

teu kungsi hartina éta transparent hugepages moal kaasup sanajan dipénta maké madvise. Kanggo inpo nu leuwih lengkep, kontak dokuméntasi Kernel Linux.

Kumaha carana ngarobah nilai standar

pilihan 1: Langsung robah sysfs (sanggeus reboot parameter bakal balik deui ka nilai standar na):

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

pilihan 2: Robah standar sistem ku cara nyusun ulang kernel sareng konfigurasi anu dirobih (pilihan ieu ngan disarankeun upami anjeun nganggo kernel khusus):

  • Pikeun nyetél salawasna sacara standar, paké:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Pikeun nyetél madvise salaku standar, paké:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Bagian 2: Kaunggulan jeung kalemahan tina HugePages

Urang bakal coba selektif ngajelaskeun kaunggulan, kalemahan jeung pitfalls mungkin tina ngagunakeun Hugpages. Kusabab artikel technologically rumit sarta pedantic dipikaresep bakal hésé ngarti pikeun jalma anu deluded kana pamikiran Hugepages mangrupakeun panacea a, abdi bakal kurban akurasi pikeun kesederhanaan. Perlu émut yén seueur topik anu leres-leres rumit sahingga saderhana pisan.

Punten dicatet yén urang nyarioskeun sistem 64-bit x86 anu ngajalankeun Linux, sareng kuring ngan ukur nganggap yén sistem éta ngadukung halaman ageung transparan (sabab éta sanés kalemahan yén halaman ageung henteu ditimpa), sapertos dina ampir sadaya Linux modern. lingkungan.

Kuring bakal ngagantelkeun katerangan langkung téknis dina tautan di handap ieu.

Mémori maya

Upami anjeun programmer C ++, anjeun terang yén objék dina mémori ngagaduhan alamat khusus (nilai pointer).

Sanajan kitu, alamat ieu teu merta ngagambarkeun alamat fisik dina mémori (alamat RAM). Aranjeunna ngagambarkeun alamat dina mémori virtual. processor ngabogaan MMU husus (unit manajemén memori) modul nu mantuan kernel peta memori virtual ka lokasi fisik.

Pendekatan ieu ngagaduhan seueur kaunggulan, tapi anu paling penting nyaéta:

  • Performance (pikeun sagala rupa alesan);
  • Isolasi program, nyaéta, teu aya program anu tiasa maca tina mémori program anu sanés.

Naon kaca?

Mémori maya dibagi kana kaca. Unggal kaca individu nunjuk ka memori fisik husus, bisa nunjuk ka wewengkon dina RAM, atawa bisa nunjuk ka alamat ditugaskeun ka alat fisik, kayaning kartu vidéo.

Seuseueurna halaman anu anjeun urus boh nunjuk ka RAM atanapi disilihtukeurkeun, hartosna disimpen dina hard drive atanapi SSD anjeun. Kernel ngatur tata perenah fisik unggal halaman. Lamun kaca spoofed diakses, kernel eureun thread nu nyoba ngakses memori, maca kaca ti hard drive / SSD kana RAM, lajeng neraskeun executing thread.

Prosés ieu stream transparan, hartina teu merta maca langsung ti HDD / SSD. Ukuran kaca normal nyaéta 4096 bait. Ukuran halaman ageung nyaéta 2 megabyte.

Panyangga asosiatif tarjamahan (TLB)

Nalika program ngaksés halaman mémori, CPU kedah terang halaman fisik mana pikeun maca data (nyaéta, gaduh peta alamat virtual).

Kernel ngagaduhan struktur data (tabél halaman) anu ngandung sadaya inpormasi ngeunaan halaman anu dianggo. Ngagunakeun struktur data ieu, anjeun tiasa peta alamat virtual ka alamat fisik.

Sanajan kitu, tabel kaca cukup rumit sarta slow, jadi urang ngan saukur teu bisa nganalisis sakabéh struktur data unggal waktu hiji prosés ngakses memori.

Untungna, prosesor kami ngagaduhan TLB anu nyéépkeun pemetaan antara alamat virtual sareng fisik. Ieu ngandung harti yén sanajan urang kudu parse tabel kaca dina usaha aksés munggaran, sadaya aksés saterusna ka kaca bisa diatur dina TLB, sahingga pikeun operasi gancang.

Kusabab éta dilaksanakeun salaku alat fisik (anu ngajadikeun eta gancang di tempat munggaran), kapasitas na diwatesan. Janten upami anjeun hoyong ngaksés langkung seueur halaman, TLB moal tiasa nyimpen pemetaan pikeun sadayana, nyababkeun program anjeun langkung laun.

Hugpages datang ka nyalametkeun teh

Janten naon anu urang tiasa laksanakeun pikeun ngahindarkeun TLB overflow? (Urang nganggap program masih perlu jumlah sarua memori).

Ieu dimana Hugpages asup. Gantina 4096 bait merlukeun ngan hiji éntri TLB, hiji éntri TLB ayeuna bisa nunjuk ka whopping 2 megabytes. Anggap TLB ngagaduhan 512 éntri, di dieu tanpa Hugpages urang tiasa cocog:

4096 b⋅512=2 MB

Teras kumaha urang tiasa ngabandingkeun sareng aranjeunna:

2 MB⋅512=1 GB

Ieu naha Hugepages Heboh. Aranjeunna tiasa ningkatkeun produktivitas tanpa seueur usaha. Tapi aya caveats signifikan di dieu.

Hugpages spoofing

Kernel sacara otomatis ngawas sabaraha sering unggal halaman mémori dianggo. Lamun aya teu cukup memori fisik (RAM), kernel bakal mindahkeun kirang penting (kirang sering dipaké) Kaca kana hard disk pikeun ngosongkeun sababaraha RAM pikeun kaca leuwih penting.
Sacara prinsip, sami manglaku ka Hugepages. Sanajan kitu, kernel ngan bisa swap sakabéh kaca, teu bait individu.

Anggap urang gaduh program sapertos kieu:

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

Dina hal ieu, kernel bakal perlu ngaganti (baca) saloba 2 megabytes inpormasi ti hard drive / SSD ngan pikeun anjeun maca hiji bait. Pikeun halaman biasa, ngan ukur 4096 bait anu kedah dibaca tina hard drive / SSD.

Janten, upami halaman ageung ditimpa, éta ngan ukur langkung gancang maca upami anjeun kedah ngaksés sadayana halaman. Ieu ngandung harti yén upami anjeun nyobian ngaksés bagian-bagian mémori sacara acak sareng ngan ukur maca sababaraha kilobyte, anjeun kedah nganggo halaman biasa sareng henteu hariwang ngeunaan anu sanés.

Di sisi anu sanés, upami anjeun kedah ngaksés sabagian ageung mémori sacara berurutan, halaman ageung bakal ningkatkeun kinerja anjeun. Nanging, anjeun kedah nguji éta nyalira (henteu nganggo parangkat lunak abstrak) sareng ningali naon anu langkung gancang.

Alokasi dina mémori

Upami anjeun nyerat C, anjeun terang yén anjeun tiasa nyuhunkeun jumlah mémori anu sawenang-wenang (atanapi ampir sawenang-wenang ageung) tina tumpukan nganggo. malloc(). Anggap anjeun peryogi 30 bait mémori:

char* mymemory = malloc(30);

Pikeun programmer a, eta bisa jadi muncul nu keur "menta" 30 bait memori tina sistem operasi sarta balik pointer ka sababaraha memori virtual. Tapi sabenerna malloc () ngan hiji fungsi C nu nelepon ti jeroeun fungsi brk jeung sbrk pikeun ménta atawa ngosongkeun mémori tina sistem operasi.

Sanajan kitu, requesting beuki loba memori pikeun tiap alokasi teu episien; kamungkinan yén sababaraha bagéan mémori parantos dibébaskeun (free()), sareng urang tiasa nganggo deui. malloc() implements algoritma rada kompléks pikeun reusing memori bébas.

Dina waktu nu sarua, sagalana kajadian unnoticed pikeun anjeun, jadi naha kudu salempang anjeun? Tapi kusabab tantangan free() lain hartina mémori merta balik langsung ka sistem operasi.

Aya hal kayaning fragméntasi memori. Dina kasus ékstrim, aya bagéan tumpukan dimana ngan ukur sababaraha bait anu dianggo, sedengkeun anu aya di antawisna parantos dibébaskeun. (free()).

Perhatikeun yén fragméntasi memori mangrupa topik incredibly kompléks, komo parobahan minor dina program bisa boga dampak signifikan. Dina kalolobaan kasus, program moal ngabalukarkeun fragméntasi memori signifikan, tapi anjeun kudu sadar yen lamun aya masalah jeung fragméntasi di sawatara wewengkon numpuk, kaca badag bisa nyieun kaayaan goréng.

Pamakéan selektif tina halaman ageung

Saatos maca tulisan ieu, anjeun parantos nangtukeun mana bagian tina program anjeun tiasa nyandak kauntungan tina ngagunakeun halaman ageung sareng mana anu henteu. Janten naha halaman ageung kedah diaktipkeun?

Kabeneran anjeun tiasa nganggo madvise()pikeun ngaktipkeun hugepaging ngan pikeun maranéhanana wewengkon memori mana eta bakal mangpaat.

Kahiji, pariksa yen hugepages ngajalankeun dina mode madvise () ngagunakeun parentah dina awal artikel.

Lajeng, ngagunakeun madvise()pikeun ngabejaan kernel persis dimana ngagunakeun hugepages.

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

Catet yén metodeu ieu ngan ukur naséhat pikeun kernel ngeunaan cara ngatur mémori. Ieu henteu hartosna yén kernel bakal otomatis nganggo halaman ageung pikeun mémori anu dipasihkeun.

Rujuk kana dokuméntasi (manpage) madvisepikeun leuwih jéntré ngeunaan manajemén memori sareng madvise(), topik ieu boga kurva learning incredibly lungkawing. Janten upami anjeun badé kéngingkeun saé, siapkeun maca sareng nguji sababaraha minggu sateuacan anjeun ngarepkeun hasil anu positif.

Naon maca?

Aya patarosan? Tulis dina komentar!

sumber: www.habr.com

Tambahkeun komentar