directio

Valery Kholodkov valery+nginxru at grid.net.ru
Fri Jul 25 23:11:41 MSD 2008


Скажите, патч предназначен исключительно для FreeBSD?

Потому как на линуксе 2.6.10 я справедливо получаю:

2008/07/25 20:58:08 [crit] 4600#0: *1 pread() failed, file 
"/usr/local/nginx/html/Synovya.i.Lubovniki.1.of.2.avi" (22: Invalid 
argument) while sending response to client, client: 192.168.1.13, 
server: 192.168.1.1, request: "GET /Synovya.i.Lubovniki.1.of.2.avi 
HTTP/1.1", host: "192.168.1.1"

по очевидной причине -- приемный буфер не выровнен на границу дискового 
блока:

Breakpoint 1, ngx_read_file (file=0x80b9ec4, buf=0x80f3970 "", 
size=32768, offset=0)
     at src/os/unix/ngx_files.c:16
16          ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
(gdb) n
21          n = pread(file->fd, buf, size, offset);
(gdb) n
23          if (n == -1) {
(gdb) n
24              ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
(gdb) n
26              return NGX_ERROR;
(gdb) n
54      }

Линус по этому вопросу уже писал:

http://kerneltrap.org/node/7563

Как я понимаю, тут правильно использовать posix_fadvise с аргументом 
POSIX_FADV_SEQUENTIAL.

См. по теме:

http://trac.lighttpd.net/trac/ticket/1418

Igor Sysoev wrote:
> Патч добавляет директиву directio, разрешающую использовать O_DIRECT
> для файлов больше указанного размера:
> 
> directio 4m;
> directio 0;  # запрещает O_DIRECT, default
> 
> Можно ставить на уровне http/server/location.
> Возможно, имеет смысл выключить sendfile.
> 
> O_DIRECT, по идее, должно улучшать скорость отдачи больших файлов
> и ухудшать - небольших.

-- 
Regards,
Valery Kholodkov





More information about the nginx-ru mailing list