производителност

Какво е vm.min_free_kbytes и как да го настроите?

Какво е vm.min_free_kbytes и как да го настроите?
Какво е vm.min_free_kbytes sysctl регулируем за ядрото на Linux и каква стойност трябва да бъде зададена?  Ще проучим този параметър и как той влияе на работеща Linux система в тази статия.  Ще тестваме въздействието му върху кеша на страниците на ОС и върху mallocs и какво показва командата безплатна система, когато е зададен този параметър.  Ще направим някои образовани предположения за идеални стойности за тази настройка и ще покажем как да настроим vm.min_free_kbytes постоянно, за да оцелее при рестартиране.  И така да тръгваме.

Как vm.min_free_kbytes работи

Разпределението на паметта може да е необходимо на системата, за да осигури правилното функциониране на самата система.  Ако ядрото позволява да бъде разпределена цялата памет, може да се затрудни, когато се нуждае от памет за редовни операции, за да поддържа операционната система гладко.  Ето защо ядрото осигурява настройваемата vm.min_free_kbytes.  Настройката ще принуди мениджъра на паметта на ядрото да запази поне X количество свободна памет.   Ето официалното определение от документация за ядрото на linux: „Това се използва, за да принуди Linux VM да поддържа минимален брой килобайта безплатни.  Виртуалната машина използва този номер, за да изчисли стойността на воден знак [WMARK_MIN] за всяка зона с нисък обем в системата. Всяка зона с нисък обем получава определен брой запазени безплатни страници, пропорционално на размера. Необходим е минимален обем памет, за да се задоволят разпределенията на PF_MEMALLOC; ако зададете това по-ниско от 1024KB, системата ви ще се разчупи леко и ще бъде склонна към блокиране при големи натоварвания. Ако зададете това твърде високо, моментално ще OOM вашата машина.„

Проверка на vm.min_free_kbytes Работи

За да проверя дали настройката на min_free_kbytes работи както е проектирана, създадох виртуален екземпляр на Linux само с 3.75 GB RAM.  Използвайте безплатната команда по-долу, за да анализирате системата:

# безплатно -м

Разглеждайки помощната програма за свободна памет по-горе, използвайки флага -m, за да отпечатате стойностите в MB.  Общата памет е 3.5 до 3.75 GB памет.  Използват се 121 MB памет, 3.3 GB памет е безплатна, 251 MB се използва от буферния кеш.  И 3.Налични са 3 GB памет.

Сега ще променим стойността на vm.min_free_kbytes и вижте какво е въздействието върху системната памет.  Ще повторим новата стойност на виртуалната файлова система proc, за да променим стойността на параметъра на ядрото, както е показано по-долу:

# ехо 1500000> / proc / sys / vm / min_free_kbytes
# sysctl vm.min_free_kbytes

Можете да видите, че параметърът е променен на 1.5 GB приблизително и е влязло в сила.  Сега нека използваме Безплатно команда отново, за да видите всички промени, разпознати от системата.

# безплатно -м

Свободната памет и буферният кеш не се променят от командата, но количеството памет се показва като на разположение е намален от 3327 на 1222 MB.  Което е приблизително намаляване на промяната в параметъра до 1.5 GB мин свободна памет.

Сега нека създадем 2GB файл с данни и след това да видим какво четенето на този файл в буферния кеш прави със стойностите.  Ето как да създадете 2GB файл с данни в 2 реда на bash скрипт по-долу.  Скриптът ще генерира 35MB произволен файл с помощта на командата dd и след това ще го копира 70 пъти в нов файл с данни изход:

# dd ако = / dev / random от = / root / d1.txt брой = 1000000
# за i в 'sq 1 70'; направи ехо $ i; котка / корен / d1.txt >> / root / data_file; Свършен

Нека прочетем файла и да игнорираме съдържанието, като четем и пренасочваме файла към / dev / null, както е показано по-долу:

# cat data_file> / dev / null

Добре, какво се случи с нашата системна памет с този набор от маневри, нека проверим сега:

# безплатно -м

Анализирайки резултатите по-горе.  Все още имаме 1.8 GB свободна памет, така че ядрото е защитило голяма част от паметта, както е запазено поради нашата настройка min_free_kbytes.  Буферният кеш използва 1691 MB, което е по-малко от общия размер на нашия файл с данни, който е 2.3 GB.  Очевидно цялата файл с данни не може да бъде съхранено в кеша поради липсата на налична памет, която да се използва за буферния кеш.  Можем да потвърдим, че целият файл не се съхранява в кеш, но определя времето за повторните опити за четене на файла. Ако беше кеширан, щеше да отнеме части от секундата, за да прочете файла.  Да пробваме.

