С неблокирующимся sendfile ситуация непонятна. Я впервые увидел, как
Линукс за один неблокирующийся вызов передал 900M.
вызов должен был быть неблокирующимся - но он таким не был. nginx в это
время естественно ничего кроме этого sendfile() не мог делать. Может
стОит попробовать отдавать sendfile()'ом не до конца файла, а ровно
столько, сколько влезет в буфер сокета, который перед каждым sendfile()
и определять?
кстати попутно мелкая бага - при отдаче nginx'ом 0.5.17 файлов >2G
(linux 2.6.20 и i386 sendfile64() и x86_64 sendfile() ) если за один
sendfile[64](...,count) с (2^31-1) > count > (2^31-page_size) уходит
количество байт 2^31-page_size, то закачка замирает
sendfile(9, 12, [1885428924], 2147480388) = 2147479552
epoll_wait(11,
и всё
nginx закрывает по таймауту соедиение и вгет докачивает
wget -Y off -O /dev/null
--11:43:12--
=> `/dev/null'
Устанавливается соединение с 192.168.78.2:81... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 4 294 967 296 (4.0G) [application/octet-stream]
93%
[===========================================================================>
] 4 032 908 476 --.--K/s ETA 00:42
11:54:12 (5.83 MB/s) - Соединение закрыто, позиция 4032908476. Повтор.
--11:54:13--
(попытка: 2) => `/dev/null'
Устанавливается соединение с 192.168.78.2:81... соединение установлено.
Запрос HTTP послан, ожидается ответ... 206 Partial Content
В случае linux-aio-sendfile, возможно, в ядре происходит минимум
копирования (я не знаю), но во FreeBSD всегда есть две операции
копирования - 2 и 3.
судя по raw perfomance - нет zero copy. Также заметно, что при
linux-aio-sendfile нет iowait. Возможно это связано с тем, что не
происходит упирания в скорость диска. Утилизация диска от sendfile -
100%, от linux-aio-sendfile - 80%