У меня есть 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 и что этому способствует?