Афзалиятҳо ва нуқсонҳои HugePages

Афзалиятҳо ва нуқсонҳои HugePages

Тарҷумаи мақола барои донишҷӯёни курс омода шудааст "Администратори Linux".

Пештар, ман дар бораи чӣ гуна озмоиш ва фаъол кардани Hugepages дар Linux сӯҳбат кардам.
Ин мақола танҳо муфид хоҳад буд, агар шумо воқеан ҷои истифодаи Hugepages дошта бошед. Ман бо бисёр одамон вохӯрдам, ки бо умеди он, ки Ҳугепжс маҳсулнокӣ ба таври ҷодугарӣ беҳтар хоҳад шуд, фирефтаанд. Бо вуҷуди ин, саҳифаи бузург як мавзӯи мураккаб аст ва дар сурати истифодаи нодуруст метавонад корҳоро паст кунад.

Қисми 1: Тасдиқи он, ки саҳифаҳои азим дар Linux фаъол карда шудаанд (асл дар ин ҷо)

Масъала:
Шумо бояд тафтиш кунед, ки оё HugePages дар системаи шумо фаъол аст.

ҳалли:
Ин хеле содда аст:

cat /sys/kernel/mm/transparent_hugepage/enabled

Шумо чунин чизе хоҳед гирифт:

always [madvise] never

Шумо рӯйхати имконоти дастрасро хоҳед дид (ҳамеша, девона, ҳеҷ гоҳ) ва варианти фаъол дар қавс дохил карда мешавад (бо нобаёнӣ девонавор).

девонавор маънои онро дорад transparent hugepages танҳо барои минтақаҳои хотира фаъол аст, ки ба таври возеҳ саҳифаҳои азимро истифода мебаранд девона (2).

ҳамеша маънои онро дорад transparent hugepages ҳамеша барои ҳама равандҳо фаъол аст. Ин одатан иҷроишро беҳтар мекунад, аммо агар шумо ҳолати истифода дошта бошед, ки дар он равандҳои зиёде миқдори ками хотираро истеъмол мекунанд, пас сарбории умумии хотира метавонад ба таври назаррас афзоиш ёбад.

ҳаргиз маънои онро дорад transparent hugepages ҳатто ҳангоми дархост бо истифодаи madvise дохил карда намешаванд. Барои гирифтани маълумоти бештар, тамос гиред хуччатхо ядроҳои Linux.

Чӣ тавр тағир додани арзиши пешфарз

Интихоби 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, ки дар Linux кор мекунанд, гап мезанем ва ман танҳо тахмин мекунам, ки система саҳифаҳои бузурги шаффофро дастгирӣ мекунад (зеро ин камбудӣ нест, ки саҳифаҳои азим аз нав навишта нашудаанд), ба мисли қариб дар ҳама гуна Linux муосир муҳити зист.

Ман тавсифи бештари техникиро дар истиноди зер замима хоҳам кард.

Хотираи виртуалӣ

Агар шумо барномасози C++ бошед, шумо медонед, ки объектҳо дар хотира суроғаҳои мушаххас доранд (қиматҳои нишондиҳанда).

Аммо, ин суроғаҳо ҳатман суроғаҳои физикиро дар хотира инъикос намекунанд (суроғаҳои RAM). Онҳо суроғаҳоро дар хотираи виртуалӣ намояндагӣ мекунанд. Протсессор дорои модули махсуси MMU (шӯъбаи идоракунии хотира) мебошад, ки ба харитаи хотираи виртуалии ядро ​​​​ба макони физикӣ кӯмак мекунад.

Ин равиш бартариҳои зиёд дорад, вале муҳимтаринаш инҳоянд:

  • Фаъолият (бо сабабҳои гуногун);
  • Изолятсияи барнома, яъне ягон программа аз хотираи барномаи дигар хонда наметавонад.

Саҳифаҳо чист?

Хотираи виртуалӣ ба саҳифаҳо тақсим карда мешавад. Ҳар як саҳифаи инфиродӣ ба хотираи мушаххаси физикӣ ишора мекунад, он метавонад ба минтақаи RAM ишора кунад ё он метавонад суроғаеро, ки ба дастгоҳи ҷисмонӣ таъин шудааст, ба монанди корти видео, ишора кунад.

