У меня есть веб-сайт, который запрашивает сервер Varnish, который запрашивает сервер Apache, который запрашивает сервер db.
В 07:00:00 на сервер Apache отправляется запрос, который запускает запрос базы данных, обработка которого занимает более 30 секунд. Пока сервер db "заблокирован", количество одновременных запросов db накапливается, в результате чего накапливаются и запросы apache. Пока это не моя проблема.
Тем временем Varnish опрашивает Apache каждые 5 секунд с таймаутом в 1 секунду. Целью зонда является пустой файл HTML.
Журнал Apache сообщает мне, что на каждый опрос отвечает код состояния 200.
Я получаю следующие результаты из объединенного журнала Varnish / Apache:
Polled at Served at Delay (s)
07:00:26 07:00:26 0
07:00:31 07:00:34 3
07:00:37 07:01:01 24
07:00:43 07:01:01 18
07:00:49 07:01:01 12
07:00:55 07:01:01 6
07:01:01 07:01:01 0
07:01:06 07:01:06 0
Я не понимаю следующего:
Задержка заставляет Varnish полагать, что мой сервер «неработоспособен», что приводит к автоматическому отклонению всех последующих запросов, хотя все они могут быть обслужены с задержкой в 30 секунд.
Конфигурация лака:
backend foo {
.timeout = 60s;
.probe = {
.url = "/check.html";
.interval = 5s;
.timeout = 1s;
.window = 10;
.threshold = 8;
}
}
Конфигурация Apache:
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 20
ServerLimit 200
MaxClients 200
MaxRequestsPerChild 0
</IfModule>
Не стесняйтесь спрашивать дополнительную информацию о конфигурации или журналы.
Apache разрешает создание очереди ожидающих соединений, если все его рабочие потоки http заняты. Это контролируется директивой ListenBackLog:
https://httpd.apache.org/docs/current/mod/mpm_common.html#listenbacklog
Так что вполне возможно, что запросы попадают в эту очередь, когда все остальные запросы сохраняются, и это вызывает вашу задержку.
Я бы также включил обработчик / server-status и отслеживал его, «пока сервер занят», а не когда он уже занят, поскольку Apache не сможет обслуживать страницу состояния сервера.
Еще одна уловка - добавить% D в формат журнала доступа, так как он сообщит вам время (в микросекундах), которое Apache потребовало для обслуживания запроса, с момента его первого получения до момента выполнения запроса.