Протестировал программу threadaded.c с http_load. Программа работает за nginx. Работает только один экземпляр программы. Если запросы обслуживаются последовательно, я ожидаю, что для 20 запросов потребуется 40 секунд, даже если они отправляются параллельно. Вот результаты (я использовал те же цифры, что и у Эндрю Брэдфорда - 20, 21 и 40) -
20 запросов, 20 параллельно, заняло 2 секунды -
$ http_load -parallel 20 -fetches 20 request.txt
20 fetches, 20 max parallel, 6830 bytes, in 2.0026 seconds
341.5 mean bytes/connection
9.98701 fetches/sec, 3410.56 bytes/sec
msecs/connect: 0.158 mean, 0.256 max, 0.093 min
msecs/first-response: 2001.5 mean, 2002.12 max, 2000.98 min
HTTP response codes:
code 200 -- 20
21 запросов, 20 параллельно, заняло 4 секунды -
$ http_load -parallel 20 -fetches 21 request.txt
21 fetches, 20 max parallel, 7171 bytes, in 4.00267 seconds
341.476 mean bytes/connection
5.2465 fetches/sec, 1791.55 bytes/sec
msecs/connect: 0.253714 mean, 0.366 max, 0.145 min
msecs/first-response: 2001.51 mean, 2002.26 max, 2000.86 min
HTTP response codes:
code 200 -- 21
40 запросов, 20 параллельно, заняло 4 секунды -
$ http_load -parallel 20 -fetches 40 request.txt
40 fetches, 20 max parallel, 13660 bytes, in 4.00508 seconds
341.5 mean bytes/connection
9.98732 fetches/sec, 3410.67 bytes/sec
msecs/connect: 0.159975 mean, 0.28 max, 0.079 min
msecs/first-response: 2001.86 mean, 2002.62 max, 2000.95 min
HTTP response codes:
code 200 -- 40
Итак, это доказывает, что даже если значения FCGI_MAX_CONNS, FCGI_MAX_REQS и FCGI_MPXS_CONNS жестко заданы, запросы обслуживаются параллельно.
Когда Nginx получает несколько запросов, он помещает их все в очередь приложения FCGI вплотную. Он не ждет ответа от первого запроса перед отправкой второго запроса. В приложении FCGI, когда поток в течение какого-то времени обслуживает первый запрос, другой поток не ожидает завершения первого, он подхватывает второй запрос и начинает работать над ним. И так далее.
Таким образом, единственное время, которое вы потеряете, - это время, необходимое для чтения запроса из очереди. Это время обычно ничтожно мало по сравнению со временем обработки запроса.