Несколько непонятностей по nginx
Александр Ворона
voron at amhost.net
Fri Apr 13 17:50:13 MSD 2007
Igor Sysoev пишет:
> У меня есть одно подозрение, может, это сломали не sendfile, а
> ioctl(FIONBIO). Можно проверить так:
>
> ../configure ... --with-cc-opt="NGX_HAVE_FIONBIO=0"
проверил другое. Пропатчил sendfile() в ядре, дабы он при неблокируемом
сокете перебивал count у sendfile на константу 128000. Патч вложил
При отдаче нжинксом файла с диска( не из кэша!)затык после 3-4
сендфайлов, а точнее после первого отданого на 128000
dmesg
[ 5654.554353] ask 1466761216 <4>real 128000
[ 5654.568565] sended 20576 bytes
[ 5654.568778] ask 1466740640 <4>real 128000
[ 5654.570062] sended 83352 bytes
[ 5654.570285] ask 1466657288 <4>real 128000
[ 5654.573701] sended 111136 bytes
[ 5654.573914] ask 1466546152 <4>real 128000
[ 5654.575222] sended 128000 bytes
затык
wget -Y off -O /dev/null http://192.168.78.1:81/2.tmp
--14:24:44-- http://192.168.78.1:81/2.tmp
=> `/dev/null'
Устанавливается соединение с 192.168.78.1:81... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 1 466 761 216 (1.4G) [application/octet-stream]
0% [
] 343 064 --.--K/s
При отдаче lighhttpd через linux-sendfile всё ок и достигнут нужный
эффект - нет блокировки при отдаче - параллельные коннекты принимаются
и отдаются.
dmesg
[ 3986.823916] ask 146274204 <4>real 128000
[ 3986.826964] sended 128000 bytes
[ 3986.827061] ask 146146204 <4>real 128000
[ 3986.828933] sended 128000 bytes
[ 3986.829015] ask 146018204 <4>real 128000
[ 3986.830907] sended 128000 bytes
[ 3986.830991] ask 145890204 <4>real 128000
wget -Y off -O /dev/null http://192.168.78.1:82/3.tmp
--14:31:48-- http://192.168.78.1:82/3.tmp
=> `/dev/null'
Устанавливается соединение с 192.168.78.1:82... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 4 294 967 296 (4.0G) [application/octet-stream]
45% [===================================>
] 1 934 299 038 60.11M/s ETA 00:38
руками оборвал закачку
попробовал апач - тоже всё ок - отдаёт
strace
poll([{fd=8, events=POLLOUT, revents=POLLOUT}], 1, 300000) = 1
sendfile(8, 9, [811668553], 656370615) = 128000
poll([{fd=8, events=POLLOUT, revents=POLLOUT}], 1, 300000) = 1
sendfile(8, 9, [811796553], 656242615) = 128000
poll([{fd=8, events=POLLOUT, revents=POLLOUT}], 1, 300000) = 1
sendfile(8, 9, [811924553], 656114615) = 128000
poll([{fd=8, events=POLLOUT, revents=POLLOUT}], 1, 300000) = 1
sendfile(8, 9, [812052553], 655986615) = 128000
dmesg
[ 6921.055356] ask 455282615 <4>real 128000
[ 6921.057216] sended 128000 bytes
[ 6921.057313] ask 455154615 <4>real 128000
[ 6921.059175] sended 128000 bytes
[ 6921.059261] ask 455026615 <4>real 128000
[ 6921.062314] sended 128000 bytes
[ 6921.062402] ask 454898615 <4>real 128000
[ 6921.064285] sended 128000 bytes
пробовал проверить также vsftpd, но он не выставляет неблокирующий режим
:), ибо не нужно ему это
по какому критерию nginx прекращает передачу после того, как ядерный
sendfile() передал ровно столько, сколько его попросил патч ?
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: sendfile.patch
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20070413/4b5fe980/attachment.ksh>
More information about the nginx-ru
mailing list