Обмежте розмір кеш-пам'яті в Linux


25

Чи є спосіб сказати ядро ​​Linux використовувати лише певний відсоток пам'яті для буфера кешу? Я знаю, що /proc/sys/vm/drop_cachesможна тимчасово очистити кеш, але чи є якісь постійні параметри, які не дають йому зрости більше ніж, наприклад, 50% основної пам'яті?

Причиною, для якої я хочу це зробити, є те, що у мене є сервер, на якому працює Ceph OSD, який постійно обслуговує дані з диска і встигає протягом декількох годин використовувати всю фізичну пам'ять як буфер кешу. У той же час мені потрібно запускати програми, які виділять велику кількість (кілька 10s ГБ) фізичної пам'яті. Всупереч поширеній думці (див. Поради щодо майже всіх питань, що стосуються кеш-пам'яті буфера), автоматичне звільнення пам’яті шляхом викидання чистих записів кешу не є миттєвим: запуск моєї програми може зайняти до хвилини, коли кеш-пам'ять буфера заповнена ( *), тоді як після очищення кеша (використання echo 3 > /proc/sys/vm/drop_caches) той самий додаток запускається майже миттєво.

(*) Протягом цієї хвилини часу запуску програма несправно працює в новій пам'яті, але витрачає 100% свого часу на ядро, згідно з даними Vtune у функції, що називається pageblock_pfn_to_page. Здається, ця функція пов'язана з ущільненням пам'яті, необхідним для пошуку величезних сторінок, що призводить мене до думки, що насправді є проблема фрагментації.


1
Існує щось, що називається кеш-рівнем. набір пулу ceph osd {cachepool} hit_set_count 1 ceph osd pool set {cachepool} hit_set_period 3600 ceph osd pool pool {cachepool} target_max_bytes 1000000000000 як приклад див. docs.ceph.com/docs/master/rados/operations/cache-tiering
Michael D.

2
Оскільки ця проблема, очевидно, впливає лише на запуск додатків, що потребують пам'яті, можливо, ви можете запустити програми за допомогою скрипту, який очищає кеш, перш ніж їх реально запустити. Можливо, це запускає їх швидше, залишаючи кеш керування ядром, поки вони запущені.
Розташування

Відповіді:


14

Якщо ви не хочете абсолютного обмеження, а просто натискаєте на ядро, щоб швидше вимити буфери, вам слід поглянути на це vm.vfs_cache_pressure

Ця змінна керує тенденцією ядра відновлювати пам'ять, яка використовується для кешування VFS кешів, порівняно з кеш-сторінкою та свопом. Збільшення цього значення збільшує швидкість, з якою відновлюються кеші VFS.

Варіюється від 0 до 200. Перемістіть його до 200 для підвищення тиску. За замовчуванням встановлено 100. Ви також можете проаналізувати використання пам'яті за допомогою slabtopкоманди. У вашому випадку значення dentryі *_inode_cacheповинні бути високими.

Якщо ви хочете абсолютного ліміту, вам слід підняти голову cgroups. Розмістіть Ceph OSD-сервер у межах групи та обмежте максимальну кількість пам'яті, яку він може використовувати, встановивши memory.limit_in_bytesпараметр для групи.

memory.memsw.limit_in_bytesвстановлює максимальну кількість для суми використання пам'яті та заміни. Якщо не вказані одиниці, значення інтерпретується як байти. Однак можна використовувати суфікси для представлення більших одиниць - k або K для кілобайт, m або M для мегабайт, g або G для гігабайт.

Список літератури:

[1] - Настроювання ядра GlusterFS Linux

[2] - Посібник з управління ресурсами RHEL 6


1
limit_in_bytesЗдається, це робить група з набором. Спасибі!
Вім

4
Я думаю, що vfs_cache_pressureочищує лише кеш-пам'ять зубів і кеш-пам'ять і не має нічого спільного з буферним кешем.
kawing-chiu

Підвищення vfs_cache_pressureвище 100може допомогти у випадку, якщо у вас недостатньо оперативної пам’яті для вашої роботи. Це зменшить використання оперативної пам’яті, але загалом спричинить низьку продуктивність вводу / виводу.
Мікко Ранталайнен

3

Я не знаю про A%, але, ви можете встановити обмеження часу, щоб воно зменшилось через x кількість хвилин.

Спочатку в терміналі

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

Очистити поточні кеші.

Зробіть це cron-job Press Alt-F2, наберіть gksudo gedit /etc/crontab, а потім додайте цей рядок внизу.

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

Це очищається кожні 15 хвилин. Ви можете встановити 1 або 5 хвилин, якщо ви дійсно хочете, змінивши перший параметр на * або * / 5 замість * / 15

Щоб побачити вашу безкоштовну оперативну пам’ять, крім кешу:

free -m | sed -n -e '3p' | grep -Po "\d+$

Я відчуваю тут трохи надмірності. Наскільки я знаю, 3 > drop_cachesвходить поведінкаsync
andras.tim

1
@ andras.tim no - синхронізація записує брудні сторінки на диск, 3 - drop_caches відновлює / звільняє пам'ять, що використовується чистими сторінками та іншими кешами. вам не потрібно запускати синхронізацію, але якщо ви зробите, більше пам’яті буде чистим, а не брудним, і більше пам’яті буде звільнено, коли ви скинете кеші
Daniel S. Sterling

2

Я думаю, що ваша думка в самому кінці вашого питання на вірному шляху. Я підозрюю, що мігруючі сторінки між процесорами A, відомі NUMA, або B, швидше за все, код дефрагментації прозорих великих сторінок, які намагаються знайти сусідні, вирівняні регіони.

Величезні та прозорі величезні сторінки були визначені як для помітного поліпшення продуктивності на певних робочих навантаженнях, так і для споживання величезної кількості процесорного часу, не надаючи великої користі.

Це допоможе дізнатись, яке ядро ​​запущено, вміст / proc / meminfo (або принаймні значення HugePages_ *.), І, якщо можливо, більше відомостей про виклик vtune профайлера, що посилається на pageblock_pfn_to_page ().

Крім того, якщо ви побалуєте мою здогадку, спробуйте вимкнути дефрагмент величезної сторінки за допомогою:

echo 'never'> / sys / kernel / mm / transparent_hugepage / defrag

(це може бути натомість це залежно від вашого ядра :)

echo 'never'> / sys / kernel / mm / redhat_transparent_hugepage / defrag

І нарешті, це додаток, що використовує багато десятків концертів оперативної пам’яті, те, що ви написали? Яка мова?

Оскільки ви вживали термін "помилки на сторінках пам'яті", я здогадуюсь, що ви досить добре знайомі з операційним дизайном та віртуальною пам'яттю. Я намагаюся передбачити ситуацію / додаток, який би винищувався настільки агресивно, що не читається у великій кількості вводу-виводу - майже завжди з буфера кешу, який ви намагаєтесь обмежити.

(Якщо вам цікаво, ознайомтеся з прапорцями mmap (2) на зразок MAP_ANONYMOUS та MAP_POPULATE та mincore (2), за допомогою яких можна побачити, які віртуальні сторінки насправді мають відображену фізичну сторінку.)

Щасти!


2

Якщо Ceph OSD - це окремий процес, ви можете використовувати cgroups для управління ресурсами, які використовуються процесом:

Створіть групу з назвою group1 з обмеженням пам’яті (50 Гб, наприклад, підтримуються інші ліміти, такі як ЦП, наприклад, також згадується процесор):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

Потім, якщо у вас програма вже запущена, додайте програму до цієї групи:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

Або виконати додаток у цій групі:

cgexec -g memory,cpu:group1 your_app_name

0

настроєний - це демон динамічної настройки адаптивної системи, який динамічно налаштовує налаштування системи залежно від використання.

 $ man tuned

Дивіться відповідну документацію та конфігураційні файли.

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

Додаткова інформація

Команда синхронізації промиває буфер, тобто змушує записувати всі неписані дані на диск, і їх можна використовувати, коли хочеться бути впевненим, що все написано безпечно. У традиційних системах UNIX існує програма під назвою оновлення, що працює у фоновому режимі, яка робить синхронізацію кожні 30 секунд, тому зазвичай синхронізувати не потрібно. У Linux є додатковий демон, bdflush , який робить більш недосконалу синхронізацію частіше, щоб уникнути раптового заморожування через сильний диск вводу / виводу, який синхронізація іноді викликає.

У Linux, bdflush запускається оновленням. Зазвичай для цього не варто хвилюватися, але якщо bdflush з якоїсь причини загине, ядро ​​попередить про це, і вам слід запустити його вручну ( / sbin / update ).


1
Це не лише для брудних записів? Я не думаю, що це проблема в моїй системі, оскільки всі вони чисті - затримка полягає не в написанні брудних сторінок, а в дефрагментації місця, залишеного видаленням чистих.
Вім

Так, це стосується брудних сторінок, я думаю, ви також можете виправити інші проблеми з продуктивністю, встановивши налаштування на динамічний режим.
Іджаз Ахмад Хан

"Оскільки Linux 2.6, системний виклик [bdflush] застарілий і нічого не робить. Ймовірно, він повністю зникне в майбутньому випуску ядра. Сьогодні завдання, виконане bdflush (), обробляється потоком pdflush ядра." man7.org/linux/man-pages/man2/bdflush.2.html
sourcejedi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.