Kaluwihan lan Kekurangan HugePages

Kaluwihan lan Kekurangan HugePages

Terjemahan artikel sing disiapake kanggo siswa kursus "Linux Administrator".

Sadurunge, aku ngomong babagan carane nyoba lan ngaktifake Hugpages ing Linux.
Artikel iki mung bakal migunani yen sampeyan duwe panggonan kanggo nggunakake Hugepages. Aku wis ketemu akeh wong sing diapusi dening prospek sing Hugepages gaib bakal nambah produktivitas. Nanging, hugepaging minangka topik sing rumit lan bisa nyuda kinerja yen digunakake kanthi ora bener.

Bagean 1: Verifikasi manawa kaca gedhe diaktifake ing Linux (asli kene)

Masalah:
Sampeyan kudu mriksa manawa HugePages diaktifake ing sistem sampeyan.

solusi:
Iku cukup prasaja:

cat /sys/kernel/mm/transparent_hugepage/enabled

Sampeyan bakal entuk kaya iki:

always [madvise] never

Sampeyan bakal weruh dhaptar pilihan sing kasedhiya (tansah, madvise, tau), lan pilihan sing saiki aktif bakal dilampirake ing kurung (kanthi standar madvise).

madvise tegese transparent hugepages diaktifake mung kanggo wilayah memori sing kanthi tegas njaluk hugepages nggunakake madvise(2).

tansah tegese transparent hugepages tansah aktif kanggo kabeh pangolahan. Iki biasane mbenakake kinerja, nanging yen sampeyan duwe kasus nggunakake ngendi akeh pangolahan nggunakake jumlah cilik saka memori, banjur beban memori sakabèhé bisa nambah dramatically.

tau tegese transparent hugepages ora bakal kalebu sanajan dijaluk nggunakake madvise. Kanggo ngerteni luwih akeh, hubungi dokumentasi Kernel Linux.

Carane ngganti nilai standar

Opsi 1: Langsung ganti sysfs (sawise urip maneh parameter bakal bali menyang nilai standar):

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

Opsi 2: Ngganti standar sistem kanthi ngumpulake maneh kernel kanthi konfigurasi sing diowahi (opsi iki mung dianjurake yen sampeyan nggunakake kernel khusus):

  • Kanggo nyetel tansah kanthi gawan, gunakake:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Kanggo nyetel madvise minangka standar, gunakake:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Part 2: Kaluwihan lan Kekurangan HugePages

Kita bakal nyoba kanggo selektif nerangake kaluwihan, cacat lan pitfalls bisa nggunakake Hugepages. Amarga artikel teknologi sing rumit lan pedantic bakal angel dimangerteni kanggo wong sing kesasar mikir yen Hugepages minangka panacea, aku bakal ngorbanake akurasi kanggo kesederhanaan. Sampeyan mung kudu eling yen akeh topik sing rumit banget lan mulane disederhanakake.

Wigati dimangerteni manawa kita ngomong babagan sistem 64-bit x86 sing nganggo Linux, lan aku mung nganggep manawa sistem kasebut ndhukung kaca gedhe sing transparan (amarga ora dadi kerugian manawa kaca gedhe ora ditindih), kaya sing kedadeyan ing meh kabeh Linux modern. lingkungan.

Aku bakal masang katrangan luwih teknis ing pranala ing ngisor iki.

Memori virtual

Yen sampeyan programmer C ++, sampeyan ngerti yen obyek ing memori duwe alamat tartamtu (nilai pointer).

Nanging, alamat kasebut ora kudu nggambarake alamat fisik ing memori (alamat RAM). Padha makili alamat ing memori virtual. Prosesor duwe modul MMU (unit manajemen memori) khusus sing mbantu kernel map memori virtual menyang lokasi fisik.

Pendekatan iki nduweni akeh kaluwihan, nanging sing paling penting yaiku:

  • Kinerja (kanggo macem-macem alasan);
  • Isolasi program, yaiku, ora ana program sing bisa maca saka memori program liyane.

Apa iku kaca?

Memori virtual dipΓ©rang dadi kaca. Saben kaca individu nunjuk menyang memori fisik tartamtu, bisa nuding menyang area ing RAM, utawa bisa nuding menyang alamat sing ditugasake menyang piranti fisik, kayata kertu video.

Umume kaca sing sampeyan tindakake karo salah siji titik menyang RAM utawa diganti, tegese padha disimpen ing hard drive utawa SSD. Kernel ngatur tata letak fisik saben kaca. Yen kaca spoofed diakses, kernel mungkasi thread sing nyoba kanggo ngakses memori, maca kaca saka hard drive / SSD menyang RAM, banjur terus nglakokakΓ© thread.

Proses iki stream transparent, tegese iku ora kudu maca langsung saka HDD / SSD. Ukuran kaca normal yaiku 4096 bita. Ukuran Hugpages yaiku 2 megabyte.

Buffer asosiatif terjemahan (TLB)

Nalika program ngakses kaca memori, CPU kudu ngerti saka kaca fisik kanggo maca data (yaiku, duwe peta alamat virtual).

Kernel nduweni struktur data (tabel kaca) sing ngemot kabeh informasi babagan kaca sing digunakake. Nggunakake struktur data iki, sampeyan bisa map alamat virtual menyang alamat fisik.

Nanging, tabel kaca cukup rumit lan alon, mula kita ora bisa nganalisa kabeh struktur data saben proses ngakses memori.

Untunge, prosesor kita duwe TLB sing nyimpen pemetaan ing antarane alamat virtual lan fisik. Iki tegese sanajan kita kudu ngurai tabel kaca ing upaya akses pisanan, kabeh akses sakteruse menyang kaca bisa ditangani ing TLB, ngidini kanggo operasi cepet.

Amarga wis dileksanakake minangka piranti fisik (sing ndadekake cepet ing Panggonan pisanan), kapasitas winates. Dadi yen sampeyan pengin ngakses luwih akeh kaca, TLB ora bakal bisa nyimpen pemetaan kanggo kabeh, nyebabake program sampeyan mlaku luwih alon.

Hugpages teka kanggo ngluwari

Dadi, apa sing bisa ditindakake kanggo ngindhari kebanjiran TLB? (We nganggep program isih perlu jumlah memori sing padha).

Iki ngendi Hugpages mlebu. Tinimbang 4096 bita sing mbutuhake mung siji entri TLB, siji entri TLB saiki bisa nuding 2 megabyte. Ayo nganggep TLB duwe 512 entri, ing kene tanpa Hugpages kita bisa cocog:

4096 bβ‹…512=2 MB

Banjur kepiye kita bisa mbandhingake karo dheweke:

2 MBβ‹…512=1 GB

Mulane Hugepages apik tenan. Padha bisa nambah produktivitas tanpa akeh gaweyan. Nanging ana caveats penting ing kene.

Hugpages spoofing

Kernel kanthi otomatis ngawasi sepira kerepe saben kaca memori digunakake. Yen ora cukup memori fisik (RAM), kernel bakal mindhah kaca sing kurang penting (kurang kerep digunakake) menyang hard disk kanggo mbebasake sawetara RAM kanggo kaca sing luwih penting.
Ing asas, padha ditrapake kanggo Hugepages. Nanging, kernel mung bisa ngganti kabeh kaca, dudu bait individu.

Ayo kita duwe program kaya iki:

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

Ing kasus iki, kernel kudu ngganti (maca) minangka akeh minangka 2 megabyte informasi saka hard drive / SSD mung kanggo maca siji bait. Kanggo kaca biasa, mung 4096 bita sing kudu diwaca saka hard drive / SSD.

Mulane, yen hugepage ditimpa, mung luwih cepet maca yen sampeyan kudu ngakses kabeh kaca. Iki tegese yen sampeyan nyoba ngakses macem-macem bagean memori kanthi acak lan mung maca sawetara kilobyte, sampeyan kudu nggunakake kaca biasa lan ora sumelang ing bab liya.

Ing tangan liyane, yen sampeyan kudu ngakses bagean gedhe saka memori sequentially, largepages bakal nambah kinerja. Nanging, sampeyan kudu nyoba dhewe (ora nganggo piranti lunak abstrak) lan ndeleng apa sing luwih cepet.

Alokasi ing memori

Yen sampeyan nulis C, sampeyan ngerti yen sampeyan bisa njaluk jumlah memori sing cilik (utawa meh sewenang-wenang) saka tumpukan nggunakake malloc(). Contone, sampeyan butuh memori 30 bita:

char* mymemory = malloc(30);

Kanggo programmer, bisa uga katon yen sampeyan "njaluk" 30 bait memori saka sistem operasi lan bali pitunjuk kanggo sawetara memori virtual. Nanging nyatane malloc () iku mung fungsi C sing nelpon saka ing fungsi brk lan sbrk kanggo njaluk utawa mbebasake memori saka sistem operasi.

Nanging, njaluk memori liyane lan liyane kanggo saben alokasi ora efisien; iku paling kamungkinan sing sawetara bagean memori wis dibebaske (free()), lan kita bisa nggunakake maneh. malloc() ngleksanakake algoritma cukup Komplek kanggo nggunakake maneh memori dibebaske.

Ing wektu sing padha, kabeh kedadeyan sing ora dingerteni kanggo sampeyan, mula kenapa sampeyan kudu kuwatir? Nanging amarga tantangan free() ora ateges memori kudu bali langsung menyang sistem operasi.

Ana bab kayata fragmentasi memori. Ing kasus sing ekstrem, ana segmen tumpukan sing mung sawetara bait sing digunakake, dene kabeh sing ana ing antarane wis dibebasake. (free()).

Wigati dimangerteni manawa fragmentasi memori minangka topik sing rumit banget, lan owah-owahan cilik ing program bisa duwe pengaruh sing signifikan. Umume kasus, program ora bakal nyebabake fragmentasi memori sing signifikan, nanging sampeyan kudu ngerti yen ana masalah karo fragmentasi ing sawetara area tumpukan, kaca gedhe bisa nggawe kahanan luwih elek.

Panganggone kaca gedhe kanthi selektif

Sawise maca artikel iki, sampeyan wis nemtokake bagean saka program sampeyan bisa entuk manfaat saka nggunakake kaca gedhe lan sing ora bisa. Dadi apa kaca gedhe kudu diaktifake?

Untunge sampeyan bisa nggunakake madvise()kanggo ngaktifake hugepaging mung kanggo wilayah memori sing bakal migunani.

Pisanan, priksa manawa hugepages mlaku ing mode madvise () nggunakake instruksi ing wiwitan artikel.

Banjur, gunakake madvise()kanggo ngandhani kernel persis ing ngendi nggunakake 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)

Elinga yen cara iki mung saran kanggo kernel babagan carane ngatur memori. Iki ora ateges kernel bakal kanthi otomatis nggunakake kaca gedhe kanggo memori tartamtu.

Deleng dokumentasi (manpage)madvisekanggo mangerteni sing luwih lengkap babagan manajemen memori lan madvise(), topik iki duwe kurva learning luar biasa tajem. Dadi yen sampeyan pengin dadi apik, siyap maca lan nyoba sawetara minggu sadurunge ngarepake asil sing positif.

Apa sing kudu diwaca?

Duwe pitakonan? Tulis ing komentar!

Source: www.habr.com

Add a comment