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

Apache задерживает обслуживание пустого HTML-файла при обработке параллельного запроса

У меня есть веб-сайт, который запрашивает сервер 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 потребовало для обслуживания запроса, с момента его первого получения до момента выполнения запроса.