HugePages-in üstünlükləri və mənfi cəhətləri

HugePages-in üstünlükləri və mənfi cəhətləri

Kurs tələbələri üçün hazırlanmış məqalənin tərcüməsi "Linux Administrator".

Əvvəllər Linux-da Hugepages-i necə sınamaq və aktivləşdirmək barədə danışmışdım.
Bu məqalə yalnız Hugepages-dən istifadə etmək üçün bir yeriniz varsa faydalı olacaq. Mən Hugepages-in məhsuldarlığı sehrli şəkildə artıracağına aldanan bir çox insanla tanış oldum. Bununla belə, böyük səhifələmə mürəkkəb bir mövzudur və düzgün istifadə edilmədikdə performansı aşağı sala bilər.

1-ci hissə: Linux-da nəhəng səhifələrin aktiv olduğunun təsdiqlənməsi (orijinal burada)

Problem:
Sisteminizdə HugePages-in aktiv olub olmadığını yoxlamaq lazımdır.

həll:
Bu olduqca sadədir:

cat /sys/kernel/mm/transparent_hugepage/enabled

Bu kimi bir şey alacaqsınız:

always [madvise] never

Mövcud seçimlərin siyahısını görəcəksiniz (həmişə, dəli, heç vaxt) və hazırda aktiv seçim mötərizə içərisində olacaq (standart olaraq dəli).

dəli bunun mənası transparent hugepages yalnız istifadə edərək nəhəng səhifələri açıq şəkildə tələb edən yaddaş sahələri üçün aktivləşdirilir dəli (2).

həmişə bunun mənası transparent hugepages bütün proseslər üçün həmişə aktivdir. Bu, adətən performansı yaxşılaşdırır, lakin bir çox proseslərin az miqdarda yaddaş istehlak etdiyi bir istifadə halınız varsa, ümumi yaddaş yükü kəskin şəkildə arta bilər.

heç bunun mənası transparent hugepages madvise istifadə edərək tələb edildikdə belə daxil edilməyəcək. Ətraflı məlumat üçün əlaqə saxlayın sənədləşdirmə Linux nüvələri.

Varsayılan dəyəri necə dəyişdirmək olar

Seçim 1: Birbaşa dəyişdirin sysfs (yenidən başladıqdan sonra parametr standart dəyərinə qayıdacaq):

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

Seçim 2: Dəyişdirilmiş konfiqurasiya ilə nüvəni yenidən tərtib etməklə sistemin defoltunu dəyişdirin (bu seçim yalnız xüsusi kernel istifadə edirsinizsə tövsiyə olunur):

  • Həmişə standart olaraq təyin etmək üçün istifadə edin:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Madvise'i defolt olaraq təyin etmək üçün istifadə edin:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

2-ci hissə: HugePages-in üstünlükləri və mənfi cəhətləri

Biz Hugepages-dən istifadənin üstünlüklərini, mənfi cəhətlərini və mümkün tələlərini seçmə şəkildə izah etməyə çalışacağıq. Texnoloji cəhətdən mürəkkəb və pedantik bir məqalənin böyük ehtimalla Hugepages-in panacea olduğunu düşünən insanlar üçün başa düşülməsi çətin olacağından, mən sadəlik üçün dəqiqliyi qurban verəcəyəm. Sadəcə nəzərə almağa dəyər ki, bir çox mövzu həqiqətən mürəkkəbdir və buna görə də çox sadələşdirilmişdir.

Nəzərə alın ki, söhbət Linux ilə işləyən 64 bitlik x86 sistemlərindən gedir və mən sadəcə olaraq güman edirəm ki, sistem şəffaf nəhəng səhifələri dəstəkləyir (çünki nəhəng səhifələrin üzərinə yazılmaması dezavantaj deyil), demək olar ki, hər hansı müasir Linux-da olduğu kimi mühit.

Aşağıdakı linklərdə daha çox texniki təsvir əlavə edəcəyəm.

Virtual Yaddaş

Əgər siz C++ proqramçısısınızsa, bilirsiniz ki, yaddaşdakı obyektlərin xüsusi ünvanları (göstərici dəyərləri) var.

Bununla belə, bu ünvanlar mütləq yaddaşdakı fiziki ünvanları (RAM ünvanları) əks etdirmir. Onlar virtual yaddaşda ünvanları təmsil edirlər. Prosessorda nüvənin virtual yaddaşı fiziki məkanla əlaqələndirməsinə kömək edən xüsusi MMU (yaddaş idarəetmə vahidi) modulu var.

Bu yanaşmanın bir çox üstünlükləri var, lakin ən vacibləri bunlardır:

  • Performans (müxtəlif səbəblərə görə);
  • Proqramın izolyasiyası, yəni heç bir proqram başqa proqramın yaddaşından oxuya bilməz.

Səhifələr nədir?

Virtual yaddaş səhifələrə bölünür. Hər bir fərdi səhifə müəyyən bir fiziki yaddaşa işarə edir, o, RAM-da bir sahəyə işarə edə bilər və ya video kart kimi fiziki cihaza təyin edilmiş ünvanı göstərə bilər.

İşlədiyiniz səhifələrin əksəriyyəti ya RAM-a işarə edir, ya da dəyişdirilir, yəni onlar sabit diskinizdə və ya SSD-də saxlanılır. Kernel hər səhifənin fiziki tərtibatını idarə edir. Saxta səhifəyə daxil olarsa, nüvə yaddaşa daxil olmağa çalışan ipi dayandırır, səhifəni sabit diskdən/SSD-dən RAM-a oxuyur və sonra mövzunu icra etməyə davam edir.

Bu proses axın şəffafdır, yəni o, mütləq HDD/SSD-dən birbaşa oxunmur. Normal səhifələrin ölçüsü 4096 baytdır. Böyük səhifələrin ölçüsü 2 meqabaytdır.

Tərcümə-assosiativ bufer (TLB)

Proqram yaddaşın səhifəsinə daxil olduqda, CPU məlumatı hansı fiziki səhifədən oxuyacağını bilməlidir (yəni virtual ünvan xəritəsi var).

Nüvədə istifadə olunan səhifələr haqqında bütün məlumatları ehtiva edən məlumat strukturu (səhifə cədvəli) var. Bu məlumat strukturundan istifadə edərək virtual ünvanı fiziki ünvanla əlaqələndirə bilərsiniz.

Bununla belə, səhifə cədvəli olduqca mürəkkəb və yavaşdır, ona görə də proses yaddaşa hər dəfə daxil olanda biz sadəcə olaraq bütün məlumat strukturunu təhlil edə bilmirik.

Xoşbəxtlikdən, prosessorumuz virtual və fiziki ünvanlar arasında xəritələşdirməni önbelleğe alan TLB-yə malikdir. Bu o deməkdir ki, ilk giriş cəhdində səhifə cədvəlini təhlil etməmiz lazım olsa da, səhifəyə bütün sonrakı girişlər sürətli işləməyə imkan verən TLB-də idarə oluna bilər.

Fiziki bir cihaz kimi həyata keçirildiyi üçün (bu onu ilk növbədə sürətləndirir), tutumu məhduddur. Beləliklə, daha çox səhifəyə daxil olmaq istəyirsinizsə, TLB onların hamısı üçün xəritələri saxlaya bilməyəcək, bu da proqramınızın daha yavaş işləməsinə səbəb olacaq.

Hugepages köməyə gəlir

Beləliklə, TLB daşmasının qarşısını almaq üçün nə edə bilərik? (Biz güman edirik ki, proqram hələ də eyni miqdarda yaddaşa ehtiyac duyur).

Burada Hugepages gəlir. Yalnız bir TLB girişi tələb edən 4096 bayt əvəzinə bir TLB girişi indi böyük 2 meqabayta işarə edə bilər. Fərz edək ki, TLB-də 512 giriş var, burada Hugepages olmadan uyğunlaşa bilərik:

4096 b⋅512=2 MB

Onda onlarla necə müqayisə edə bilərik:

2 MB⋅512=1 GB

Buna görə Hugepages möhtəşəmdir. Çox səy göstərmədən məhsuldarlığı artıra bilərlər. Ancaq burada əhəmiyyətli xəbərdarlıqlar var.

Böyük səhifələrin saxtalaşdırılması

Nüvə avtomatik olaraq hər bir yaddaş səhifəsinin nə qədər istifadə edildiyinə nəzarət edir. Kifayət qədər fiziki yaddaş (RAM) yoxdursa, nüvə daha vacib səhifələr üçün bir qədər RAM boşaltmaq üçün daha az vacib (daha az istifadə olunan) səhifələri sabit diskə köçürür.
Prinsipcə, eyni şey Hugepages-ə də aiddir. Bununla belə, nüvə fərdi baytları deyil, yalnız bütün səhifələri dəyişdirə bilər.

Tutaq ki, belə bir proqramımız var:

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

Bu halda, sizin bir baytı oxumağınız üçün kernel sabit diskdən/SSD-dən 2 meqabayt qədər məlumatı əvəz etməlidir (oxumalıdır). Adi səhifələrə gəldikdə, sabit diskdən/SSD-dən yalnız 4096 bayt oxumaq lazımdır.

