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

Может ли высокое значение MaxClient вызывать проблемы с загрузкой ЦП независимо от реальной нагрузки на сервер, вызванной посещениями?

Я думал, что MaxClients - это просто предел, и когда сервер достигает предела, он показывает пустые страницы для некоторых людей, предотвращающих перегрузку. Также я думал, что это просто предел, поэтому резервные соединения не используются, если они не нужны, и после этого они освобождаются. Но моя серверная машина, похоже, все это отрицает.

Несколько месяцев назад там, где неоднократно считали восходящую строку MaxClient в журнале Apache моей серверной машины. Прежде, чем я понял, что происходит, сервер нагромождал нагрузку на ЦП, а затем машина полностью вылетела. Это происходит примерно 3 раза за неделю, прежде чем я подниму значение MaxClient с 500 до 900 (предварительная вилка MPM).

[Последний сбой *] Позже, 2 недели назад, был пик подключений, вызванный реальными посещениями (мы опубликовали некоторую «эксклюзивную» информацию). Вероятно, он достигает предела 900 (он обнаружился один раз в журнале), сервер начал отставать и через несколько минут он снова вылетел. Это заканчивается 2-часовым отключением электроэнергии (файловая система повреждена).

Итак, теперь у меня MaxClient = 2000, но проблема, с которой я столкнулся, появилась за несколько дней до [Последний сбой *]. Так что я на самом деле не знаю, актуально ли это.

Вот мои симптомы:

Это моя настройка предварительной вилки MPM (24 ГБ ОЗУ, Apache + MySQL + данные):

StartServers          5
MinSpareServers       5
MaxSpareServers      10
ServerLimit   2000
MaxClients         2000
MaxRequestsPerChild   0

Также у меня отключен KeepAlive. Может ли это сыграть какую-то роль в таком поведении?

KeepAlive Off
MaxKeepAliveRequests 0
KeepAliveTimeout 2

Из статуса сервера: 40 запросов в настоящее время обрабатываются, 0 (или около 12) неактивных рабочих сейчас. Но сегодня суббота, ночь. Сейчас я получаю очень похожие цифры, но сейчас солнечный воскресный полдень ... черт возьми xD

Сначала я подумал, что это неисправный скрипт php, но сейчас я ни в чем не уверен. Когда проблема обнаружилась впервые, кажется, что никто не меняет никаких сценариев. И странное поведение сбоя при достижении предела подсказывает мне, что может быть что-то совсем другое (особенно когда возрастающее значение помогает, это не похоже на нехватку памяти).

Прошу прощения за утомительное описание. Обычно я не спрашиваю перед поиском, но сегодня у меня серьезно закончились идеи. Я не могу все время перезагружать. Эти 2 секунды не имеют значения, но есть также вероятность, что какой-то основной скрипт не сможет завершить свою работу должным образом, или редактор потеряет свою работу при нажатии кнопки сохранения в неподходящий момент.

Итак, чтобы не усложнять, я хотел бы узнать ваше мнение о настройках моего Apache, если возможно, что это может иметь какое-то отношение к моим проблемам с загрузкой.

Даже с 24 ГБ ОЗУ ваши MaxClients, вероятно, слишком высоки. Вот что я использую для приближения среднего размера процесса httpd (замените apache2, если в дистрибутиве Debian):

ps -ylC httpd --sort:rss | awk '{sum+=$8; ++n} END {print "Tot="sum"("n")";print "Avg="sum"/"n"="sum/n/1024"MB"}'

Как только у вас будет эта цифра, возьмите, скажем, 90% ОЗУ системы (при условии, что этот сервер обслуживает только веб-трафик и на нем нет MySQL и других служб) и разделите на средний размер процесса httpd, например:

22 118 МБ / 50 = 442

Итак, вы должны установить MaxClients (и ServerLimit) примерно на 440.

Поскольку у вас также есть MySQL на этом сервере, вам нужно будет быть более консервативным, возможно, возьмите 50% ОЗУ системы и разделите его на средний размер процесса httpd, в результате чего MaxClients будет 245.

Попробуй это:

Timeout     300
KeepAlive   On
MaxKeepAliveRequests    28800
KeepAliveTimeout    260
ListenBackLog   default
StartServers    4
ServerLimit     16
ThreadLimit     2048
MaxClients  2048
MinSpareThreads     32
MaxSpareThreads     64
ThreadsPerChild     128
MaxRequestsPerChild     0

В качестве обходного пути вы можете попробовать установить для MaxRequestsPerChild ненулевое значение.