2008-11-23 2 views
0

Я настроил простой стек LAMP на Debian, и у меня возникают некоторые проблемы с веб-сервером Apache.Как исправить неустойчивость Apache?

Каждые 3-4 часа веб-сервер входит в тупик и все запросы, которые попадают в блок базы данных. Сервер создает новый дочерний элемент для каждого запроса. Количество процессов очень быстро растет. Через несколько секунд Monit замечает, что что-то не так, и перезапускает сервер Apache.

Я подозреваю, что эта проблема возникает из-за того, как PHP обрабатывает пул соединений с базой данных, поскольку сервер все еще способен отвечать на статические запросы контента. Испытывали ли вы такое поведение? Что я должен делать?

Обновление: Проблема решена. Похоже, плохая идея использовать APC для кэширования кода и пользовательских данных. Теперь я использую Memcache для хранения пользовательских данных и APC только для кода. Время от времени я по-прежнему получаю некоторые ошибки сегментации, но сервер в большинстве случаев стабилен.

+0

Вы проверили, что это проблема на уровне сервера MySQL? Вы сказали, что статический контент можно обслуживать, можете ли вы подключиться к базе данных с помощью других инструментов? – acrosman 2008-11-23 22:22:50

+0

Да. Сервер mysql работает нормально. – 2008-11-23 22:59:11

ответ

1

Почему бы вам не взглянуть на журналы? /var/log/apache2/* - хорошее место для начала. Что запрашивается непосредственно перед тем, как сервер умрет? С этого момента вы, вероятно, можете определить, что происходит. Поскольку php-скрипты завершаются по истечении 30 секунд по умолчанию, ошибка должна быть довольно массивной, чтобы вызвать что-то подобное.

+0

В журнале ошибок нет сообщений. У меня запущен strace на заблокированном ребенке, и он ждал после futex. Я думаю, что есть проблема в коде, связывающем php с сервером mysql, потому что в то же время сервер смог обрабатывать запросы на статический контент. – 2008-11-23 21:44:24

1

Проверьте настройки таймаута в файле /etc/apache2/apache2.conf, я видел подобные проблемы, когда Timeout установлен на высокий уровень, и система попадает в кучу сброшенных соединений.

+0

таймаутом установлено значение 100. Это слишком высокое значение? – 2008-11-23 21:52:09

3

Я подозреваю, что проблемы:

  • Трудных затянувшиеся запросы к базе данных, которая блокирует дальнейшие запросы. Это довольно легко, если вы используете механизм MySQL MyISAM, который имеет только блокировку на уровне таблиц, и читатели могут легко блокировать писателей и наоборот, поэтому один сложный запрос, скажем, таблицы пользователя, может в значительной степени блокировать весь сервер, в то время как база данных ожидает ввода-вывода. Обычно вы можете диагностировать это, используя «SHOW PROCESSLIST» или инструмент, который делает это для вас.
  • Установив MaxClients слишком высоко для ОЗУ, доступного на сервере предпродак - почти все это делают. Если вы используете «жирный» prefork Apache (например, с in-process PHP), то не устанавливайте MaxClients выше, чем у вас достаточно барана. Это, вероятно, намного меньше, чем типичные значения 100 или 150.

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

Это основано исключительно на догадках и опыте.

0

Журнал mysql-slow также полезен для поиска медленных проблемных запросов.

Смежные вопросы