Аксари саҳифаҳое, ки шумо бо онҳо сарукор доред ё ба RAM ишора мекунанд ё иваз карда мешаванд, яъне онҳо дар диски сахт ё SSD нигоҳ дошта мешаванд. Ядро тарҳбандии физикии ҳар як саҳифаро идора мекунад. Агар ба саҳифаи қалбакӣ дастрасӣ пайдо шавад, ядро ​​риштаеро, ки кӯшиши дастрасӣ ба хотираро дорад, бозмедорад, саҳифаро аз диски сахт/SSD ба RAM мехонад ва сипас иҷрои риштаро идома медиҳад.

Ин раванд ҷараён шаффоф аст, яъне он ҳатман мустақиман аз HDD/SSD хонда намешавад. Андозаи саҳифаҳои муқаррарӣ 4096 байт аст. Андозаи саҳифаҳои бузург 2 мегабайт аст.

Буфери тарҷумаи ассотсиативӣ (TLB)

Вақте ки барнома ба саҳифаи хотира дастрасӣ пайдо мекунад, CPU бояд донад, ки аз кадом саҳифаи физикӣ маълумотро хонд (яъне харитаи суроғаи виртуалӣ дошта бошад).

Ядро дорои сохтори додаҳо (ҷадвали саҳифа) мебошад, ки тамоми маълумотро дар бораи саҳифаҳои истифодашаванда дар бар мегирад. Бо истифода аз ин сохтори додаҳо, шумо метавонед суроғаи виртуалиро ба суроғаи физикӣ харита кунед.

Бо вуҷуди ин, ҷадвали саҳифа хеле мураккаб ва суст аст, аз ин рӯ мо наметавонем тамоми сохтори маълумотро ҳар дафъае, ки раванд ба хотира дастрасӣ пайдо кунад, таҳлил кунад.

Хушбахтона, протсессори мо дорои TLB мебошад, ки харитасозии байни суроғаҳои виртуалӣ ва физикиро кэш мекунад. Ин маънои онро дорад, ки гарчанде ки мо бояд ҷадвали саҳифаро дар кӯшиши аввалини дастрасӣ таҷлил кунем, ҳама дастрасии минбаъда ба саҳифаро метавон дар TLB идора кард, ки ин имкон медиҳад, ки амалиёти зуд.

Азбаски он ҳамчун дастгоҳи ҷисмонӣ амалӣ карда мешавад (ки он дар ҷои аввал онро тез мекунад), иқтидори он маҳдуд аст. Ҳамин тавр, агар шумо хоҳед, ки ба саҳифаҳои бештар дастрасӣ пайдо кунед, TLB наметавонад харитаҳоро барои ҳамаи онҳо нигоҳ дорад ва боиси сусттар кор кардани барномаи шумо мегардад.

Гигепгс ба ёрй меояд

Пас, мо чӣ кор карда метавонем, то аз пур шудани TLB пешгирӣ кунем? (Мо тахмин мезанем, ки барнома ҳоло ҳам ҳамон миқдори хотираро талаб мекунад).

Дар ин ҷо Ҳугепжс ворид мешавад. Ба ҷои 4096 байт, ки танҳо як вуруди TLB-ро талаб мекунад, як вуруди TLB акнун метавонад ба 2 мегабайти бузург ишора кунад. Фарз мекунем, ки TLB дорои 512 вуруд аст, дар ин ҷо бе Ҳюгепҷҳо мо метавонем мувофиқат кунем:

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]); 

Дар ин ҳолат, ядро ​​бояд то 2 мегабайт маълумотро аз диски сахт/SSD иваз кунад (хонд) танҳо барои хондани шумо як байт. Дар мавриди саҳифаҳои муқаррарӣ, аз диски сахт/SSD танҳо 4096 байт хондан лозим аст.

