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

Igor Sysoev is at rambler-co.ru
Fri Apr 13 00:55:47 MSD 2007


On Wed, Apr 11, 2007 at 10:21:29AM +0400, Александр Ворона wrote:

> proforg пишет:
> >>Сорри за небольшой оффтоп, ради интереса спрашиваю. Процесс
> >>проксирования апачу (грубо): приходит запрос nginx-у, worker форкается,
> >>открывает апачевый сокет, пишет туда запрос, потом читает оттуда ответ
> >>и отсылает его запрашиваемому (ч-з свой сокет)?
> >По сути да, за тем исключением что не форкается, используется 
> >асинхронный i/o.
> немного поправлю - не асинхронный i/o, а мультиплексирование.
> http://www.lexa.ru/nginx-ru/msg03999.html
> учитывая что на бсд sendfile'у можно сказать быть неблокируемым, а для
> линукса я пытаюсь пропатчить ядро для этого, то ничего плохого в
> отсутсвии AIO нет.  Смотрел на реализацию linux-aio-sendfile у lighttpd
> - файл мапится в shared memory и оттуда sendfile()ится. В результате ни
> о каком zero copy речи нет. Как плюс - можно отдавать один и тот же
> кусок нескольким клиентам; не возникает блокирующихся на диске sendfile
> тк нужный кусок уже в памяти. Из минусов - raw perfomanse ниже. wget на
> гигабитном линке показал ~47МБайт у lighttpd с linux-aio-sendfile и
> ~63мбайт у nginx sendfile при отдаче фильмов с диска.

С неблокирующимся sendfile ситуация непонятна. Я впервые увидел, как
Линукс за один неблокирующийся вызов передал 900M.

Что касается linux-aio-sendfile у lighttpd, то там сделано хитро:

1) создаётся временный файл в /dev/shm/,
2) делается mmap этого файла,
3) делается aio чтение (io_submit) в за'mmap'ленную память,
4) делается sendfile временного файла.

Для FreeBSD используется posix-aio:

1) делается mmap(/dev/zero),
2) делается aio чтение в за'mmap'ленную память,
3) делается write этой памяти.

В случае linux-aio-sendfile, возможно, в ядре происходит минимум
копирования (я не знаю), но во FreeBSD всегда есть две операции
копирования - 2 и 3.


-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list