Навіщо скидати кеші в Linux?


84

На наших серверах у нас є звичка скидати кеші опівночі.

sync; echo 3 > /proc/sys/vm/drop_caches

Коли я запускаю код, то, здається, звільняється багато оперативної пам’яті, але чи дійсно мені це потрібно зробити. Хіба безкоштовна оперативна пам’ять не є відходом?


62
Знайдіть людину, яка це вклала, і запитайте, чому він це зробив. Як ви правильно здогадалися, очевидних вагомих причин для цього немає.
Майкл Хемптон

10
Налагодження ядра. Ось про це. Це фактично не звільняє жодної оперативної пам’яті; вона скидає кеші, як випливає з назви, і тим самим знижує продуктивність.
Майкл Хемптон

28
@ivcode Тоді вам слід знайти та виправити проблему з цим сервером, а не намагатися уникати умов, які його викликають. Якщо мій автомобіль зупинявся щоразу, коли я робив різкий правий поворот, уникати різких правих поворотів - це хитра фіксація.
Девід Шварц

7
Пов'язані thedailywtf.com/Articles/Modern-Memory-Management.aspx Настійно стверджуючи, що це погана ідея.
Друнікс

7
Пов’язаний і корисний опис "проблеми": linuxatemyram.com
Білл Вайсс

Відповіді:


86

Ви на 100% правильні. Це НЕ хороша практика , щоб звільнити пам'ять. Це, мабуть, приклад управління системою культового культу.


9
+1 за згадування адміністрування системи Cargo Cult. Будь-який сисадмін, який не знає цього терміна і що це означає, повинен бути звільнений.
Тонні

8
@Tonny: Ми залишилися б без відділу sysadmin тоді :(
PlasmaHH

2
Як і більшість людства, я люблю стислі тверді твердження з великим схваленням, але цитування чи міркування зароблять +1 мого суперего.
Аарон Холл

2
Поясніть адміністрацію культового культу, а також вищезазначене, якщо ви не заперечуєте. Можливо, у подальшому редагуванні? Я все-таки відмовляюся від +1 ...: P
Аарон Холл

2
"можливо, хоча ваша програма може не використовувати цю оперативну пам'ять, але Linux кешує агресивно в свою пам'ять, і навіть хоча програмі потрібна пам'ять, вона не звільнить частину цих кеш-пам'яті, але швидше почне міняти місцями." Не дуже конкретно. На практиці керування пам’яттю не є ідеальним, і спрацьовувати ручку, коли вона виявиться недосконалістю, - це добре.
Dan Pritts

62

Так, очищення кешу звільнить оперативну пам’ять, але це змушує ядро ​​шукати файли на диску, а не в кеші, що може спричинити проблеми з продуктивністю.

Зазвичай ядро ​​очистить кеш-пам'ять, коли наявна ОЗУ буде вичерпана. Він часто записує забруднений вміст на диск, використовуючи pdflush.


20
+1 для пояснення, чому це погана ідея.
Псалом Огре3333

35

Причина скидати кеші на кшталт цього полягає в тестуванні продуктивності диска, і є єдиною причиною його існування.

Під час роботи інтензивного введення / виводу, ви хочете бути впевнені, що різні налаштування, які ви намагаєтеся, насправді роблять дискові введення / виведення, тому Linux дозволяє вам скидати кеші, а не робити повну перезавантаження.

Цитувати з документації :

Цей файл не є засобом контролю за ростом різних кешів ядра (inode, dentries, pagecache тощо). Ці об'єкти ядра автоматично відновлюються, коли пам'ять потрібна в іншому місці системи.

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


Звичайно, залежно від того, що ви намагаєтеся зробити, навіть повне перезавантаження може недостатньо очистити кеш диска.
CVn

1
"Ці об'єкти автоматично відновлюються ядром, коли потрібна пам'ять" - це ціль дизайну, але це не завжди може бути реальною поведінкою.
Dan Pritts

@DanPritts Що саме змушує вас думати, що це не так?
Джо

2
Очевидний випадок, коли ви хочете очистити оперативну пам’ять, щоб дозволити виділити більше (непрозорі) величезні сторінки; Інший випадок - прозорі величезні сторінки збору сміття, призупинення помилок (дивіться мою відповідь / коментарі в іншому місці на це питання). Але мій коментар був призначений для загальної справи. Іноді люди, які керують системою, знають краще, ніж люди, які її розробили / впровадили. Часто ні - ось чого намагається захистити їх коментар. Я просто радий, що
Dan Pritts

26

Основна ідея тут, мабуть, не така вже й погана (просто дуже наївна і вводить в оману): Можуть бути кешовані файли, до яких навряд чи можна отримати доступ найближчим часом, наприклад, реєстраційні файли. Ці барани "з'їдають", які пізніше доведеться звільняти при необхідності ОС тим чи іншим чином.

Залежно від ваших налаштувань простоти, схеми доступу до файлів, схеми розподілу пам’яті та багатьох інших непередбачуваних речей, може статися, що коли ви не будете звільняти ці кеші, вони згодом будуть змушені повторно використовуватися, що займе трохи більше часу, ніж виділення пам'яті з пула невикористаної пам'яті. У гіршому випадку налаштування простоти в Linux спричинить заміну пам'яті програми, оскільки Linux вважає, що ці файли можуть бути скоріше використані найближчим часом, ніж пам'ять програми.

У моєму середовищі Linux часто здогадується неправильно, і на початку більшості європейських фондових бірж (близько 09:00 за місцевим часом) сервери почнуть робити те, що вони роблять лише один раз на день, потребуючи обміну пам’яттю, яка раніше була замінена через те, що пишуть журнали, стискаючи їх, копіюючи їх тощо, заповнювали кеш до того моменту, коли речі потрібно було замінити.

Але чи відмова кешів вирішує цю проблему? однозначно ні. Що б тут було рішення - сказати Linux, що він не знає: ці файли, ймовірно, більше не будуть використовуватися. Це можна зробити за допомогою програми для написання, використовуючи такі речі, як posix_fadvise()інструмент cmd line vmtouch(наприклад, який також можна використовувати для перегляду речей, а також файлів кешу).

Таким чином ви можете видалити дані, які більше не потрібні з кеш-пам'яті, і зберегти ті матеріали, які слід кешувати, тому що, коли ви скидаєте всі кеші, багато чого потрібно перечитати з диска. І це в найгірший можливий момент: коли це потрібно; спричиняючи затримки у вашій програмі, помітні і часто неприйнятні.

Що вам слід створити - це система, яка моніторить ваші шаблони використання пам'яті (наприклад, якщо щось змінюється), а потім аналізує їх відповідно і діє відповідно. Рішенням може бути виселення великих файлів наприкінці дня за допомогою vtouch; можливо також додати більше оперативної пам’яті, оскільки щоденне пікове використання сервера - це саме те.


Усі додатки на моєму сервері працюють на nohup. Можливо, nohup.out кешується і їсть пам'ять?
ivcode

@ivcode: Це може бути причиною, перевірте, наскільки великий nohup.out. Можливо, використовуйте vmtouch, щоб зрозуміти, яка частина його кешована.
ПлазмаHH

У мене є робота з cat /dev/null > path/nohup.outкроном кожні 15 хвилин, оскільки nohup.out швидко зростає. Можливо, Linux кешує nohup.out, навіть якщо я його
очищую

5
@ivcode Якщо вихід не потрібен, nohupслід перенаправити його на /dev/null. Здається, у вас були якісь дуже недосвідчені систематики, які працювали над вашими системами. Дивіться stackoverflow.com/questions/10408816/… про те, як направити nohupвихід на/dev/null
Девід Уілкінс

хоча nohup.out очищається з інтервалом через 15 хвилин, якщо процес додатків загинув з якоїсь причини, nohup.out буде автоматично створено резервну копію з іншого сценарію. я спробував vmtouch. це справді дуже хороший інструмент
ivcode

16

Я бачив, що кеші крапель є корисними при запуску ряду віртуальних машин. Або що-небудь інше, що використовує великі сторінки, такі як деякі сервери баз даних.

Великі сторінки в Linux часто потребують дефрагментації оперативної пам’яті, щоб знайти 2 Мб суміжної фізичної оперативної пам’яті для розміщення на сторінці. Звільнення всього кеш-файлів робить цей процес дуже простим.

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


1
Я виступав за те, щоб вказати на забобони другого порядку - це відповіді на кращі кеші.
Ной Спур’єр

1
Крім того, у додатках HPC на вузлах високої пам’яті (1Tb) зчитування у кількох великих файлах призводить до великої кількості кешованої пам’яті. Оскільки багато HPC-додатків виконують сотень ГБ, система може затримуватися годинами, оскільки міграційні процеси безрезультатно переміщують крихітні фрагменти фрагментованої пам’яті по вузлах NUMA, коли система досягне «межі» кешованої пам’яті. Гірше, що ви нічого не можете зробити в користувальницькій програмі, щоб звільнити кеші, окрім хитрощів системи виділити всі крихітні 2 Мб блоки, які вона може одразу випустити, дозволяючи величезному дефрагвації та додаткам працювати нормально.
user1649948

+1 Команда для створення великих сторінок ( sysctl -w vm.nr_hugepages=...) відмовляється навіть працювати, якщо я вперше не скину кеші (Arch linux).
Олександр Дубінський

8

Цілком можливо, що це було встановлено як спосіб стабілізації системи, коли не було нікого з навичками чи досвідом, щоб реально знайти проблему.

Звільнення ресурсів

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

Що їсть пам’ять?

Ви повинні визначити, що спричиняє велику витрату пам’яті, а це здається, що спрацьовування кешів працює. Це може бути викликано будь-якою кількістю погано налаштованих або просто неправильно використаних серверних процесів. Наприклад, на одному сервері я спостерігав максимум використання пам’яті, коли веб-сайт Magento протягом 15 хвилин пройшов певну кількість відвідувачів. Це призвело до того, що Apache був налаштований так, щоб дозволити одночасно запускати занадто багато процесів. Занадто багато процесів, використовуючи багато пам’яті (Магенто іноді є звіром) = міняти місцями.

Нижня лінія

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


4

У Linux / m68k насправді є помилка в ядрі, яка змушує kswapd зійти з розуму і з'їсти 100% процесора (50%, якщо є якесь інше завдання, пов'язане з процесором, як, наприклад, автобілдер двобічного пакету Debian - vulgo buildd - вже працює), який може (більшість часу; не завжди) пом'якшуйте, виконуючи цю конкретну команду кожні кілька годин.

Але це означає, що ваш сервер, швидше за все, не система m68k (Atari, Amiga, Classic Macintosh, VME, Q40 / Q60, Sun3) ;-)

У цьому випадку людина, яка поставила рядки, або дотримувалася певних сумнівних, або, у кращому випадку, застарілих порад, або отримала уявлення про те, як слід використовувати оперативну пам’ять неправильно (сучасне мислення справді говорить, що «вільна оперативна пам’ять втрачається оперативної пам’яті» та пропонує кешування) або "виявив", що це "виправляє" [sic!] іншу проблему в іншому місці (і було занадто ліниво шукати належне виправлення).


"помилка в ядрі, яка змушує kswapd зійти з розуму" - Яка помилка це?
Бен

@Ben дивіться цю тему (це повідомлення та кілька подальших робіт, один з яких включає здогадки, звідки це може бути)
mirabilos

1
У мене виникає подібна проблема (хоча це x86_64), і єдине рішення на даний момент - це скинути кеші сервера defaultfault.com/questions/740790/…
Фернандо

2
@Fernando У мене також є кронштейн "сховати кеши" на коробці m68k ☹
mirabilos

3

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

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

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


3

Я можу придумати одну правдоподібну причину робити це в нічній роботі з крон.

У великій системі може бути корисно періодично скидати кеші, щоб ви могли видалити фрагментацію пам'яті.

Підтримка прозорої величезної сторінки ядра робить періодичну розгортання пам'яті, щоб об'єднати невеликі сторінки у величезні сторінки. У вироджених умовах це може призвести до системних пауз на хвилину-дві (мій досвід з цим був у RHEL6; сподіваюся, він покращився). Випадання кеш-пам’яток може дати можливість розметувачам величезних сторінок мати місце для роботи.

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


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

Я не знаю, чи справді це робить програмне забезпечення Virt.


1
У вас є джерело для цього? Це звучить як щось, що має бути виправлено в ядрі, якщо це така проблема.
геть

3
У мене є особистий досвід пауз із прозорими величезними сторінками. RHEL6, Dell R810, 4CPU, 64 Гб оперативної пам’яті. Відключення прозорих великих сторінок (для цього є файл / proc файл) негайно виправили паузи. Я не пробував техніка падіння кешу в той час; натомість я переконфігурував наші програми Java для використання непрозорих величезних сторінок, а прозорі величезні сторінки вимкнено. IIRC, ми достатньо вивчили ситуацію, щоб зрозуміти, що ми не єдині постраждалі люди, і що Red Hat знав про це питання.
Dan Pritts

Привіт Ден, я констатую таку ж поведінку на своєму сервері. Я працюю з величезною кількістю даних, і є різке падіння продуктивності після 10+ обчислень тієї самої програми python (x2-3 першого часу обчислення). Якщо я погляну, розмір кешу пам'яті величезний, 100 + ГБ. І якщо я очищую цей кеш пам'яті і запускаю свою програму, я повертаю свій початковий час обчислення. Чи є у вас якийсь документ або інформація, щоб поділитися цим явищем? Спасибі.
Аксель Борха

1
access.redhat.com/solutions/46111 описує це. Ви можете відключити прозорі величезні сторінки, щоб побачити, чи це проблема у вашому випадку.
Dan Pritts

2

Тільки, щоб додати два мої центи: Система дуже добре знає, що ці сторінки пам'яті є кешами, і випаде стільки, скільки потрібно, коли програма запитує про пам'ять.

Відповідне налаштування - /proc/sys/vm/swappinessце вказує ядру під час нових розподілів пам’яті віддавати перевагу скиданням кеш-пам’яті або підміняти «непрацюючі» виділені сторінки пам'яті.


1

Питання йдеться про 2014 рік, але оскільки проблема існує і донині на деяких прихованих центрових 6.8 міграціях, вона все ще може бути корисною для когось.

https://github.com/zfsonlinux/zfs/isissue/1548 описує проблему з zfs. Там дисковий простір не видаляється для видалених файлів, оскільки якщо nfs використовується поверх zfs, то вставки файлу не випадають з кеш-пам'яти ядра.

Для цитування з теми помилок, behlendorf, 6 січня 2015 року написав:

Поточна спекуляція полягає в тому, що чомусь сервер NFS зберігає кешовану версію обробки файлів. Поки сервер NFS не скидає цей файл, обробка даних ZFS не може від’єднати цей файл. Деякі світлові випробування показали, що викидання кеш-пам'яті на сервер призведе до відмови цього посилання (як ручка файлу NFS), після чого вільний простір буде звільнено. Тиск пам'яті також може спричинити її падіння.

тобто нічне ехо 3> / proc / sys / vm / drop_caches - це найпростіший виправлення цієї помилки, якщо ви не хочете мати простою для реструктуризації своїх zfs.

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


0

Це може мати сенс у системах NUMA (нерівномірний доступ до пам’яті), де, як правило, кожен процесор (сокет) може отримувати доступ до всієї пам'яті прозоро, але до власної пам’яті можна отримати швидший доступ до пам’яті інших сокетів у поєднанні з паралельними програмами HPC.

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

Однак в системі HPC було б розумніше очистити кеш-пам'ять перед початком нового завдання користувача, а не в конкретний час з допомогою cron.

Для не паралельних застосувань ця проблема навряд чи виникне.


0

Коли кеш сторінок досить великий (набагато більший, ніж поточний обмін), а заміна та заміна відбувається по черзі, саме тоді вам потрібно скинути кеші. Я бачив випадки, коли використання пам’яті збільшується на одному з моїх серверів баз даних MariaDB під управлінням Ubuntu 16.04LTS, а Linux просто вирішив збільшити обмін свопом замість видалення невикористаних кешів сторінок. Прозорі величезні сторінки, які вже відключені в моїй системі, оскільки TokuDB вимагає її відключення. У будь-якому випадку, можливо, це не помилка, але Linux все ще займається такою поведінкою. Різні джерела заявляли, що Linux буде видаляти кеш сторінки, коли програма вимагає цього:

Але реальність не така проста. Приблизний варіант:

  1. Періодично виконуйте кеш крапель
  2. Виконайте кеш падіння при необхідності (слідкуйте за допомогою vmstat 1 для заміни дій)
  3. Порадьте Linux для видалення певних файлів із кешу (наприклад, файлів журналу apache) за допомогою утиліт, таких як dd або python-fadvise. Дивіться https://unix.stackexchange.com/questions/36907/drop-a-specific-file-from-the-linux-filesystem-cache

Приклад dd run:

dd if=/var/log/apache2/access_log.1 iflag=nocache count=0

Приклад python-fadvise:

pyadvise -d /var/log/apache2/access_log.1


-5

У мене є настільний апарат з 16 ГБ оперативної пам’яті, що працює на ядрі PAE. Через годину-дві продуктивність диска різко погіршується, поки я не скину кеші, тому я просто покладу його в cron. Я не знаю, чи це проблема з ядром PAE або з тим, що реалізація кешу настільки повільна, якщо є багато пам'яті.


9
Це прекрасний приклад адміністрації системи "культового культу": замість того, щоб знайти та вирішити проблему, ви просто маскуєте її.
Майкл Хемптон

2
Іноді доцільним рішенням є правильне. Це може бути просто відкладання вирішення реальної проблеми, або це може бути стільки ж рішення, скільки потрібно в обставинах. Навіть якщо це погана практика, це все ще не "вантажний культ". Є продемонстрована причина та наслідок: покращуються кеші та продуктивність диска.
Dan Pritts

1
Частиною оригінального визначення CCSA була тенденція до помилки кореляції причинного зв'язку, і ось ми. Маскування проблеми шляхом вирішення співвіднесеної, але не причинної сутності є неоптимальним вирішенням проблем, саме про це намагається застерегти концепція CCSA.
підкреслити_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.