Як розслідувати витік пам'яті за допомогою Apache та PHP?


16

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

введіть тут опис зображення

введіть тут опис зображення

Ми знаємо, що проблема пам'яті виходить від apache / PHP, оскільки кожен раз, коли ми видаємо /etc/init.d/httpd reloadвикористання пам'яті, падає (див. Вище скріншот та нижче CLI-виходи):

Перед перезавантаженням httpd

$ безкоштовно
             загальна кількість використаних кешованих безкоштовних загальних буферів
Mem: 49447692 45926468 3521224 0 191100 22609728
- / + буфери / кеш: 23125640 26322052
Обмін: 2097144 536552 1560592

Після перезавантаження httpd

$ безкоштовно
             загальна кількість використаних кешованих безкоштовних загальних буферів
Mem: 49447692 28905752 20541940 0 191360 22598428
- / + буфери / кеш: 6115964 43331728
Обмін: 2097144 536552 1560592

Кожному потоку apache присвоюється PHP memory_limit512 Мб, що пояснює, що велике використання пам'яті відображає низький обсяг запитів, і max_execution_time120 сек, що повинно закінчувати потоки, виконання яких займає більше часу, і, отже, повинно запобігати постійному зростанню використання пам'яті. бачачи.

Питання: Як ми могли розслідувати, що спричиняє цей витік пам'яті?

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

Додаткова інформація:

OS: RHEL 5.6
PHP: 5.3
Drupal: 6.x
MySQL: 5.6

FYI нам відомо про проблему заміни, яку ми досліджуємо окремо, і не має нічого спільного з витоком пам’яті, який ми спостерігали до того, як заміни почали відбуватися.


Востаннє я стикався з серйозною проблемою використання пам’яті з LAMP + Drupal, коли у мене була бібліотека, що запам'ятовується PHP. Після того, як я забрав його, використання пам'яті дуже різко впало. Просто здогадка. Можна трохи пізніше набрати належну відповідь.
Janne Pikkarainen

@JannePikkarainen: ми використовуємо memcachedбібліотеку PHP . На основі адміністративної сторінки memcache memcache.php, все, що ми можемо побачити, - це те, що ми виділили 5GBдля memcache, який 3.3GBвикористовується. Було б чудово, якщо ви можете допомогти нам далі тут.
Макс

Так, сам memcachedдемон, напевно, просто чудовий. Це бібліотека пам'яті PHP, яка може або не може витікати з пам'яті (і, таким чином, зростати Apache обробляє пам'ять). Моя проблема була близько 1-2 років тому, тож, можливо, після цього все було б виправлено. У будь-якому випадку, якщо запам’ятовування не є обов’язковим для вас, спробуйте вимкнути його на деякий час і побачити, чи зростає використання пам'яті Apache.
Janne Pikkarainen

Яка актуальна проблема? Чи погана продуктивність? Ви повідомляєте нам симптоми, не пояснюючи, яку проблему ми повинні допомогти вам вирішити. (І про що це питання заміни, про яке ви говорите? Чи так сильно міняєте, що впливає на продуктивність?)
Девід Шварц

@DavidSchwartz: проблема полягає в тому, що якщо ми не перезапустимо httpd, використання пам’яті постійно зростає і вікно врешті-решт виходить з ладу з деякими повідомленнями ядра пам'яті. Вистави хороші (поки використання пам'яті не наблизиться до межі пам'яті). Будь ласка, ігноруйте проблему заміни.
Макс

Відповіді:


11

Ми знаємо, що проблема пам'яті виходить від apache / PHP, оскільки кожен раз, коли ми видаємо /etc/init.d/httpd, перезавантажуємо краплі використання пам'яті

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

Кожному потоку apache присвоюється PHP memory_limit 512MB, що пояснює

Ні, це не так. Ви повідомляєте в середньому 7 і максимум 25 зайнятих серверів - але ваш графік пам'яті показує дельту близько 25 Гбіт.

Дійсно, ви повинні почати заново з базової настройки HTTP - вам здається, що ви працюєте з постійними 256 httpds, але все ж ваше максимальне використання становить 25 - це просто німий.

і max_execution_time 120 сек, який повинен закінчувати потоки, виконання яких займає більше часу

Ні - лише якщо потік виконання знаходиться в інтерпретаторі PHP - ні, якщо PHP заблокований.

що здійснює фінансове моделювання

(зітхає)

Було б корисно, якби ви надали детальну інформацію про те, як ви налаштували Apache, потоки чи префорк, яку версію, як викликається PHP (модуль, cgi, fastcgi), чи використовуєте ви стійкі з'єднання, чи використовуєте ви збережені процедури.

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


2

Напевно ви вже вирішили свою проблему. Як проміжок часу, щоб запобігти заміні / обробці сервера, я щогодини від cron запускаю наступну команду:

#!/bin/sh 
sync; echo 3 > /proc/sys/vm/drop_caches

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

Детальніше можна ознайомитись тут.

http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/


1

Мабуть, це так, як працює PHP - і якщо ви робите довгі цикли, де ви виділяєте об'єкти, і хто знає, чи передаєте ви їх також за допомогою посилання, тож єдиний спосіб впоратися з цим - це після N запитів для кожного процесу PHP щоб зупинити це. Якщо ви запускаєте PHP як CGI, кожен запит робить його повторним нерегулярним - тому не протікає пам’ять і зниження продуктивності може бути не таким великим. Ви також можете запустити швидкі cgi, де, наприклад, кожні 1000 запитів, процес php-fcgi вбивається, і пам'ять вивільняється - знову не протікає пам'ять. Якщо ви запускаєте PHP як модуль mod_php, ви можете спробувати встановити maxrequests в httpd.conf, щоб побачити, чи допомагає він. Я б спробував налаштувати, наприклад, 10 - якщо це буде працювати, падіння продуктивності не буде високим, але не повинно бути витоків пам'яті,


-1

Перевірте пам'ять у глобальному файлі php.ini. просто не скасовуйте значення типу 1 G тощо ... Я настійно рекомендую в цей обліковий запис внести локальний php.ini, щоб не впливати на весь сервер. Я рекомендую встановити глобальний ліміт php.ini приблизно до 64М, оскільки цього, як правило, достатньо для більшості облікових записів

також перевірте налаштування apache

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