Обнаружение утечки памяти в процессе Apache httpd, приложении на основе PHP / Doctrine - PullRequest
9 голосов
/ 01 июня 2010

У меня есть PHP-приложение, использующее следующие компоненты:

  • Apache 2.2.3-31 на Centos 5.4
  • PHP 5.2.10
  • Xdebug 2.0.5 с включенной удаленной отладкой
  • APC 3.0.19
  • Doctrine ORM для PHP 1.2.1 с использованием кэширования запросов и кэширования результатов через APC
  • MySQL 5.0.77 с использованием кеширования запросов

Я заметил, что когда я запускаю Apache, я в итоге получаю 10 дочерних процессов. Со временем каждый процесс будет расти в памяти, пока каждый из них не достигнет 10% доступной памяти, что начинает замедлять работу сервера, так как вместе они растут и занимают 100% памяти.

Вот снимок моего главного вывода:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1471 apache    16   0  626m 201m  18m S  0.0 10.2   1:11.02 httpd                                                                                                                                                          
 1470 apache    16   0  622m 198m  18m S  0.0 10.1   1:14.49 httpd                                                                                                                                                          
 1469 apache    16   0  619m 197m  18m S  0.0 10.0   1:11.98 httpd                                                                                                                                                          
 1462 apache    18   0  622m 197m  18m S  0.0 10.0   1:11.27 httpd                                                                                                                                                          
 1460 apache    15   0  622m 195m  18m S  0.0 10.0   1:12.73 httpd                                                                                                                                                          
 1459 apache    16   0  618m 191m  18m S  0.0  9.7   1:13.00 httpd                                                                                                                                                          
 1461 apache    18   0  616m 190m  18m S  0.0  9.7   1:14.09 httpd                                                                                                                                                          
 1468 apache    18   0  613m 190m  18m S  0.0  9.7   1:12.67 httpd                                                                                                                                                          
 7919 apache    18   0  116m  75m  15m S  0.0  3.8   0:19.86 httpd                                                                                                                                                          
 9486 apache    16   0 97.7m  56m  14m S  0.0  2.9   0:13.51 httpd 

У меня нет долго выполняющихся сценариев (все они в конце концов заканчиваются, самый длинный может быть 2 минуты), и я работаю в предположении, что после завершения каждого сценария память, которую он использует, освобождается. (Может быть, кто-то может поправить меня в этом).

Я догадываюсь, что это может быть APC, поскольку он хранит данные между запросами, но в то же время кажется странным, что он будет хранить данные внутри процесса httpd.

Как я могу отследить, какая часть моего приложения вызывает утечку памяти?

Какими инструментами я могу воспользоваться, чтобы увидеть, как увеличивается использование памяти внутри процесса httpd и что этому способствует?

1 Ответ

2 голосов
/ 14 декабря 2011

Я предполагаю, что это может быть APC, поскольку он хранит данные между запросами, но в то же время кажется странным, что он будет хранить данные внутри процесса httpd.

Что странного в этом? Это именно то, что делает APC. Однако память распределяется между всеми процессами httpd, поэтому она не так плоха, как кажется. См. Где APC хранит свой код операции и кэш пользовательских переменных? для получения подробной информации.

...