У меня странная проблема, которую я не могу отладить.
У меня есть приложение, закодированное через Symfony2, распределенное на трех веб-серверах за балансировщиком нагрузки. На каждом из веб-серверов есть экземпляр Varnish.
В случайные моменты времени некоторые веб-серверы — один или два, реже все они — отвечают с ошибкой 503 на домашней странице в течение примерно 10 минут или около того, а затем все возвращается в норму.
Ошибка вызвана исчерпанной фатальной ошибкой размера памяти, допустимой PHP. Но я не могу понять, почему одно и то же приложение, с тем же кодом, подключающимся к одной и той же БД и т. Д., Терпит неудачу от одного момента к другому, а затем снова возвращается в нормальное состояние. И даже одно и то же приложение на разных серверах с одинаковым аппаратным и программным обеспечением ведет себя по-разному одновременно.
Моим первым предположением было то, что срок действия кэша Varnish истек на сбойных серверах, в то время как на тех, которые ведут себя нормально, по-прежнему сохранялась свежая копия без ошибок. Но если я вручную очищаю кэш на всех серверах, серверы, на которых не было ошибок, выдают 200 OK, и кэш успешно восстанавливается, а остальные продолжают отказывать.
И просто для того, чтобы стать еще более странным … Я понял, что один и тот же URL-адрес с ошибками с некоторыми случайными аргументами запроса корректно отвечает с некоторыми другими. Я имею в виду аргументы, которые ничего не делают в коде.
У меня заканчиваются идеи о том, как отладить эту проблему. Любая подсказка будет по достоинству оценена. Спасибо!
ОБНОВИТЬ:
Я также использую Memcached для кэширования запросов и результатов Doctrine. Ошибка исчерпания памяти запускается, когда Doctrine пытается сохранить что-то в Memcached. Первым предположением будет думать, что он пытается сохранить очень большой результат, но он по-прежнему не объясняет, почему происходит сбой на одном веб-сервере, в то время как на других нет проблем, и все они обрабатывают одни и те же запросы из одной и той же БД.
Для меня это звучит так, как будто у вас есть некоторые скрипты PHP с плохим поведением и / или слишком большой допустимый объем памяти для PHP. Memory_limit * max процессов с 15 МБ на процесс, чтобы сэкономить никогда не должно быть больше, чем доступная память. Если вам нужно больше памяти для некоторых запросов, вы должны создать дополнительный пул с меньшим количеством максимальных процедур.
Также учтите, что лак может занимать довольно большой кусок памяти. Ограничьте размер кеша и максимальное количество одновременных подключений. Каждое соединение использует память, но количество зависит от вашего VCL и размера запроса (включая заголовки).
Это может стать проще в обращении и наверняка даст лучшую эффективность кэширования, если вы поместите лак на уровень балансировки нагрузки.
Других решений пока нет …