Проблемы с памятью Apache
Так что я уверен, что об этом, возможно, уже спрашивали, но я хочу убедиться, что получаю правильную информацию.
Я использую коробку 360 Linode с Debian 5 и Apache 2.2. Я сам все скомпилировал (без apt-get). Время от времени (раз в несколько недель?) Мой сервер случайно "зависал": он загружал до 100% ЦП (на самом деле 400%, но вы понимаете, что я имею в виду) и передавал коробку. Вы не смогли войти в SSH, чтобы увидеть, в чем проблема, и сам сервер перестал принимать соединения. Единственный способ исправить это - перезагрузить коробку.
Недавно это начало происходить с относительной частотой: 24 часа, 12 часов, 10 часов, 8, 6, 4. Наконец, мне удалось мельком увидеть прямо перед тем, как он заблокировался около двух дней назад. Я заметил, что дисковый ввод-вывод был повышен и что осталась только оперативная память! Также была загружена загрузка процессов httpd с 3-4% оперативной памяти. Под загрузкой лодки я имею в виду, что когда я делал ps -ef, они занимали весь экран. Если вы прокрутили, они заняли весь буфер для моего SSH-клиента.
Поэтому я сделал некоторые изменения в своем коде, думая, что что-то не закрывается должным образом. Я исправил проблемы с памятью в моем PHP, я включил более детальную регистрацию ошибок и исправил кучу ошибок, и это, казалось, помогло в некоторой степени. Аварии происходили примерно каждые 24 часа.
Я убежден, что это вызвано тем, что слишком мало памяти, и количество попаданий, которые я получаю, пинает мой сервер в раздел подкачки. Поскольку при свопинге возникает так много запросов, дисковый ввод-вывод стреляет сквозь крышу, заставляя мой процессор загружаться сквозь крышу, в результате чего мой сервер блокируется.
Вот что я сделал, чтобы попытаться это исправить: я провел некоторые исследования и обнаружил, что, вероятно, мне следует использовать prefork. Я посмотрел в своей конфигурации и не смог найти ни ServerLimit, ни MaxClients, ни чего-либо подобного, поэтому я добавил некоторые значения по умолчанию, и мой сервер отказался принимать / любые / входящие соединения. Фактически, значения prefork блокировали весь входящий http-трафик, блокируя соединение (возможно, потому что мой сервер не способен обрабатывать prefork? Idk).
На мой взгляд, то, что "раньше делал" мой сервер, было хорошо, за исключением того, что все эти процессы Apache зависали и теряли память. Есть ли способ установить время ожидания для процессов Apache или ограничить их количество? Кажется довольно глупым, что лучшее решение - использовать prefork; Я должен представить, что есть лучший способ.
Спасибо, парни
4 ответа
Кажется, вы усердно изучаете способ, которым PHP является бременем памяти и не особенно масштабируемым.
Некоторые предложения, в произвольном порядке:
Если вы все еще подозреваете утечку памяти, установите для MaxRequestsPerChild действительно низкое значение.
Подумайте о покупке большего количества памяти, 360 мегабайт на самом деле не так много в наши дни.
Попробуйте найти средний размер процесса httpd, запустив ps или top, а затем установив MaxClients, чтобы все всегда помещалось в памяти. Обмен - это смертельная спираль: чем медленнее вы обрабатываете из-за этого запросы, тем больше процессов нужно развить apache, используя еще больше памяти.
Если вы устанавливаете php как модуль в apache, он загружается для каждого запроса, будь то скрипт или статический файл (изображение или css или.js или еще много чего). Рассмотрите возможность передачи статического контента с отдельного сервера или использования fastcgi или обратного прокси-сервера, такого как nginx, чтобы apache обслуживал только php для ограничения количества толстых экземпляров php, которые вы должны хранить в памяти.
Я предполагаю, что ваша машина бьется с низким объемом памяти. По моему опыту, каждый запущенный процесс apache может занимать много памяти. Если у вас php работает как модуль в apache, посмотрите в вашем php.ini какое значение для memory_limit =
является. У меня было 128M, что довольно много, когда у вас работает только 10 процессов Apache. Они могут не брать эту сумму с самого начала, но если ваше PHP-приложение пропускает память или вам действительно нужно 128M, вы можете легко ограничить свои серверы.
Моя рекомендация: физический баран делится на memory_limit равно max_procs
У вас есть база данных, к которой вы подключаетесь? Часто случается так, что если некоторые запросы начинают замедляться, у вас будут процессы apache, начинающие выполнять резервное копирование, и, учитывая малый объем ОЗУ на вашем линоде, он будет стремительно расти и падать, вызывая резкое увеличение нагрузки на процессор и нагрузку.
Другое дело, вы упомянули, что вы используете рабочую модель. Это нормально, если вы на 100% уверены, что все модули, которые вы используете в PHP, являются потокобезопасными. Тем не менее, настоящее руководство по установке php рекомендует не использовать его ( руководство php)... Независимо от того, с какой моделью вы работаете, вам нужно убедиться, что вы правильно настроили их. Хорошей отправной точкой является настройка систем LAMP. Если MaxClients не настроен должным образом, Apache может в конечном итоге привести к сбою системы, так как он занимает всю память во время притока трафика на ваш сайт.
Если у вас очень мало памяти, вы можете попробовать запустить что-то вроде lighttpd или nginx с php в качестве процесса fastcgi, я не так уж много использовал nginx, но использую lighttpd, и у него очень низкая нагрузка на память / процессор.