Внимание вопрос. Вот есть 4 буфера по 512к. Вот клиент запросил
страничку, там ну пускай 10 картинок по 100к. Как будут развиваться
события и использоваться буферы?
...
Это буфера для одного соединения. Файл читается в 512k буфер за один read.
Для одного клиента файл прочитается в 4 буфера по 512K.
Для второго клиента файл прочитается в 4 буфера по 512K.
Для третьего клиента ...
Для четвёртго клиента ...
Для пятого клиента ...
И так далее, пока не кончатся клиенты или память.
Разрешите продолжить.
Итак, получается, что при подключении клиента выделяется некий так
скажем "контекст", и в рамках этого "контекста" те 4 блока по 512к.
Вот клиент запросил страничку и затем к ней 10 картинок по 100к.
nginx читает 1-й файл в 1-ый буфер. Затем ещё 4, итого 500к занято.
Следующий, 6-ой файл будет прочитан во 2-ой буфер? Или часть (12к) в
1-ый до его заполнения, а остальная часть во 2-ой?
И главное - как будут развиваться события по выдаче клиенту? Вот
прочитан 1-ый файл в 1-ый буфер и... будет сразу передаваться, а
параллельно с этим читаться и по мере окончания чтения передаваться
остальные файлы?
output_buffers - это буфера на один запрос. По окочанию запроса
они освобожаются. Если клиент откроет одновременно десять запросов,
то в каждом из них будет выделено до 4 буферов по 512К.
Если файл размером в 1К, то выделен будет один буфер 1К (а не 4 по 512К).
По одному соединению можно обработать несколько запросов, они обрабатываются
последовательно.
Не поставить ли postpone_output вместо 1460 что-то поменьше?
postpone_output запрещает вывод данных в ядро, если накоплено меньше.
Это позволяет посылать полноразмерные TCP пакеты.
Можно поставить меньше.
Игорь Сысоев
http://sysoev.ru