У меня есть сервер Apache, который проксирует Tomcat через mod_jk. Я установил собственный журнал в Apache для регистрации времени доступа:
LogFormat "%h %l %u %t \"%r\" %>s %b %D" transfertimes
CustomLog /path/to/transfer-times.log transfertimes
Я запускаю ApacheBench на самом веб-сервере. Я заметил, что по мере увеличения параллелизма время запросов 99-го процентиля, похоже, экспоненциально увеличивается, хотя 50-й процентиль остается относительно стабильным. В качестве примера ApacheBench скажет, что примерно 10 запросов из 1000 требуют> 1 секунды, чтобы ответить с уровнем параллелизма 100.
Однако, когда я смотрю журнал transfer-times.log, ни один из запросов не отображается дольше 1 секунды, исходя из% D в LogFormat. Я пытаюсь выяснить, что может вызвать несоответствие между журналом Apache и сообщенным временем доступа ApacheBench. Обычно я мог бы объяснить это задержкой в сети, но я запускаю все это на одном хосте. Я думаю, что должно быть что-то необычное с параметрами TCP или файловыми дескрипторами Linux, которые мне нужно настроить, но я не уверен, с чего начать.
Возможно, что на самом деле так много времени для обслуживания запроса занимает не apache, а что вы сталкиваетесь с каким-то другим ограничением, уже определенным в ОС.
Посмотрите, что netstat дает вам о количестве принятых подключений, вполне возможно, что вы обнаружите большие различия в количестве запросов, которые видит apache (и, таким образом, обслуживает в те временные рамки, о которых знает apache) и количество запросов ОС уже могла позаботиться об этом.
netstat -tulpen
здесь может помочь. Также посмотрите, что sysctl сообщает вам об ограничениях или, возможно, даже iptables.
Извините, я не могу вспомнить никаких подробностей, так как я давно не сталкивался с такими проблемами.
Я думаю, что ваш внешний запрос находится в очереди приема из-за недостаточного количества рабочих в apache или в передаче mod_jk.
Чтобы правильно прокси между apache и tomcat, вам необходимо настроить коннектор tomcat для обработки такого количества соединений, которое apache будет разветвлять дочерними элементами. Если вы этого не сделаете, apache должен будет заблокировать ожидание, пока tomcat освободит соединение. Это может привести к дополнительной блокировке, так как рабочие, ожидающие Tomcat, будут недоступны для обработки входящих соединений.
http://tomcat.apache.org/tomcat-6.0-doc/config/ajp.html
пс. Не бери %D
как евангелие. Он измеряет только время между началом работы дочернего Apache (поэтому не учитывает продолжительность принятия / вилки / передачи обслуживания) и временем, когда последний байт отправляется через send()
(поэтому сильно варьируется из-за буферизации ОС).
pps. настройка AJP - это черное искусство, ИМХО, преимущества AJP (немного легче анализировать запрос, постоянные соединения) больше не являются достаточной причиной для отказа от прямого HTTP-проксирования.