# time cat_file_file> / dev / null
# time cat_file_file> / dev / null

Прочетеният файл отне почти 20 секунди, което предполага, че почти със сигурност не е кеширан целият.

Като едно окончателно валидиране нека намалим vm.min_free_kbytes, за да позволи на кеша на страниците да има повече място за работа и можем да очакваме кешът да работи и четенето на файла да става много по-бързо.

# echo 67584> / proc / sys / vm / min_free_kbytes
# time cat data_file> / dev / null
# time cat data_file> / dev / null

С допълнителната памет за кеширане на времето за четене на файла спадна от 20 секунди преди .364 секунди с всичко в кеш.

Любопитен съм да направя нов експеримент.  Какво се случва с повикванията на malloc за разпределяне на памет от програма C на фона на тази наистина висока vm.настройка на min_free_kbytes.  Дали ще се провали на malloc?  Ще умре ли системата?  Първо нулирайте vm.min_free_kbytes настройка на наистина висока стойност за възобновяване на нашите експерименти:

# ехо 1500000> / proc / sys / vm / min_free_kbytes

Нека да разгледаме отново нашата свободна памет:

Теоретично имаме 1.9 GB безплатно и 515 MB на разположение.  Нека използваме програма за стрес тест, наречена stress-ng, за да използваме малко памет и да видим къде се проваляме.  Ще използваме тестера vm и ще се опитаме да разпределим 1 GB памет.  Тъй като сме запазили само 1.5 GB на 3.75 GB система, предполагам, че това трябва да работи.

# stress-ng --vm 1 --vm-bytes 1G - timeout 60s
stress-ng: info: [17537] диспечерски свине: 1 vm
stress-ng: info: [17537] кеш разпределение: размер на кеша по подразбиране: 46080K
stress-ng: info: [17537] успешен старт, завършен през 60.09s (1 мин, 0.09 секунди)
# stress-ng --vm 2 --vm-bytes 1G - timeout 60s
# stress-ng --vm 3 --vm-bytes 1G - timeout 60s

Нека опитаме отново с повече работници, можем да опитаме 1, 2, 3, 4 работници и в един момент трябва да се провали.  В моя тест той премина с 1 и 2 работници, но не успя с 3 работници.

Нека да нулираме vm.min_free_kbytes до малък брой и вижте дали това ни помага да стартираме 3 стресори за памет с по 1 GB на 3.75GB система.

# echo 67584> / proc / sys / vm / min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G - timeout 60s

Този път той работи успешно без грешка, опитах го два пъти без проблеми.  Така че мога да заключа, че има поведенческа разлика при наличието на повече памет за malloc, когато vm.Стойността на min_free_kbytes е зададена на по-ниска стойност.

Настройка по подразбиране за vm.min_free_kbytes

Стойността по подразбиране за настройката в моята система е 67584, което е около 1.8% RAM в системата или 64 MB. От съображения за безопасност при силно разбита система бих имал тенденция да я увелича малко до 128MB, за да се даде възможност за по-резервирана свободна памет, но за средно използване стойността по подразбиране изглежда достатъчно разумна.  Официалната документация предупреждава за повишаване на стойността.  Задаването му на 5 или 10% от системната RAM вероятно не е предвиденото използване на настройката и е твърде високо.

Настройка на vm.min_free_kbytes, за да оцелее при рестартиране

За да се гарантира, че настройката може да оцелее при рестартиране и не се възстановява до стойностите по подразбиране при рестартиране, уверете се, че настройката на sysctl е постоянна, като поставите желаната нова стойност в / etc / sysctl.conf файл.

Заключение

Видяхме, че vm.min_free_kbytes linux ядрото може да бъде модифицирано и може да запази памет в системата, за да се гарантира, че системата е по-стабилна, особено по време на интензивна употреба и разпределение на тежка памет.  Настройките по подразбиране може да са малко прекалено ниски, особено при системи с висока памет и трябва да се има предвид, че внимателно се увеличават.  Видяхме, че паметта, запазена от тази настройка, пречи на кеша на операционната система да използва цялата памет, а също така предотвратява някои операции на malloc да използват цялата памет.

Как да увеличите FPS в Linux?
FPS означава Кадри в секунда. Задачата на FPS е да измерва честотата на кадрите при възпроизвеждане на видео или игрални изпълнения. С прости думи бро...
Топ Oculus App Lab Games
Ако сте собственик на слушалки на Oculus, тогава трябва да знаете за странично зареждане. Sideloading е процесът на инсталиране на несъхранявано съдър...
Топ 10 игри за игра на Ubuntu
Платформата на Windows е една от доминиращите платформи за игри поради огромния процент игри, които се развиват днес, за да поддържат Windows. Може ли...