Недавно я заметил, что мой apache использует абсурдное количество памяти на моем сервере Linode (на 80 МБ больше, чем раньше), и перезапуск apache2, похоже, решает проблему.
Я запускаю SVN поверх apache, а также mysql и tomcat на сервере, но, похоже, это не проблема. Как мне выполнить отладку, когда apache теряет память? Помимо SVN, на самом деле это только блог на wordpress, поэтому я не вижу, где могла произойти утечка. Я использовал установку по умолчанию из репозиториев ubuntu 8.04.
Любая помощь?
Нюанс работы с памятью в Apache означает, что он всегда потребляет все больше и больше памяти - значение VIRT для top часто бывает высоким при использовании prefork.c
(что я предполагаю, что вы):
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10385 apache 15 0 376m 48m 3932 R 20.3 1.2 0:01.34 httpd
10423 apache 16 0 376m 46m 4576 S 15.0 1.2 0:01.09 httpd
10153 apache 15 0 337m 61m 4672 S 11.6 1.6 0:03.94 httpd
10419 apache 15 0 383m 54m 4696 S 11.6 1.4 0:01.00 httpd
Значение, которое вы хотите отслеживать, - RES - это размер наибольшего объема памяти, который использует дочерний поток (в моем случае PHP запускается как часть этого потока, отсюда "раздувание" при загрузке библиотек и данных) . Поток не освобождает выделенную память, однако, когда процесс apache убивает поток после его maxrequests в соответствии с
<IfModule prefork.c>
MaxRequestsPerChild 1000
поток вернется к своему собственному потреблению памяти. Это тот же эффект, что и перезапуск apache, хотя перезапуск влечет за собой временную потерю обслуживания (порт 80 не прослушивается), тогда как MaxRequestsPerChild управляет только дочерними потоками, гарантируя, что служба по-прежнему прослушивает порт 80 (или там, где он настроен для Слушать).
Чтобы снизить общее использование памяти apache, убедитесь, что вы загружаете только необходимые модули apache, и отслеживайте потоки apache, пока вы запускаете очень большой PHP-скрипт (ini_set('memory_limit', '128M');
затем рекурсивно загрузить данные в массив - это должно сработать). Затем, при использовании в реальном мире, уменьшите MaxRequestsPerChild
значение, пока вы не увидите свой апач RES
на разумном уровне. Не забывайте, что это только снижает вероятность того, что дочерний поток будет запускать большой скрипт в начале своей "жизни" (чем больше дочерних потоков это делают, тем больше общей памяти использует apache),
Вот несколько полезных статей о настройке параметров: