ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Несколько непонят ностей по nginx



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() передал ровно столько, сколько его попросил патч ?
--- fs/read_write.c     2007-02-04 20:44:54.000000000 +0200
+++ fs/read_write.c.voron       2007-04-13 17:03:54.000000000 +0300
@@ -776,8 +776,16 @@
                count = max - pos;
        }
 
-       retval = in_file->f_op->sendfile(in_file, ppos, count, file_send_actor, 
out_file);
+       if(out_file->f_flags & O_NONBLOCK) {
+           printk(KERN_WARNING "ask %d \t",count);
+           count=(count>128000)?128000:count;
+           printk(KERN_WARNING "real %d\n",count);
+       }else{
+           printk(KERN_WARNING "can't see nonblock in flags %d",out_file->f_flags);
+       }
 
+       retval = in_file->f_op->sendfile(in_file, ppos, count, file_send_actor, 
out_file);
+       printk(KERN_WARNING "sended %d bytes\n",retval);
        if (retval > 0) {
                current->rchar += retval;
                current->wchar += retval;


 




Copyright © Lexa Software, 1996-2009.