Зменшуємо споживання оперативної пам’яті на VPS

Тема ще той баян-бабаян, але я залишу цей запис тут, щоб потім не забути, як що робити :-)

Подібна замітка з'явилася на Хабрі ще 2009 року. У заголовку статті стверджувалося зниження споживання пам'яті вдвічі. Підтвердити таке зниження я не можу, але невеликий ефект 10-20% начебто є.

Отже, що ми маємо:

На кожен запущений тред у віртуальній пам'яті виділяється місце під стек. За умовчанням, це місце = 10М. Беремо якийсь apache з mpm_worker (який створює купу тредів), запускаємо під OpenVZ - витрачаються сотні мегабайт пам'яті.

Це дуже багато. Різатимемо.

Зменшити розмір стека за замовчуванням можна за допомогою команди ulimit -s . Параметр змінюється для програм, запущених з поточного шелла (ієрархічно теж ясно). Запускаємо цю штуку при завантаженні системи (всередині скрипта, що стартує демони) - і все.

Щоб це зробити, потрібно вписати рядок ulimit -s 1024 у файл /etc/rc у самий верх. etc/rc - це симлінк і в CentOS, наприклад, сам файл знаходиться в директорії /etc/rc.d. Деякі «порадники» рекомендують правити файл rc.local, але ця порада - плацебо, rc.local запускається в самому кінці і ніяк не допоможе справі.

Ще радять виставляти ліміти у /etc/security/limits.conf. В принципі, як варіант, але ліниво :-)

Для тестування цієї справи, якщо боязко лізти відразу в /etc/rc, можете

  1. подивитися, скільки займає в пам'яті якийсь процес
  2. у шеллі ввести ulimit -s
  3. перезапустити процес (що-небудь на кшталт /etc/init.d/mysql restart)
  4. подивитися ще раз, скільки тепер займає, і перевірити, чи все працює

Взагалі ulimit призначений контролю ресурсів і може обмежувати як розмір стека.

Розглянемо використанняulimit на прикладі обмежень користувача worker