В данном случае будет два копирования - демон > nginx > client.
Есть такой академический сервер Flash, в котором разделяются блокирующиеся
и неблокирущиеся запросы. Основной процесс проверяет страницы за'mmap'ленного
файла на предмет присутствия в памяти с помощью mincore() и, если страницы
в памяти нет, то вспомогательный процесс читает кусок файла. Есть развитие
этого сервера, см. "Making the ``Box'' Transparent: System Call Performance
as a First-class Result", http://www.cs.princeton.edu/~yruan/
где файлы не mmap'ять, а используется sendfile(), и в результате во
FreeBSD 5.х у sendfile() появился флаг SF_NODISKIO.
При проектировании nginx'а такая архитектура учитывалась и кое-где
учитывается, что чтение из файла может вернуть NGX_AGAIN, но реализации
специального процесса нет.
А если поступить так: группу потоков, умеющих делать sendfile,
порождать непосредственно в nginx, считать все без исключения вызовы
sendfile - блокирующими. "Основной" поток рабочего процесса при
необходимости сделать sendfile будет передавать сокет и
соответствующее распоряжение sendfile-потоку, а сам при этом -
возвращаться к обслуживанию других соединений. При такой схеме вроде
все зайцы разом убиваются?
В предыдущей реализации потоков, которая на данный момент сломана
использовалась похожая схема, правда, без разделения на sendfile
и прочие. Там один поток раздавал запросы другим. Когда будет починена
поддержка потоков, переделать в разделяемые будет несложно.
Игорь Сысоев
http://sysoev.ru