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 "İdarəçi Linux».

Əvvəllər Hugepages-in istifadəsini necə yoxlamaq və aktivləşdirmək barədə danışmışdım Linux.
Bu məqalə yalnız Hugepages üçün həqiqətən istifadə vəziyyətiniz varsa faydalı olacaq. Hugepages-in performansını sehrli şəkildə artıracağı vədi ilə aldanan bir çox insanla qarşılaşdım. Bununla belə, böyük səhifələmə mürəkkəb bir mövzudur və səhv istifadə olunarsa, həqiqətən performansı aşağı sala bilər.

Hissə 1: Hugepages-in aktiv olub olmadığını yoxlayın Linux (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), hal-hazırda aktiv seçim mötərizədə (defolt 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 Hər zaman və bütün proseslər üçün 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. Əlavə məlumat üçün müraciət edin sənədləşdirmə nüvələr Linux.

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 nüvədən istifadə edirsinizsə tövsiyə olunur):

  • Həmişə defolt 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ə potensial tələlərini seçmə şəkildə izah etməyə çalışacağıq. Texnoloji cəhətdən mürəkkəb və pedantik məqalənin böyük ehtimalla Hugepages-in panacea olduğunu düşünənlər üçün başa düşülməsi çətin olacağından, sadəlik üçün dəqiqliyi qurban verəcəyəm. Nəzərə almaq lazımdır ki, bir çox mövzular 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 64 bitlik x86 sistemlərində işləyir Linuxvə mən sadəcə olaraq sistemin şəffaf böyük səhifələri dəstəklədiyini fərz edirəm (çünki böyük səhifələrin əvəz edilməməsi mənfi cəhət deyil), demək olar ki, hər hansı bir müasir mühitdə olduğu kimi Linux.

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 fiziki yaddaş ünvanlarını (RAM ünvanları) əks etdirmir. Onlar virtual yaddaş ünvanlarını təmsil edirlər. Prosessorda nüvəyə virtual yaddaşı fiziki yerlərə köçürməyə kömək edən xüsusi modul, MMU (yaddaş idarəetmə vahidi) var.

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

  • Məhsuldarlıq (müxtəlif səbəblərə görə);
  • Proqram izolyasiyası, yəni heç bir proqram başqa bir 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ə ya RAM-da yer, ya da qrafik kartı kimi fiziki cihaza təyin edilmiş ünvan ola bilən xüsusi fiziki yaddaş yerini göstərir.

Əlaqə saxladığınız səhifələrin əksəriyyəti ya RAM-a işarə edir, ya da dəyişdirilir, yəni onlar sabit diskdə və ya SSD-də saxlanılır. Kernel hər səhifənin fiziki yerini idarə edir. Əgər dəyişdirilmiş səhifəyə giriş olarsa, nüvə yaddaşa daxil olmaq cəhdini dayandırır, səhifəni sabit diskdən/SSD-dən RAM-a oxuyur və sonra ipin icrasına davam edir.

Bu proses şəffafdır, yəni o, mütləq sabit diskdən/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ə Baxış Buferi (TLB)

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

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 strukturu virtual ünvanı fiziki ünvana uyğunlaşdırmağa imkan verir.

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, prosessorumuzda virtual və fiziki ünvanlar arasında xəritələşməni önbelleğe alan TLB var. Bu o deməkdir ki, ilk giriş cəhdi üçün səhifə cədvəlini təhlil etməmiz lazım olsa da, bütün sonrakı səhifə girişləri sürətli əməliyyatı təmin etməklə TLB-də işlənə bilər.

Fiziki bir cihaz kimi həyata keçirildiyi üçün (ilk növbədə onu sürətli edir), onun tutumu məhduddur. Buna görə də, daha çox səhifəyə daxil olmaq istəyirsinizsə, TLB onların hamısı üçün xəritələri saxlaya bilməyəcək və 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.)

Böyük səhifələr burada daxil olur. Yalnız bir TLB girişi tələb edən 4096 bayt əvəzinə, bir TLB girişi indi nəhəng 2 meqabaytı göstərə bilər. Böyük səhifələr olmadan 512 girişli TLB-ni fərz etsək, xəritəni çəkə bilərik:

4096 b⋅512=2 MB

Onda onları necə müqayisə edə bilərik:

2 MB⋅512=1 GB

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

Hugepages Əvəzetmə

Kernel avtomatik olaraq hər bir yaddaş səhifəsinin nə qədər tez-tez istifadə edildiyini izləyir. Fiziki yaddaş (RAM) kifayət deyilsə, 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 ləpə sabit diskdən/SSD-dən tam 2 meqabaytlıq məlumatı dəyişdirməli (oxumalıdır). Adi səhifələr üçün sabit diskdən/SSD-dən yalnız 4096 bayt oxunmalıdır.

Buna görə də, böyük səhifə dəyişdirilərsə, onu oxumaq yalnız bütün səhifəyə daxil olmaq lazımdırsa, daha sürətli olur. Bu o deməkdir ki, əgər siz təsadüfi olaraq yaddaşın müxtəlif hissələrinə daxil olursunuzsa və sadəcə bir neçə kilobayt oxuyursunuzsa, adi səhifələrdən istifadə etməli və başqa heç nəyə görə 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ə, bunu özünüz sınamalısınız (mücərrəd proqram təminatı ilə deyil) və hansının daha sürətli işlədiyini görməlisiniz.

Yaddaşın ayrılması

Ə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 reallıqda malloc () — sadəcə daxildən funksiyaları çağıran C funksiyasıdır brk və sbrk əməliyyat sistemindən yaddaş tələb etmək və ya buraxmaq.

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.

Bununla belə, sizin üçün hər şey gözədəyməz olur, bəs niyə sizi narahat etməlidir? Çünki problem free() o demək deyil yaddaş həmişə əməliyyat sisteminə dərhal qaytarılır.

Yaddaşın parçalanması deyilən bir anlayış var. Ekstremal hallarda yığın seqmentləri var ki, orada cəmi bir neçə bayt istifadə olunur, halbuki aralarındakı hər şey sərbəst buraxılmışdı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ə ona əhəmiyyətli dərəcədə 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 olmur, lakin bilməlisiniz ki, parçalanma yığının müəyyən bir sahəsində problemdirsə, 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 siz proqramınızın hansı hissələrinin nəhəng səhifələrdən faydalana biləcəyini, hansının isə yaramayacağını müəyyən etdiniz. Beləliklə, ümumiyyətlə böyük səhifələri aktivləşdirməlisiniz?

Xoşbəxtlikdən, istifadə edə bilərsiniz madvise()yalnız faydalı olacağı 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)

Nəzərə alın ki, bu metod sadəcə olaraq kernelə yaddaşın idarə edilməsi tövsiyəsidir. 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ə müraciət edin (manpage) madviseyaddaşın idarə edilməsi 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ə bununla məşğul olmaq istəyirsinizsə, hər hansı müsbət nəticə gözləməzdən əvvəl bir neçə həftə oxumağa və test etməyə hazırlaşın.

Nə oxumalı?

Sualiniz var? Şərh buraxın!

Mənbə: www.habr.com

DDoS mühafizəsi, VPS VDS serverləri olan saytlar üçün etibarlı hostinq alın 🔥 DDoS qorunması, VPS VDS serverləri ilə etibarlı veb sayt hostinqi alın | ProHoster