Як зменшити використання пам'яті на веб-сервері Unix


36

В даний час я використовую Joyent Accelerator для розміщення своїх веб-сайтів, і він працює чудово, проте мені потрібно зменшити витрати, тому я знижую свій поточний план і це накладає нові обмеження пам'яті (256M rss, 512M своп). Я вчора не надто далеко над ними, але після того, як сьогодні кілька разів перезапустив Apache, я зараз 411M rss, 721M своп (prstat -Z -s cpu).

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

Сервер працює під управлінням Solaris на спільному процесорі, і я використовую стек Apache + MySQL + PHP.

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


1
Я просто хотів прокоментувати, що, хоча я сам дізнався про ці налаштування з googling, виявилося, що я змінював налаштування в одному файлі, але інший конфігураційний файл, який завантажувався пізніше, насправді мовчки змінив мої налаштування! Одного разу я виявив, що, встановивши параметри MPM для prefork та деякі інші речі, творилися чудеса, щоб тримати під контролем кількість процесів та використання пам'яті, змінюючи мінімум. Сподіваюся, ця інформація допомагає іншим, особливо тим, хто працює на своїх серверах Gentoo.
Пістос

Відповіді:


23

Дякую всім за відповіді! Після ваших пропозицій я зміг скоротити об'єм пам'яті до 195M SWAP та 108M RSS, не торкаючись свого коду (я безумовно, оптимізую його незабаром, але це, мабуть, буде рішенням швидко позбутися мене від неприємностей).

Ось перелік речей, які я зробив:

Позбувся від підстановки, яка використовується у записах VirtualHost. Замість *: 80 та *: 443 я використав реальний IP свого сервера.

Змінено формат MPM Apache. Це значення, які я закінчив, використовуючи:

StartServers 1
MinSpareServers 1 
MaxSpareServers 5 
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 0
ListenBacklog 100

Це аж ніяк не магічні числа. Я витратив деякий час на тестування різних значень та комбінацій, а потім тестую їх на реальне використання мого сервера, і кожен повинен зробити те ж саме у своєму оточенні. Для запису мій сервер отримує близько 2 млн. Пів / місяць, обслуговуючи як динамічні сторінки, так і активи за звичайною швидкістю - ніякого ефекту Digg. Знову-таки наміром було зменшити слід пам’яті, а не підвищити продуктивність або HA.

Довідка:

Налаштовано KeepAlive Apache. Встановивши KeepAliveTimeoutнижнє значення (2 в моєму випадку), я можу очікувати менше серверних процесів, просто очікуючи на з'єднання з простоюючими клієнтами, які можуть не вимагати більше вмісту.

Довідка: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

Видалений невикористаний модуль MySQL. Я додав skip-innodbдо my.QL my.cnf. Масове скорочення споживання пам'яті.


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

  • Видаліть модулі PHP, які вам не потрібні. PHP на моєму сервері вже складено більшість модів, я, мабуть, спробую свій мінімальний PHP на інших VPS.
  • Перейдіть на nginx за допомогою php-fastcgi. Це ще одна хороша порада, яку я спробую незабаром, але зараз я не можу ризикувати простоєм.

Я запускаю nginx та php-fastcgi (LEMP) і зіткнувся з подібними проблемами пам'яті ... на сервері 256 МБ я виявляю, що php-fastcgi добре працює з PHP_FCGI_CHILDREN = 5 та PHP_FCGI_MAX_REQUESTS = 333 ... ці значення є гарним початком бал!
farinspace

Got rid of the wildcard used in VirtualHost entriesчи насправді це допомагає будь-яким змістовно? Я мав враження, що це нічого не змінить.
Ман

@Mahn - це не допомагає пам'яті, але покращує використання процесора, що добре в середовищі з низькою пам’яттю
jsnfwlr

"Перейти на nginx за допомогою php-fastcgi" --- Менш драстичним, але ефективним варіантом, якщо ви хочете зберегти Apache2, було б: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event схожий на nginx. Використовуйте це для підключення до php-fpm. Дивіться drakon.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
Джеймс Джонстон

6

Я знайшов цю статтю про конфігурації з низькою пам'яттю для Apache та MySQL

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


посилання мертве
користувач2682863

4

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

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

Ви можете зменшити загальний слід пам’яті, виключаючи спільні модулі, які вам не потрібні. В основному, Apache налаштований з більшості хостів, щоб робити майже все під сонцем. Якщо ви не використовуєте mod_userdir, коментуйте це з конфігурації apache. Тільки будьте уважні, скільки ви знімете, бо деякі речі, які вам можуть знадобитися, або їх залежності не є інтуїтивно зрозумілими! Усі модулі повинні бути задокументовані на веб-сайті apache.org. Послідовий слід важче отримати менше; Більшість конфігурацій apache в наші дні оснащені лише чотирма основними модулями, зібраними. Поза межами цих чотирьох модулів, більшість використання пам'яті відбувається з витоків або оперативної пам’яті, яка не є сміттям, зібраним ефективно, саме тому ви можете встановити кількість запитів. кожен процес обробляється низько.

Ви дійсно хочете зберегти використання пам'яті в самій оперативній пам’яті і не переходити на своп. Зміна означає I / O. Введення / вивід повільний і призведе до використання вашого процесора через дах, оскільки процеси блокуються, очікуючи, що щось перетасується із свопу.


1
Дякую за пораду Карлу! Чи є спосіб запобігти серверу використовувати Swap? Оскільки після зменшення використання пам'яті я більше не перебуваю на своїй оперативній пам’яті, але вона все ще показує, що пам'ять SWAP використовується.
ліма

@fandelost Насправді не важливо, що використовується своп, це погано. Ваша операційна система може замінювати інструкції або дані з процесів, які не дуже часто працюють, коли є час, тому що вона думає (і часто має рацію), що ці інструкції та дані там краще.
Патрік Джеймс МакДугле

2

Для apache видаліть модулі, які ви не використовуєте, оскільки вони просто використовують додаткову пам'ять. Для MySQL видаліть innodb / bbdb, якщо ви їх не використовуєте, та видаліть модулі PHP, які вам не потрібні.

Далі слід налаштувати apache MaxClients залежно від розміру одного процесу та кількості пам'яті, яку ви хочете надати apache. Те ж саме стосується і максимальних з'єднань на MySQL (я рекомендую відмінний сценарій для настройки Tuning Primer MySQL

Якщо у вас є контроль над додатком PHP, переконайтеся, що він не використовує занадто багато пам’яті (наприклад, у змінних, особливо статичних).

Якщо ви хочете піти далі, ви можете замінити apache + mod_php на налаштування nginx + fcgi, що, ймовірно, призведе до подальшого скорочення пам'яті.

Останнє - ви дійсно не хочете обмінятися веб-сервером. Ще трохи, щоб видалити непотрібні речі, але регулярна заміна на веб-сервері призведе до невідповідності веб-сайту.


Дякую за пораду yhager, я намагаюся налаштувати tuning-primer.sh, але я отримую таку помилку: "помилка синтаксису в рядку 94:` cnf_socket = $ 'несподівано ". Якісь ідеї?
Ліма

Може бути пов’язаний із оболонкою. Оскільки цей скрипт, мабуть, пов'язаний з Linux, спробуйте змінити перший рядок, щоб він вказував на bash, а не / bin / sh. Я сподіваюся, що ви можете встановити баш на Solaris, але я не можу допомогти з цим ...
yhager

2

Оскільки ви вже виконали свою ціль, ось кілька додаткових:

Оскільки ви видалили всі непотрібні модулі php, ви можете зробити те саме для apache. За замовчуванням (залежно від установки, яку ти встановив), апаш завантажує безліч додаткових модулів, і більшість з них насправді не потрібні для звичайного щоденного використання. Наприклад, є купа модулів аутентифікації, які завжди завантажуються. Дефляція, як правило, не потрібна, якщо ви не намагаєтесь обмежити використання пропускної здатності. Автоіндекс та статус також підлягають сумніву.

І ще один - ви можете обмежити кількість пам'яті, доступної для php в php.ini: memory_limit = xxxM


0

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

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


0

Одне, що може сприяти зростанню пам’яті з часом - це встановити httpd keepalive нижче, але я ретельно перевіряю це на випадок, якщо вашій програмі потрібні триваліші процеси.


0

Сервер працює під управлінням Solaris на спільному процесорі, і я використовую стек Apache + MySQL + PHP.

У мене немає досвіду роботи з Solaris, але найкраще, що ви можете зробити, це не використовувати Apache / mod_php.

  • Перейдіть на nginx за допомогою php-fastcgi.
  • Перекомпілюйте php, щоб використовувати мінімальну кількість плагінів.
  • Позбудьтесь зайвих процесів, таких як ntpd (використовуйте ntpdate), ftp (використовуйте scp) тощо ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.