Несколько непонятностей по 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