Я пытаюсь понять, почему мои процессы 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
Вы почти наверняка используете mod_php, что означает, что вы почти наверняка используете apache в mpm_prefork.
Если производительность в целом нормальная до тех пор, пока загрузка не заставит вас начать подкачку, быстрое решение - начать регулирование MaxClients Apache. Если apache разрешено форкнуть рабочие процессы в любое время, он начнет подкачку под нагрузкой. Запросы будут стоять в очереди до тех пор, пока не станет доступен воркер, поэтому все может замедлиться, но не так медленно, как смерть путем замены.
Если вам действительно нужно настроить вещи более жестко, подумайте о том, чтобы отказаться от prefork apache mpm. Это означает запуск PHP как FastCGI. Если вы собираетесь использовать PHP под FastCGI, вам следует рассмотреть возможность обновления до PHP 5.3.3, который имеет гораздо более удобный менеджер процессов FastCGI (параметр --enable-fpm configure).
php-fpm / worker намного эффективнее с точки зрения памяти, чем устаревший mod_php. Затем вы можете настроить количество процессов / потоков apache независимо от количества процессов PHP. И ваши процессы PHP с тяжелым объемом памяти используются только для обслуживания содержимого, управляемого php, и не тратятся на обслуживание статических файлов.
Мой хрустальный шар немного пыльный, но я думаю, вы используете memcached и его расширение PHP. Если это так, попробуйте отключить его, если он вам действительно не нужен.
Другая возможность заключается в том, что у вас есть какой-то кеш операционного кода, например XCache, установил и настроил его на использование большого количества памяти.
Вы можете попробовать
pmap -x `pidof apache`
чтобы узнать, что занимает память.
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 и как его настроили?
Кроме того, если вы публикуете дампы терминалов, начинайте каждую строку с четырех пробелов. Это позволяет сохранить форматирование.
Показатели памяти для процессов apache вполне нормальны для установки PHP. Здесь хорошо настроенный сервер apache / php со многими модулями / расширениями, которые не загружены или даже скомпилированы, обычно работает от 200 до 350 МБ виртуальной памяти на процесс и от 40 до 45 МБ резидентной памяти на процесс.
Вы, наверное, плохо знакомы с подсистемой виртуальной памяти? Судя по тому, что вы пишете, ваша система, вероятно, здорова. Проверьте среднюю нагрузку, вы в порядке с этими показателями памяти, если они тоже не будут высокими.
Если вы думаете, что он должен навсегда оставаться на свопе 0MiB, вы ошибаетесь, это было бы действительно глупо для вашей операционной системы.
Не загружайте неиспользуемые модули apache (например, python, perl и т. Д.).
Используйте модуль eAccelerator php. Это компилятор php. Вы можете получить более быстрое выполнение и меньшее использование памяти.
Возможно, другие пользователи тоже правы.