Використання пам'яті httpd


13

Виникли проблеми з httpd( Apache/2.2.29) використанням пам'яті.

З часом використання пам'яті в httpdпроцесах повзає, поки в кінцевому підсумку не стане 100%.

Востаннє я перезавантажувався httpdблизько 24 годин тому. Вихід з free -m:

[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655       1415        239          0        202        424
-/+ buffers/cache:        788        866
Swap:         1023          4       1019

Щоб довести, що це точно httpd, я перезапустив httpdі побіг free -mзнову:

[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655        760        894          0        202        360
-/+ buffers/cache:        197       1457
Swap:         1023          4       1019

Отже, перезапуск Apache займає вільну пам'ять від 239 Мб до 894 Мб - це здається великим стрибком.

Я переглядав список ввімкнених на даний момент модулів Apache (їх досить багато), відключений / видалений mod_wsgiі mod_perl(жоден з них не потрібен для цього сервера, на якому працює веб-додаток на базі PHP - Magento, зокрема).

На основі https://servercheck.in/blog/3-small-tweaks-make-apache-fly , я запустив ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'та отримав такий вихід:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' 15.1328 MB 118.09 MB 127.449 MB 129.059 MB 117.734 MB 113.824 MB 125.062 MB 123.922 MB 119.855 MB 108.066 MB 136.23 MB 114.031 MB 113.27 MB 110.695 MB 102.113 MB 113.234 MB 186.816 MB 118.602 MB 0.835938 MB

Запуск іншого запропонованого інструменту діагностики, для MaxClientsякого ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'повертає наступне:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB

Цей сервер ( m1.smallекземпляр Amazon AWS ) має 1.7 Gbоперативну пам'ять. Отже, отже:

Будь-які подальші вказівки / пропозиції щодо того, як найкраще налаштувати httpdналаштування або як діагностувати, що саме може бути причиною цього?


Зауважте, що для перевірки використання пам’яті процесами потрібно переглянути -/+ buffers/cacheрядок; однак у цьому випадку зміна є порівнянною. Залежно від налаштування apache, він може розпочатися лише з декількох процесів, готових до обробки запитів; після періоду багатьох одночасних запитів, ймовірно, буде більше процесів, розроблених для обробки навантаження. Кількість непрацюючих процесів також можна настроїти. Тож якщо apache зростає, використовуючи занадто багато пам’яті, вам потрібно зробити певну настройку.
wurtel

Я все добре в налаштуваннях сервера Apache, але раніше не зробив величезної кількості з точки зору настройки продуктивності для Apache. Будь-які пропозиції щодо директив, на які я повинен дивитись чи керівництва? Чи є налаштування конфігурації, яку я можу ввімкнути, щоб сказати Apache знищувати роздвоєні процеси через певний час? (Здається, Apache чомусь не робить цього за замовчуванням.)
Джеймс Шпіттал

Це точна причина, що я відійшов від Apache ... спробуйте Nginx або навіть Lighttpd.

Цікаво. Чули хороші речі, nginxтому, можливо, саме час ми спробуємо, але, чесно кажучи, я використовую Apache роками і ніколи не мав великих проблем. Magento справді жує пам’ять.
Джеймс Шпіттал

1
Зауважте, що ваш сценарій для обчислення середнього обсягу використання пам'яті включає низьке використання пам'яті grep httpd-процесу (принаймні, для мене). Щоб виправити це, я рекомендую виключити цей рядок із розрахунку, як це:ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
MaPePeR

Відповіді:


12

Ось що я зробив, щоб "вирішити" це:

  1. Набір MaxClients 7(на основі (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748)

Тому:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. Відключення всіх модулів Apache , за винятком authz_host_module, log_config_module, expires_module, deflate_module, setenvif_module, mime_module, autoindex_module, negotiation_module, dir_module, alias_module, rewrite_module,php5_module

  2. Видаліть mod_sslпакет, оскільки клієнт нічим не користується https://.

Я звітую ще раз, коли ця нова конфігурація працює деякий час, щоб побачити, чи вирішує це.

Деякі натхнення тут були запозичені з: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ та http://www.activoinc.com/ завантаження / httpd.conf-magento


Наведена конфігурація, безумовно, допомогла масово.
Джеймс Шпіттал

1
Через пару днів проблеми з «витоком пам’яті», httpdздається, повністю втрачені.
Джеймс Шпіттал

2

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

Додатково: MaxClients = ServerLimit * ThreadsPerChild

У вашому випадку, якщо вам потрібно лише 7 одночасних користувачів (MaxClients = 7), цілком достатньо двох процесів (про всяк випадок, якщо один не зможе мінімізувати час простою), таким чином конфігурація може бути:

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

Я використовую MaxClients 8 , просто для більш рівномірного розподілу запитів між двома процесами.

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