Как остановить сбой apache2, когда веб-сайт загружается? - PullRequest
0 голосов
/ 03 декабря 2009

Обычно случается, что запросы, похоже, резервируются, и apache начинает потреблять все больше памяти и ЦП, пока в конечном итоге не исчерпается ОЗУ, а затем ВСЕ процессы apache не умрут, оставив всех посетителей без веб-сайта.

Кажется, это общая проблема людей, с которыми я общаюсь, но я не могу найти решение!

Любая помощь высоко ценится!

Ответы [ 3 ]

1 голос
/ 06 декабря 2009

Да, это обычная проблема. Это также точка, где заканчивается знание / системное знание большинства людей: -)

Это длинная тема. Во-первых, можете ли вы воспроизвести поведение или часто его видеть? Или это просто «иногда», и вы замечаете это только тогда, когда уже слишком поздно что-то отлаживать?

Дело в том, что отладка сбоя также возможна посмертно, анализируя журналы, но они должны быть подготовлены к событию раньше, но, поскольку вы не знаете, что искать, это может быть дополнительной работой.

Чтобы выяснить, где может быть узкое место ресурса, хорошим первым шагом может быть включение mod_status, сделать его доступным из localhost или некоторого надежного расположения и посмотреть на состояние сервера (/ server-status). Может быть невозможно посмотреть на состояние сервера, когда «слишком поздно» и Apache больше не реагирует, но возможно собрать интересные данные раньше.

Поскольку вы пометили свой вопрос "mysql", другой вопрос будет, если есть бэкэнд-база данных, которую Apache должен ждать. Небольшая настройка MySQL может решить все ваши проблемы, но это только одна из возможностей сбоя, который вы видите. Регистрация состояния сервера, небольшая часть «верхнего» вывода и mysqls slow-query-log позволят понять это. Кроме того, проверьте конфигурацию памяти mysql, если у вас есть подозрения, что об этом, возможно, уже не позаботились.

Наконец, важно убедиться, что Apache не будет использовать слишком много памяти, когда он ставит в очередь запросы, или машина начнет подкачку и, наконец, уничтожит Apache (или что-то еще). Оцените, сколько памяти требуется каждому процессору Apache. Это не легко увидеть в статусе процесса, но его можно рассчитать с помощью этого сценария: http://cmdline.net/misc/httpd2-memusage. Затем посмотрите, сколько памяти ваша система может максимально потратить на процессы Apache, и соответственно установите MaxClients, чтобы Apache никогда не использовал больше, чем доступно. (Вы умножаете потребность в ОЗУ среднего процесса на количество процессов, простую математику.) Возможно, потребуется скорректировать и некоторые другие директивы определения размера, чтобы они соответствовали MaxClients. Это то, чего не хватает многим установкам, но это необходимая защита от небольших «взрывов».

Наконец, ваш Apache относительно занят? Тогда я могу почти вслепую порекомендовать уменьшить KeepaliveTimeout до 2 секунд.

0 голосов
/ 15 декабря 2009

Звучит так, как будто база данных может вызвать проблему из-за «зависания». Для этого и KeepAlive, и тип MPM не будут иметь значения.

Проверьте, использует ли ваша таблица механизм InnoDB, а не механизм MyISAM. MyISAM будет «ОПТИМИЗИРОВАТЬ» в случайные моменты времени, что является операцией блокировки таблицы, и для большой таблицы может потребоваться несколько минут. Это была бы «патогномоничная» ситуация, которая заставляет Apache останавливаться (и даже разворачиваться до смерти, если не ограничивается должным образом). -> «Показать статус таблицы»

Следующее, что можно проверить, - это недостаток памяти, выделенной для базы данных. /etc/my.cnf обычно поставляется с довольно маленькими значениями по умолчанию. Если в таблицах используется механизм InnoDB, виновником может быть слишком маленькое значение innodb_buffer_pool_size. Вы, вероятно, имеете больше памяти, чтобы сэкономить; Статус таблицы дает вам подробную информацию о фактическом размере данных.

0 голосов
/ 03 декабря 2009

Довольно простым способом было бы ограничить количество пользователей, которым разрешен доступ к вашему сайту. Фактическая конфигурация зависит от используемого MPM. Но обычно это MaxClients (http://httpd.apache.org/docs/2.2/en/mod/mpm_common.html#maxclients) для типичных Unix Apache MPMS (prefork и worker).

Кроме того, если вы используете prefork, вы можете переключиться на worker-mpm, так как он быстрее (но для этого все модули должны быть поточно-ориентированными, например, более старые версии PHP - нет)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...