Buna görə də, böyük səhifə ləğv edilərsə, bütün səhifəyə daxil olmaq lazımdırsa, onu oxumaq daha sürətli olur. Bu o deməkdir ki, əgər siz yaddaşın müxtəlif hissələrinə təsadüfi daxil olmağa çalışırsınızsa və sadəcə bir neçə kilobayt oxuyursunuzsa, adi səhifələrdən istifadə etməli və başqa heç nədən narahat olmamalısınız.

Digər tərəfdən, yaddaşın böyük bir hissəsinə ardıcıl olaraq daxil olmaq lazımdırsa, nəhəng səhifələr performansınızı yaxşılaşdıracaq. Bununla belə, özünüz test etməlisiniz (mücərrəd proqram təminatı ilə deyil) və nəyin daha sürətli işlədiyini görməlisiniz.

Yaddaşda yerləşdirmə

Əgər C yazsanız, bilirsiniz ki, yığından özbaşına kiçik (və ya demək olar ki, özbaşına böyük) həcmdə yaddaş tələb edə bilərsiniz. malloc(). Tutaq ki, sizə 30 bayt yaddaş lazımdır:

char* mymemory = malloc(30);

Proqramçıya elə görünə bilər ki, siz əməliyyat sistemindən 30 bayt yaddaş “tələb edirsiniz” və hansısa virtual yaddaşa göstərici qaytarırsınız. Amma əslində malloc () yalnız funksiyanın içindən çağıran C funksiyasıdır brk və sbrk əməliyyat sistemindən yaddaş tələb etmək və ya boşaltmaq üçün.

Bununla belə, hər bir ayırma üçün daha çox yaddaş tələb etmək səmərəsizdir; çox güman ki, bəzi yaddaş seqmenti artıq boşaldılıb (free()), və biz onu təkrar istifadə edə bilərik. malloc() boşaldılmış yaddaşın təkrar istifadəsi üçün kifayət qədər mürəkkəb alqoritmlər tətbiq edir.

Eyni zamanda, hər şey sizin üçün gözədəyməz olur, bəs bu sizi niyə narahat etməlidir? Ancaq problem olduğu üçün free() o demək deyil yaddaş mütləq əməliyyat sisteminə dərhal qaytarılır.

Yaddaşın parçalanması kimi bir şey var. Həddindən artıq hallarda, yığın seqmentləri var ki, orada yalnız bir neçə bayt istifadə olunur, halbuki aralarındakı hər şey sərbəst buraxılır. (free()).

Nəzərə alın ki, yaddaşın parçalanması inanılmaz dərəcədə mürəkkəb bir mövzudur və proqrama edilən kiçik dəyişikliklər belə əhəmiyyətli təsir göstərə bilər. Əksər hallarda proqramlar yaddaşın əhəmiyyətli dərəcədə parçalanmasına səbəb olmayacaq, lakin bilməlisiniz ki, yığının bəzi bölgələrində parçalanma ilə bağlı problem varsa, böyük səhifələr vəziyyəti daha da pisləşdirə bilər.

Nəhəng səhifələrin seçmə istifadəsi

Bu məqaləni oxuduqdan sonra proqramınızın hansı hissələrinin böyük səhifələrdən istifadə etməkdən faydalana biləcəyini və hansının yaramayacağını təyin etdiniz. Beləliklə, nəhəng səhifələr ümumiyyətlə aktivləşdirilməlidir?

Xoşbəxtlikdən istifadə edə bilərsiniz madvise()yalnız faydalı ola biləcəyi yaddaş sahələri üçün nəhəng səhifəni aktivləşdirmək.

Əvvəlcə, böyük səhifələrin madvise() rejimində işlədiyini yoxlayın təlimatlar məqalənin əvvəlində.

Sonra istifadə edin madvise()nüvəyə böyük səhifələrdən harada istifadə edəcəyini dəqiq söyləmək.

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

Qeyd edək ki, bu üsul yaddaşı necə idarə etmək barədə nüvəyə sadəcə məsləhətdir. Bu, nüvənin avtomatik olaraq verilmiş yaddaş üçün nəhəng səhifələrdən istifadə edəcəyi demək deyil.

Sənədlərə istinad edin (manpage) dəliyaddaş idarəçiliyi haqqında daha çox öyrənmək və madvise(), bu mövzunun inanılmaz dərəcədə dik öyrənmə əyrisi var. Buna görə də, həqiqətən də yaxşı olmaq niyyətindəsinizsə, müsbət nəticə gözləməzdən əvvəl bir neçə həftə oxumağa və sınaqdan keçirməyə hazır olun.

Nə oxumalı?

Sualiniz var? Şərhlərdə yazın!

Mənbə: www.habr.com

Добавить комментарий