Аз ин рӯ, агар саҳифаи бузург бекор карда шуда бошад, хондан танҳо тезтар аст, агар шумо ба тамоми саҳифа дастрасӣ дошта бошед. Ин маънои онро дорад, ки агар шумо кӯшиш кунед, ки ба таври тасодуфӣ ба қисмҳои гуногуни хотира дастрасӣ пайдо кунед ва танҳо якчанд килобайт мехонед, шумо бояд саҳифаҳои муқаррариро истифода баред ва дар бораи чизи дигар хавотир нашавед.

Аз тарафи дигар, агар ба шумо лозим меояд, ки ба як қисми зиёди хотира пайдарпай дастрасӣ пайдо кунед, саҳифаҳои бузург кори шуморо беҳтар мекунанд. Аммо, шумо бояд онро худатон санҷед (на бо нармафзори абстрактӣ) ва бубинед, ки чӣ зудтар кор мекунад.

Тақсим дар хотира

Агар шумо C нависед, шумо медонед, ки шумо метавонед миқдори худсарона хурд (ё қариб худсарона калон)-ро аз теппа талаб кунед. malloc(). Фарз мекунем, ки ба шумо 30 байт хотира лозим аст:

char* mymemory = malloc(30);

Ба назари барномасоз чунин менамояд, ки шумо 30 байт хотираро аз системаи оператсионӣ «талаб» карда истодаед ва нишондиҳандаро ба ягон хотираи виртуалӣ бармегардонед. Аммо дар асл malloc () танҳо як функсияи C аст, ки аз дохили функсия даъват мекунад брк ва сбрк барои дархост кардан ё озод кардани хотира аз системаи оператсионӣ.

Бо вуҷуди ин, дархост кардани хотираи бештар ва бештар барои ҳар як тақсим бесамар аст; эҳтимоли зиёд дорад, ки баъзе сегменти хотира аллакай озод карда шудааст (free()), ва мо метавонем онро дубора истифода барем. malloc() алгоритмҳои хеле мураккаби истифодаи дубораи хотираи озодшударо амалӣ мекунад.

Дар айни замон, ҳама чиз барои шумо ноаён рӯй медиҳад, пас чаро ин шуморо ташвиш медиҳад? Аммо азбаски душворй free() чунин маъно надорад хотира ҳатман фавран ба системаи оператсионӣ баргардонида мешавад.

Чунин чизе ба монанди тақсимоти хотира вуҷуд дорад. Дар ҳолатҳои шадид, сегментҳои тӯб вуҷуд доранд, ки дар онҳо танҳо чанд байт истифода мешавад, дар ҳоле ки ҳама чиз дар байни онҳо озод карда шудааст. (free()).

Лутфан қайд кунед, ки тақсимоти хотира як мавзӯи бениҳоят мураккаб аст ва ҳатто тағироти ночиз дар барнома метавонад таъсири назаррас дошта бошад. Дар аксари мавридҳо, барномаҳо ба пораҳои назарраси хотира оварда намерасонанд, аммо шумо бояд бидонед, ки агар дар ягон минтақаи теппа мушкилот бо тақсимшавӣ вуҷуд дошта бошад, саҳифаҳои бузург метавонанд вазъро бадтар кунанд.

Истифодаи интихобии саҳифаҳои бузург

Пас аз хондани мақола, шумо муайян кардед, ки кадом қисмҳои барномаи шумо аз истифодаи саҳифаҳои азим истифода бурда метавонанд ва кадоме наметавонанд. Пас, бояд саҳифаҳои бузург дар ҳама ҳолатҳо фаъол карда шаванд?

Хушбахтона шумо метавонед истифода баред madvise()барои фаъол кардани саҳифаи бузург танҳо барои он минтақаҳои хотира, ки он муфид хоҳад буд.

Аввалан, санҷед, ки саҳифаҳои бузург дар реҷаи 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(), ин мавзӯъ дорои хатти бениҳоят шадиди омӯзиш аст. Пас, агар шумо ният доред, ки дар он воқеан хуб ба даст оред, пеш аз он ки ягон натиҷаи мусбӣ интизор шавед, барои хондан ва санҷидани чанд ҳафта омода шавед.

Чӣ хондан?

Савол доред? Дар шарҳҳо нависед!

Манбаъ: will.com

Илова Эзоҳ