HugePages-ийн давуу болон сул талууд

HugePages-ийн давуу болон сул талууд

Курсын оюутнуудад зориулан бэлтгэсэн нийтлэлийн орчуулга "Linux администратор".

Өмнө нь би Hugepages-ийг Линукс дээр хэрхэн туршиж, идэвхжүүлэх талаар ярьж байсан.
Хэрэв та үнэхээр Hugepages ашиглах газартай бол энэ нийтлэл хэрэг болно. Би Hugepages бүтээмжийг ид шидээр сайжруулна гэж хууртсан олон хүмүүстэй таарсан. Гэсэн хэдий ч, bigpages нь нарийн төвөгтэй сэдэв бөгөөд буруу ашиглавал гүйцэтгэлийг доройтуулж болзошгүй юм.

1-р хэсэг: Линукс дээр асар том хуудсыг идэвхжүүлсэн эсэхийг шалгах (эх хувь энд)

Асуудал:
Таны систем дээр HugePages идэвхжсэн эсэхийг шалгах хэрэгтэй.

шийдэл:
Энэ нь маш энгийн:

cat /sys/kernel/mm/transparent_hugepage/enabled

Та иймэрхүү зүйлийг авах болно:

always [madvise] never

Та боломжтой сонголтуудын жагсаалтыг харах болно (үргэлж, галзуу, хэзээ ч), одоо идэвхтэй байгаа сонголтыг хаалтанд оруулах болно (анхдагчаар галзуу).

галзуу гэсэн үг transparent hugepages Зөвхөн асар том хуудсыг ашиглахыг хүссэн санах ойн хэсгүүдэд идэвхжүүлсэн галзуу (2).

үргэлж гэсэн үг transparent hugepages бүх процессуудад үргэлж идэвхждэг. Энэ нь ихэвчлэн гүйцэтгэлийг сайжруулдаг боловч хэрэв танд олон процессууд бага хэмжээний санах ой зарцуулдаг хэрэглээний тохиолдол байгаа бол санах ойн нийт ачаалал эрс нэмэгдэх болно.

хэзээ ч гэсэн үг transparent hugepages madvise ашиглан хүсэлт гаргасан ч оруулахгүй. Илүү ихийг мэдэхийг хүсвэл холбоо барина уу баримт бичиг Линуксийн цөмүүд.

Анхдагч утгыг хэрхэн өөрчлөх вэ

Сонголт 1: Шууд өөрчлөх sysfs (дахин ачаалсны дараа параметр нь үндсэн утга руугаа буцна):

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

Сонголт 2: Өөрчлөгдсөн тохиргоотой цөмийг дахин хөрвүүлэх замаар системийн өгөгдмөл тохиргоог өөрчил (хэрэв та тусгай цөм ашиглаж байгаа бол энэ сонголтыг ашиглахыг зөвлөж байна):

  • Үргэлж анхдагчаар тохируулахын тулд:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Madvise-г өгөгдмөл болгож тохируулахын тулд:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

2-р хэсэг: HugePages-ийн давуу болон сул талууд

Бид Hugepages-ийг ашиглахын давуу тал, сул тал, болзошгүй хүндрэлүүдийг сонгон тайлбарлахыг хичээх болно. Технологийн хувьд нарийн төвөгтэй, мэдлэгтэй нийтлэлийг Hugepages бол эм гэж төөрөгдүүлсэн хүмүүст ойлгоход хэцүү байх тул би энгийн байхын тулд нарийвчлалыг золиослох болно. Маш олон сэдвүүд үнэхээр төвөгтэй тул маш хялбаршуулсан гэдгийг санах нь зүйтэй.

Бид Линукс дээр ажилладаг 64 битийн x86 системийн тухай ярьж байгаа бөгөөд бараг л орчин үеийн Линукс дээр байдаг шиг систем нь тунгалаг асар том хуудсуудыг дэмждэг гэж би бодож байгааг анхаарна уу (учир нь асар том хуудсыг дарж бичихгүй байх нь сул тал биш юм). орчин.

Би техникийн дэлгэрэнгүй тайлбарыг доорх холбоос дээр хавсаргах болно.

Виртуал санах ой

Хэрэв та C++ програмист бол санах ойд байгаа объектууд тодорхой хаягтай (заагч утгууд) байдгийг та мэднэ.

Гэхдээ эдгээр хаягууд нь санах ой дахь физик хаягуудыг (RAM хаягууд) тусгах албагүй. Тэд виртуал санах ой дахь хаягуудыг төлөөлдөг. Процессор нь тусгай MMU (санах ойн удирдлагын нэгж) модультай бөгөөд энэ нь цөмийн виртуал санах ойг физик байршилд буулгахад тусалдаг.

Энэ арга нь олон давуу талтай боловч хамгийн чухал нь:

  • Гүйцэтгэл (янз бүрийн шалтгааны улмаас);
  • Програмыг тусгаарлах, өөрөөр хэлбэл ямар ч програм өөр програмын санах ойноос уншиж чадахгүй.

