Зменшуємо споживання оперативної пам’яті на 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, можете
- подивитися, скільки займає в пам'яті якийсь процес
- у шеллі ввести ulimit -s
- перезапустити процес (що-небудь на кшталт /etc/init.d/mysql restart)
- подивитися ще раз, скільки тепер займає, і перевірити, чи все працює
Взагалі ulimit призначений контролю ресурсів і може обмежувати як розмір стека.
Розглянемо використанняulimit на прикладі обмежень користувача worker