Щось з’їдає всю пам’ять (я підозрюю, що витік пам'яті в якомусь додатку). Як виявити що?


16

У мене є сервер, який працює з пакетом liquidsoap + icecast та простий веб-сайт (httpd + mysqld). Нічого особливого. Відвідувачів близько 2000+ на день, причому близько 50 одночасно в Інтернеті.

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

Що можна зробити, щоб виявити, що саме просочує пам'ять? Я використовую топ для моніторингу використання ресурсів, але, наскільки я бачу, це нічого корисного:

введіть тут опис зображення

Чи є спосіб дізнатися, для чого використовується стільки пам’яті? або що починає сильно мінятися на диск? Будь-який спосіб звільнити пам'ять без перезавантаження сервера?


Будь-яка причина, чому ви не намагаєтеся перезапустити деякі сервіси (apache, liquidsoap) замість сервера?
jamespo

Я спочатку відповів за нормальне використання пам'яті. Я оновив набір інструментів, які можуть допомогти визначити проблему.
BillThor

@jamespo, насправді я спробував це, але це не мало ефекту, тому перезапуск був єдиним, що я знав, що може допомогти.
jayarjo

Кеш 4027092k повинен пояснювати використання пам'яті, ні? На даний момент я працюю над подібною проблемою в іншому місці, і поки що мені вдалося зрозуміти, що передача пам'яті може регулюватися за допомогою наступних параметрів: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio Це не повне виправлення та будь-які відгуки найпривітніший. Я сподіваюся, що це правильний напрямок.

Відповіді:


16

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

Ви можете використовувати limit.conf для обмеження максимального розміру ядер програм. Правильно встановлено, це повинно вбивати будь-які програми, що просочуються пам'яттю. Це працює з модулем pam_limits. Обмеження також можна встановити за допомогою ulimitsкоманди.

Ви запускаєте кілька програм, які можуть використовувати велику кількість пам'яті. Деякі речі, які ви можете подивитися, включають.

  • Погано запрограмовані програми, які працюють під, apache2можуть витікати з пам'яті. Ви повинні побачити збільшення обсягу пам'яті, коли це станеться. Ви можете налаштувати apache2 на переробку дітей після певної кількості використання, встановивши MaxRequestsPerChildзначення 100 або близько того. Якщо це вирішить проблему, тоді потрібно усунути витік. Я б спочатку це спостерігав.
  • MySQL може спробувати завантажити дані в пам'ять. Якщо у вас багато пам’яті в пам'яті, це може спричинити за собою молоть, але не повинно бути таким драматичним, як ви бачите.
  • Якщо у вас встановлена ​​велика tmpfsфайлова система, ви можете просочити пам'ять, якщо файли не буде видалено при використанні. Великі файли тривалої життя також можуть бути проблемою.
  • Якщо проблема виникає приблизно в той же час дня, у вас може бути запланована програма, яка просочує пам'ять.
  • Якщо у вас є програма, яка виділяє спільну пам'ять, але не випускає її перед виходом, у вас буде відносно невидимий витік пам'яті. Якщо спільна пам'ять заблокована в пам'яті, то це може примусити змінити її. Обсяг наявної спільної пам'яті, як правило, відносно обмежений.
  • Пакет liquidsoap + icecast може стикатися з проблемами буферизації, які використовують пам'ять. Я не використовував цю комбінацію, тому не знаю, як це виглядатиме.

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

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

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


Проблема в моєму випадку начебто дивна. Навіть коли навантаження величезна і сервер сильно обміняється, вільної пам’яті достатньо (як я зрозумів після того, як я прочитав про буфери та кеші). top все частіше не відображає жодної пам’яті з процесом. Але навантаження зростає і в якийсь момент сервер стає непридатним: | Дякуємо за детальну відповідь.
jayarjo

2
@jayarjo: Мунін і сар повинні допомогти виявити, що відбувається. Якщо у вас багато вільної пам’яті, вам не слід міняти місцями. У вас може бути інша проблема вводу / виводу. sarдопоможе точно визначити, який розділ має введення / виведення, і може допомогти виявити проблему.
BillThor

+1 для MaxRequestsPerChild порада
jamespo

11

Ви можете скористатися цією командою, щоб переглянути топ-10 програм щодо використання оперативної пам’яті:

ps -A --sort -rss -o comm,pmem | head -n 11

Іноді ця команда допомагає, якщо було сформовано багато підпроцесів:

ps auxf

Таким чином можна побачити, які процеси належать разом.


Це зручні команди, дякую, я відзначу їх на майбутнє. Але проблема полягає в тому, що завжди є однакові процеси зверху (їх можна побачити на скріншоті) - apache, mysql, liquidsoap, icecast. І вони використовують (або принаймні показано, що використовують) однаковий об'єм пам'яті (насправді мізерно мало), навіть коли сервер гине від навантаження: |
jayarjo

@jayarjo: Чи змінюється кількість процесів? У вас набагато більше процесів? І це фізичний сервер чи віртуальний?
Раффаель Лютігер

Я не помітив жодної зміни в кількості процесів. В основному, коли я займаюся верхом, поки сервер вмирає від навантаження, я бачу дуже схожу картину з тією, яку я додав у оригінальному питанні, за винятком величезного навантаження: | Сервер - фізичний.
jayarjo

2
Спробуйте отримати більше інформації за допомогою "vmstat" (наприклад, vmstat -s). Або з уже згаданим інструментом «сар». Можливо, у вас є файлова система на базі ОЗУ? Тоді, можливо, "іостат" може також дати більше інформації.
Раффаель Лютігер

1
У мене були сумніви, чи правильно "pmem" (% MEM) в полі psчи на topвиході потрібно дивитись, якщо намагаються виявити витік пам'яті: Хіба це не лише відсоток фізичної пам'яті, який використовується зараз процес? Але інші частини використовуваної (включаючи протікаючу) пам'ять процесу можуть бути замінені. Можливо, "size" або "vsize" було б більш доречним для вимірювання розміру процесу? Напр., ps -A --sort -size -o comm,size | head -n 11Абоps -A --sort -vsize -o comm,vsize | head -n 11
імз - Іван Захарящев

8

Ніщо насправді не використовує цю пам'ять з точки зору додатків.

Вам потрібно відняти значення "кешування", яке представляє кеш сторінки, щоб отримати краще уявлення про те, яке фактичне використання пам'яті з точки зору використання програми.

В основному це хороше управління пам’яттю, і це в ідеалі те, що ви хочете.

Дивіться посилання тут, щоб отримати додаткові відомості: http://www.linuxatemyram.com/


так, знайшли це посилання та прочитали про буфери та кеші, але наскільки я міг отримати з прочитаного, вони не можуть спричинити заміну, чи не так?
jayarjo

@jayarjo Я думаю, щоб зрозуміти, що там відбувається, нам знадобиться статистика, яка демонструє проблему. Введені вами цифри не показують заміни або багато реального використання пам'яті.
Метью Іфе

1

Я насправді не фахівець у цьому, але рідке мило + льодовик пов'язані з мультимедіа. Коли система вільна, вона кешує та / або займає пам'ять для подальшого використання. І якщо трафік збільшуватиметься в певний час доби / протягом певного періоду часу, тоді він почне мінятися. У цей момент, якщо запити (користувачі, які переглядають вміст) збільшуються, необхідні ресурси становитимуть більше 8 ГБ оперативної пам’яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.