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

Igor Sysoev is at rambler-co.ru
Wed May 2 00:13:48 MSD 2007


On Tue, May 01, 2007 at 06:12:24PM +0400, Exe wrote:

> >научите создателей ядра, как уйти от блокировки по чтению с диска.
> >Неблокирующийся sendfile() только на сети,а не на диске, причём как в  
> >linux, так и в FreeBSD. В последней немного лучше ситуация, но тем не  
> >менее - в случае быстрой сети получаем блокировку на диске при чтении.
> 
> Как это - неблокирующийся на диске? Как Вы себе это представляете?
> Когда речь идет о передаче данных sendfile не блокируется т.к. он на самом
> деле ничего не отсылает и только пихает данные в буфер на отправку, поэтому
> он и не блокируется. А что делать когда он с диска считает? Отдельно  
> посылать
> запросы на чтение и отдельно забирать считанные данные по мере их  
> поступления?

Неблокирующийся на диске sendfile должен работать так:

*) если страница файла есть в памяти, то добавить её в буфер сокета (это
   делается и сейчас);

*) если страницы нет, то инициировать чтение с диска и, не дожидаясь
   его завершения, вернуться в программу с результатом EAGAIN или
   аналогичным ему. При этом kqueue/epoll/etc должны понимать, что
   готовность сокета - это не только свободное место в буфере, но
   готовые данные с диска. Операция чтения должна сообщать о готовности
   данных через kqueue/epoll/etc как о готовности сокета на запись.

> Это ничего не даст если диск один.

Это даст возможность процессу отдавать те файлы, страницы которых
есть в памяти, а не блокироваться на время чтения с диска.


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





More information about the nginx-ru mailing list