FreeBSD & Linux disk AIO support

Igor Sysoev is at rambler-co.ru
Thu Aug 27 15:20:21 MSD 2009


On Thu, Aug 27, 2009 at 02:56:29PM +0400, Лазовский Вадим wrote:

> Igor Sysoev пишет:
> >On Thu, Aug 27, 2009 at 11:18:09AM +0400, Igor Sysoev wrote:
> >
> >>On Thu, Aug 27, 2009 at 10:54:10AM +0400, Лазовский Вадим wrote:
> >>
> >>>Igor Sysoev пишет:
> >>>
> >>>Вчера потестировал под линуксом, есть пара вопросов.
> >>>
> >>>Снизил количество воркеров со 100 до 10. Отдача трафика не изменилась 
> >>>(1600М в пике). Замечу, что 100 - количество с огромным запасом, 
> >>>осталось со времен, когда было мало памяти и кеш был неэффективен.
> >>>
> >>>1. Как определить, что вообще используется aio? :) В линуксе есть 
> >>>ядерные нити [aio/N], но они бездействуют.
> >>Не знаю. Во FreeBSD - по sysctl vfs.aio и wchan воркеров и aiodN.
> >>А в Линуксе - не знаю. Я смотрел по отладочному логу.
> >>
> >>>2. Нормально ли то, что воркеры переходят в состояние D?
> >>Насколько я понимаю, нет - в D должны быть aio/N.
> >>Файлы большие или нет ? Если небольшие, то, по-видимому, из-за того,
> >>что AIO в Линуксе работает только совместно с O_DIRECT, по сути сисколы
> >>AIO работают синхронно.
> >
> >Забыл указать ещё один момент: нужно ещё выключать sendfile:
> >
> >   location / {
> >      sendfile        off;
> >      aio             on;
> >      directio        128k;
> >      output_buffers  1 128k;
> >
> >Сейчас похоже, всё отдавалось sendfile()ом.
> >
> >
> 
> Посыпалось вот такое:
> 
> 2009/08/27 14:50:13 [alert] 14152#0: io_getevents() did not return 
> 18446744073709551615 events
> 2009/08/27 14:50:13 [alert] 14152#0: io_getevents() did not return 1 events
> 2009/08/27 14:52:33 [alert] 14155#0: io_getevents() did not return 
> 18446744073709551615 events
> 2009/08/27 14:52:33 [alert] 14155#0: io_getevents() did not return 1 events
> 2009/08/27 14:54:39 [alert] 14155#0: io_getevents() did not return 
> 18446744073709551615 events
> 2009/08/27 14:54:39 [alert] 14155#0: io_getevents() did not return 1 events

Патч сейча сделать не могу, просто уберите:

         if (events == 0) {
-            ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
-                          "io_getevents() did not return %uL events", ready);
             return;
         }


18446744073709551615 - это -1. Там похоже, есть небольшой race condition,
когда io_getevents() сначала возвращает на одно событие больше, чем
сообщил eventfd(), а потом - на одно событие меньше.


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





More information about the nginx-ru mailing list