Назад | Перейти на главную страницу

У моей установки Apache2 утечка памяти?

Недавно я заметил, что мой 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),

Вот несколько полезных статей о настройке параметров: