
Я пытаюсь понять, почему мои процессы Apache потребляют так много памяти.
Характеристики моего слайса (1,5 ГБ ОЗУ, CentOS 5, Apache2, PHP 5.2, MySQL)
Как вы видите, мои самые популярные процессы потребляют почти половину всей памяти, а когда появляется еще больше процессов, сервер практически останавливается, часто переходя в режим подкачки и зависая.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6817 apache 40 0 296m 103m 3920 S 0.0 6.7 0:03.52 httpd
6789 apache 40 0 295m 101m 3932 S 0.0 6.6 0:07.04 httpd
6765 apache 40 0 284m 91m 3948 S 55.1 5.9 0:12.45 httpd
6798 apache 40 0 284m 90m 3944 S 0.0 5.9 0:05.49 httpd
6542 apache 40 0 283m 90m 3956 S 0.0 5.8 0:43.25 httpd
6827 apache 40 0 283m 88m 3796 S 0.0 5.7 0:01.83 httpd
Есть ли у кого-нибудь идеи, что может быть причиной того, что Apache (и PHP) потребляют так много памяти?
total used free shared buffers cached
Mem: 1545 827 718 0 3 111
-/+ buffers/cache: 713 832
Swap: 3071 103 2968
решение1
Вы почти наверняка используете mod_php, а это значит, что вы почти наверняка используете apache в mpm_prefork.
Если производительность в целом в порядке, пока нагрузка не заставит вас начать подкачку, быстрое решение — начать дросселировать MaxClients apache. Если apache разрешено разветвлять рабочие процессы, когда ему захочется, он начнет подкачку под нагрузкой. Запросы будут стоять в очереди, пока рабочий процесс не станет доступен, поэтому все может замедлиться, но не так медленно, как при смерти от подкачки.
Если вам действительно нужно настроить все более жестко, рассмотрите возможность отказа от prefork apache mpm. Это означает запуск PHP как FastCGI. Если вы собираетесь использовать PHP под FastCGI, вам следует рассмотреть возможность обновления до PHP 5.3.3, в котором гораздо более удобный менеджер процессов FastCGI (опция настройки --enable-fpm).
php-fpm/worker гораздо эффективнее в плане памяти, чем старомодный mod_php. Затем вы можете настроить количество процессов/потоков Apache независимо от количества процессов PHP. И ваши требовательные к памяти процессы PHP используются только для обслуживания контента, управляемого PHP, а не тратятся на обслуживание статических файлов.
решение2
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6817 apache 40 0 296m 103m 3920 S 0.0 6.7 0:03.52 httpd
6789 apache 40 0 295m 101m 3932 S 0.0 6.6 0:07.04 httpd
6765 apache 40 0 284m 91m 3948 S 55.1 5.9 0:12.45 httpd
6798 apache 40 0 284m 90m 3944 S 0.0 5.9 0:05.49 httpd
6542 apache 40 0 283m 90m 3956 S 0.0 5.8 0:43.25 httpd
6827 apache 40 0 283m 88m 3796 S 0.0 5.7 0:01.83 httpd
WordPress — единственное, что работает на Apache? Мне интересно, в основном, очень высокое использование процессора PID 6765. Интересно, что он делает. Что касается mem%s, то это выглядит вполне нормально для настройки веб-приложения, поскольку каждый поток фактически запускает более одного работника.
Какой MPM вы используете для Apache и как он настроен?
Также, если вы публикуете дампы терминала, пожалуйста, начинайте каждую строку с четырех пробелов. Это позволяет сохранить форматирование.
решение3
Мой хрустальный шар немного запылился, но, полагаю, вы используетеmemcachedи его расширение PHP. Если это так, попробуйте отключить его, если только он вам действительно не нужен.
Другая возможность заключается в том, что у вас есть какой-то кэш кода операции, напримерXCache, установил и настроил его на использование большого объема памяти.
Вы можете попробовать
pmap -x `pidof apache`
чтобы увидеть, что занимает память.
решение4
Не загружайте неиспользуемые модули Apache (например, Python, Perl и т. д.).
Используйте модуль php eAccelerator. Это компилятор php. Вы можете получить более быстрое выполнение и меньшее использование памяти.
Другие пользователи, возможно, тоже правы.