Хуудас гэж юу вэ?

Виртуал санах ой нь хуудсанд хуваагдана. Хуудас бүр нь тодорхой физик санах ой руу чиглүүлж, RAM дахь хэсэг рүү чиглэж болно, эсвэл видео карт гэх мэт физик төхөөрөмжид оноосон хаягийг зааж болно.

Таны хардаг ихэнх хуудсууд нь RAM-д чиглэсэн эсвэл солигддог бөгөөд энэ нь таны хатуу диск эсвэл SSD дээр хадгалагддаг гэсэн үг юм. Цөм нь хуудас бүрийн физик байршлыг удирддаг. Хуурамч хуудсанд хандсан тохиолдолд цөм нь санах ой руу нэвтрэхийг оролдож буй хэлхээг зогсоож, хуудсыг хатуу диск/SSD-ээс RAM руу уншиж, дараа нь хэлхээг үргэлжлүүлэн ажиллуулна.

Энэ процесс нь урсгал тунгалаг бөгөөд энэ нь HDD/SSD-ээс шууд унших шаардлагагүй гэсэн үг юм. Ердийн хуудасны хэмжээ 4096 байт байна. Асар том хуудасны хэмжээ 2 мегабайт байна.

Орчуулгын ассоциатив буфер (TLB)

Програм санах ойн хуудсанд хандах үед CPU нь аль физик хуудаснаас өгөгдлийг уншихаа мэддэг байх ёстой (өөрөөр хэлбэл виртуал хаягийн зурагтай).

Цөм нь ашиглагдаж буй хуудсуудын талаарх бүх мэдээллийг агуулсан өгөгдлийн бүтэцтэй (хуудасны хүснэгт). Энэхүү өгөгдлийн бүтцийг ашигласнаар та виртуал хаягийг физик хаягтай холбож болно.

Гэсэн хэдий ч хуудасны хүснэгт нь нэлээд төвөгтэй бөгөөд удаан байдаг тул процесс санах ойд хандах бүрт өгөгдлийн бүтцийг бүхэлд нь шинжлэх боломжгүй юм.

Аз болоход, манай процессор нь виртуал болон физик хаягуудын хоорондох зураглалыг кэш болгодог TLB-тэй. Энэ нь бид эхний хандалтын оролдлогоор хуудасны хүснэгтийг задлан шинжлэх шаардлагатай гэсэн үг боловч хуудасны дараачийн бүх хандалтыг TLB-д зохицуулж, хурдан ажиллах боломжийг олгоно.

Энэ нь физик төхөөрөмж хэлбэрээр хэрэгждэг тул (энэ нь үүнийг эхний ээлжинд хурдан болгодог) хүчин чадал нь хязгаарлагдмал байдаг. Тиймээс хэрэв та илүү олон хуудсуудад хандахыг хүсвэл TLB нь бүгдэд зориулсан зураглалыг хадгалах боломжгүй тул таны програм илүү удаан ажиллах болно.

Хагепэйс аврахаар ирдэг

Тэгэхээр бид TLB халихаас зайлсхийхийн тулд юу хийж чадах вэ? (Хөтөлбөрт ижил хэмжээний санах ой хэрэгтэй хэвээр байна гэж бид таамаглаж байна).

Эндээс Hugepages орж ирдэг. Зөвхөн нэг TLB оруулга шаардагдах 4096 байтын оронд нэг TLB оруулга одоо асар их 2 мегабайтыг зааж өгөх боломжтой. TLB-д 512 оруулга байгаа гэж үзье, энд Hugepages байхгүй бол бид тохирох болно:

4096 b⋅512=2 MB

Тэгвэл бид тэдэнтэй хэрхэн харьцуулах вэ:

2 MB⋅512=1 GB

Ийм учраас Hugepages гайхалтай. Тэд маш их хүчин чармайлтгүйгээр бүтээмжийг нэмэгдүүлэх боломжтой. Гэхдээ энд чухал анхааруулга байна.

Асар их хуудас хуурамчаар үйлдэх

Цөм нь санах ойн хуудас бүрийг хэр олон удаа ашиглаж байгааг автоматаар хянадаг. Хэрэв хангалттай физик санах ой (RAM) байхгүй бол цөм нь чухал биш (бага ашиглагддаг) хуудсуудыг хатуу диск рүү зөөж, илүү чухал хуудсуудад RAM-г суллах болно.
Зарчмын хувьд энэ нь Hugepages-д хамаарна. Гэсэн хэдий ч цөм нь зөвхөн бүх хуудсуудыг солих боломжтой болохоос бие даасан байтыг солихгүй.

Бидэнд ийм програм байна гэж бодъё:

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

Энэ тохиолдолд цөм нь зөвхөн нэг байт уншихын тулд хатуу диск/SSD-ээс 2 мегабайт мэдээллийг солих (унших) шаардлагатай болно. Ердийн хуудасны хувьд хатуу диск/SSD-ээс зөвхөн 4096 байт унших шаардлагатай.

Тиймээс, хэрэв bigpage-г дарж тэмдэглэсэн бол бүх хуудсанд хандах шаардлагатай бол уншихад илүү хурдан болно. Энэ нь хэрэв та санах ойн өөр өөр хэсгүүдэд санамсаргүй байдлаар хандахыг оролдож байгаа бөгөөд хэдхэн килобайт уншиж байгаа бол ердийн хуудас ашиглах хэрэгтэй бөгөөд өөр зүйлд санаа зовох хэрэггүй болно.

Нөгөөтэйгүүр, хэрэв та санах ойн ихээхэн хэсгийг дараалан ашиглах шаардлагатай бол асар том хуудас таны гүйцэтгэлийг сайжруулах болно. Гэсэн хэдий ч, та үүнийг өөрөө туршиж үзэх хэрэгтэй (хийсвэр програм хангамжаар биш), юу илүү хурдан ажиллахыг харах хэрэгтэй.

Санах ойд хуваарилах

Хэрэв та С гэж бичвэл овоолгоос дур мэдэн бага (эсвэл бараг дур зоргоороо их) санах ойг хүсэх боломжтой гэдгийг та мэднэ. malloc(). Танд 30 байт санах ой хэрэгтэй гэж бодъё:

char* mymemory = malloc(30);

Програмист хүний ​​хувьд та үйлдлийн системээс 30 байт санах ойг "хүсэж", зарим виртуал санах ой руу заагчийг буцааж өгч байгаа мэт санагдаж магадгүй юм. Гэхдээ үнэндээ malloc () нь зөвхөн функц дотроос дууддаг C функц юм brk болон sbrk үйлдлийн системээс санах ой хүсэх эсвэл суллах.

Гэсэн хэдий ч хуваарилалт бүрт илүү их санах ойг хүсэх нь үр ашиггүй; санах ойн зарим хэсгийг аль хэдийн сулласан байх магадлалтай (free()), мөн бид үүнийг дахин ашиглах боломжтой. malloc() суллагдсан санах ойг дахин ашиглах нэлээд төвөгтэй алгоритмуудыг хэрэгжүүлдэг.

Үүний зэрэгцээ бүх зүйл таны хувьд анзааралгүй тохиолддог, тэгвэл яагаад энэ нь танд санаа зовох ёстой гэж? Гэхдээ сорилт тул free() тийм гэсэн үг биш санах ойг үйлдлийн систем рүү нэн даруй буцааж өгөх ёстой.

Санах ойн хуваагдал гэж байдаг. Хэт их тохиолдлуудад цөөн хэдэн байтыг ашигладаг овоолгын сегментүүд байдаг бөгөөд тэдгээрийн хоорондох бүх зүйл чөлөөлөгдсөн байдаг. (free()).

Санах ойн хуваагдал нь үнэхээр нарийн төвөгтэй сэдэв бөгөөд програмд ​​бага зэрэг өөрчлөлт оруулах нь ихээхэн нөлөө үзүүлж болохыг анхаарна уу. Ихэнх тохиолдолд програмууд нь санах ойн хуваагдал үүсгэдэггүй, гэхдээ овоолгын зарим хэсэгт хуваагдах асуудал гарвал асар том хуудас нь нөхцөл байдлыг улам дордуулж болзошгүйг анхаарах хэрэгтэй.

Асар том хуудсыг сонгон ашиглах

Энэ нийтлэлийг уншсаны дараа та програмынхаа аль хэсэг нь bigpages ашиглах нь ашиг тустай, аль нь боломжгүй болохыг тодорхойлсон. Тэгэхээр асар том хуудсыг идэвхжүүлэх ёстой юу?

Аз болоход та ашиглаж болно madvise()Зөвхөн хэрэгтэй санах ойн хэсгүүдэд зориулж асар том хуудсыг идэвхжүүлэх.

Нэгдүгээрт, bigpages madvise() горимд ажиллаж байгаа эсэхийг шалгаарай зааварчилгаа нийтлэлийн эхэнд.

Дараа нь ашигла madvise()том хуудсыг хаана ашиглахыг цөмд хэлэх.

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

Энэ арга нь санах ойг хэрхэн удирдах талаар цөмд өгөх энгийн зөвлөгөө гэдгийг анхаарна уу. Энэ нь цөм нь өгөгдсөн санах ойд автоматаар асар том хуудсыг ашиглана гэсэн үг биш юм.

Баримт бичигт хандана уу (ман хуудас) галзууруулахсанах ойн менежментийн талаар илүү ихийг мэдэх болон madvise(), энэ сэдэв нь гайхалтай огцом суралцах муруйтай. Тиймээс хэрэв та үүнийг үнэхээр сайн эзэмшихийг хүсч байгаа бол эерэг үр дүнг хүлээхээсээ өмнө хэдэн долоо хоногийн турш уншиж, туршиж үзэхэд бэлдээрэй.

Юу унших вэ?

Асуулт байна уу? Сэтгэгдэл дээр бичээрэй!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх