OS OS: Як вимкнути або зменшити перевиконання пам'яті, і чи безпечно це зробити?


20

Час від часу "мій" сервер зупиняється, оскільки у нього не вистачає пам'яті та місця для обміну. (він продовжує реагувати на ping, але нічого іншого, навіть ssh).

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

Будь ласка, припустіть, що це насправді причина, чому моя система періодично зависає, давайте не будемо обговорювати тут, чи це так (див. Що може призвести до того, що ВСІ сервіси на сервері знижуються, але все ще реагують на ping? І як розібратися ) .

Так,

  1. як відключити або різко зменшити перевиконання пам'яті в CentOS? Я читав, що є два параметри, що називаються vm.overcommit_memory (значення 0, 1 або 2) і vm.overcommit_ratiom, але я не маю уявлення, де мені їх потрібно знайти та змінити (деякий файл конфігурації, сподіваюся), які значення слід спробувати , і чи потрібно мені перезавантажувати сервер, щоб зміни були ефективними.

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

Оскільки те, що викликає раптове збільшення використання пам'яті - mysql через запити, які виконуються php, які, в свою чергу, називаються під час подання http-запитів, я очікую, що лише якийсь скрипт php не вдасться виконати, а отже, час від часу відповідь 500 разів сервер занадто зайнятий, що є ризиком, який я можу взяти на себе (звичайно краще, що весь сервер стане недоступним і доведеться важко перезавантажувати його).

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


1
Вимкнення режиму перевиконання не допоможе вам, коли у вас справді не вистачає пам'яті. Додавання оперативної пам’яті на сервер може допомогти.
Майкл Хемптон

2
Відключення overcommit не стане остаточним рішенням, але я допоможе дуже сильно, якщо в будь-який час у сервера не вистачить пам’яті (що є просто кожен раз у довгий час на кілька секунд), у мене відхилено лише кілька запитів http (або погано подається), замість того, щоб мій сервер DIE повністю і назавжди (поки я не перезавантажую його)
matteo

Відповіді:


30

Перекомітування пам'яті може бути вимкнено vm.overcommit_memory=2

0 - режим за замовчуванням, де ядро ​​евристично визначає розподіл, обчислюючи вільну пам'ять порівняно з запитом на розподіл. Якщо встановити його на 1, можна ввімкнути режим майстра, де ядро ​​завжди рекламує, що має достатньо вільної пам'яті для будь-якого розподілу. Якщо встановити 2, означає, що процеси можуть виділяти лише до налаштованої кількості ( overcommit_ratio) оперативної пам’яті і почнуть отримувати повідомлення про помилки розподілу або повідомлення OOM, коли воно вийде за межі цієї суми.

Чи безпечно це робити, ні. Я не бачив жодного випадку належного використання, коли б вимкнення перевиконання пам'яті фактично допомогло, якщо ви не впевнені на 100% у навантаженості та ємності обладнання. Якщо ви зацікавились, встановіть kernel-docsпакет та перейдіть, /Documentation/sysctl/vm.txtщоб прочитати більше чи прочитайте його в Інтернеті .

Якщо ви встановите, vm.overcommit_memory=2він буде перевищувати відсоток фізичної оперативної пам’яті, налаштований у vm.overcommit_ratio(за замовчуванням - 50%).

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

Це не переживе перезавантаження. Для наполегливості покладіть це у /etc/sysctl.confфайл:

vm.overcommit_memory=X

і біжи sysctl -p. Не потрібно перезавантажувати.


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

2
echo 0/1/2> / proc / sys / vm / overcommit_memory Перезавантаження не переживе. Для наполегливості помістіть це у /etc/sysctl.conf файл vm.overcommit_memory = X та запустіть sysctl -p. Не потрібно перезавантажувати
Сохам Чакраборті

Дуже дякую. Дозвольте додати це до органу відповідей, щоб я міг офіційно "прийняти" його.
Маттео

1
Додано нову частину.
Soham Chakraborty

4
"overcommit_ratio" має важливий ефект при використанні overcommit_memory = 2 - він визначає відсоток фізичної оперативної пам’яті, яку дозволено виділяти! Отже, якщо співвідношення <100, то ви залишите деяку оперативну пам’ять нерозподіленою, можливо, для кеш-диска або подібного. Коефіцієнт за замовчуванням становить 50%, тому ви будете використовувати лише 50% фізичної оперативної пам’яті, лише якщо цього не змінити!
Девід Гарднер

6

Повністю некваліфікований вислів: Вимкнення перезавантаження пам'яті, безумовно, "безпечніше", ніж його ввімкнення.

$ замовник встановив його на декількох сотнях веб-серверів, і це дуже допомогло в питаннях стабільності. Існує навіть перевірка Nagios, яка викликає вогонь дуже голосно, якщо він ніколи НЕ відключений.

З іншого боку, люди, можливо, не вважають це "безпечним" виведенням своїх процесів з пам'яті, коли вони просто хочуть перезапустити невеликий баран і ніколи не використовуватимуть це. (тобто SAP був би дуже хорошим прикладом)

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

(Я знаю, що буду ризикувати сваркою якоїсь бурхливої ​​людини)


3

Я погоджуюся з тим, що відключення надмірної комісії безпечніше, ніж дозволити її в деяких умовах. Якщо сервер виконує лише кілька великих завдань пам’яті (наприклад, моделювання схем у моєму випадку), набагато безпечніше відмовити додатку в запиті на пам'ять вперед, а не чекати події OOM (що, безумовно, слід незабаром). Досить часто ми бачимо сервери виникають проблеми після того, як вбивця ООМ зробив свою роботу.

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