Так что я уверен, что об этом, вероятно, спрашивали раньше, но я хочу убедиться, что получаю правильную информацию.
Я использую систему 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 часа.
Я убежден, что это вызвано тем, что памяти слишком мало, а количество получаемых мной обращений приводит к тому, что мой сервер переходит в своп. Поскольку в своп поступает так много запросов, ввод-вывод диска выстреливает через крышу, в результате чего загрузка моего процессора резко возрастает, что приводит к зависанию моего сервера.
Вот что я сделал, чтобы исправить это: я провел небольшое исследование и обнаружил, что мне, вероятно, следует использовать префорк. Я просмотрел свою конфигурацию и не смог найти ни ServerLimit, ни MaxClients, ни чего-либо подобного, поэтому я добавил некоторые значения «по умолчанию», и мой сервер отказался принимать / любые / входящие соединения. Фактически, значения prefork блокировали весь входящий HTTP-трафик, блокируя соединение (возможно, потому, что мой сервер не может обрабатывать prefork? Idk).
На мой взгляд, то, что мой сервер «делал», было в порядке, за исключением того, что все эти процессы apache продолжали зависать и утечка памяти. Есть ли способ установить тайм-аут для процессов Apache или ограничить их количество? Кажется довольно глупым, что лучшее решение - использовать предварительную вилку; Я должен представить, что есть способ получше.
Спасибо, парни
Похоже, вы на собственном горьком опыте усвоили, что PHP требует много памяти и не особо масштабируем.
Некоторые предложения в произвольном порядке:
Если вы все еще подозреваете утечку памяти, установите для MaxRequestsPerChild действительно низкое значение.
Подумайте о покупке дополнительной памяти, 360 мегабайт - это действительно мало в наши дни.
Попробуйте найти средний размер процесса httpd, запустив ps или top, а затем установите MaxClients так, чтобы все всегда умещалось в памяти. Своппинг - это смертельная спираль: чем медленнее вы обрабатываете запросы из-за этого, тем больше процессов apache нужно разветвлять, используя еще больше памяти.
Если вы загружаете php как модуль в apache, он загружается для каждого запроса, будь то скрипт или статический файл (изображение, CSS, .js или еще много чего). Рассмотрите возможность обслуживания статического контента с отдельного сервера или использования fastcgi или обратного прокси, такого как nginx, чтобы apache обслуживал только php, чтобы ограничить количество толстых экземпляров php, которые вы должны хранить в памяти.
У вас есть серверная часть базы данных, к которой вы подключаетесь? Часто случается, что если некоторые запросы начинают замедляться, процессы apache начинают резервное копирование, и, учитывая небольшой объем оперативной памяти на вашем линоде, он будет снежным комом и упадет, что приведет к резкому увеличению загрузки ЦП и нагрузки.
Еще одна вещь, вы упомянули, что используете рабочую модель. Это нормально, если вы на 100% уверены, что все модули, которые вы используете в PHP, являются потокобезопасными. Фактическое руководство по установке php не рекомендует его использовать ( руководство по php ) ... Независимо от того, какую модель вы используете, вам необходимо убедиться, что вы правильно их настроили. Хорошая отправная точка - Тюнинг систем LAMP. Если MaxClients не настроен должным образом, Apache может привести к сбою вашей системы, поскольку он занимает всю память во время всплеска трафика на ваш сайт.
Если у вас действительно мало памяти, вы можете попробовать запустить что-то вроде lighttpd или nginx с php в качестве процесса fastcgi, я не использовал nginx так часто, но я использую выделение lighttpd, и у него очень низкие накладные расходы на память / процессор.
Я предполагаю, что ваша машина работает с нехваткой памяти. По моему опыту, каждый запущенный процесс apache может занимать много памяти. Если у вас есть php, работающий как модуль в apache, посмотрите в своем php.ini, какое значение для memory_limit =
является. У меня было 128 МБ, что довольно много, если у вас работает всего 10 процессов apache. Они могут не брать эту сумму с самого начала, но если у вашего PHP-приложения утечка памяти или действительно требуется 128 МБ, вы можете довольно легко достичь лимита своих серверов.
Моя рекомендация: физическая память, деленная на memory_limit, равна max_procs