read_ahead

Igor Sysoev is at rambler-co.ru
Tue Sep 29 16:02:14 MSD 2009


On Tue, Sep 29, 2009 at 03:38:24PM +0400, Михаил Монашёв wrote:

> Здравствуйте, Игорь.
> 
> >> Игорь, а поясни пожалуйста что даёт aio sendfile? Ниже ты описал
> >> алгоритм работы, а зачем он нужен не понятно.
> 
> IS> Он нужен, когда весь контент не помещается в память. aio sendfile
> IS> позволяет воркеру не блокироваться на диске при использовани sendfile.
> IS> Вместо этого воркер может принять другое соединение и, если данные
> IS> для него уже закэшированны в VM, то отдать их из кэша.
> 
> А в каких случаях лучше делать aio on, а в каких aio sendfile? Я вот
> сейчас дополз до того, чтобы попробовать aio на рабочей машине и если
> всё получится, оставлю его вместо 1000 воркеров.

aio sendfile включает в себя aio on. То есть, если содержимое файла
нужно прочитать для SSI/gzip/charset/etc, то aio sendfile разрешает
чтение файла с помощью aio, даже если файл не будет отдавать sendfile'ом.

На мой взгляд, aio sendfile + read_ahead имеет смысл использовать всегда -
это самая лучшая комбинация. Без read_ahead aio sendfile неэффективен
для файлов больше 128K.

> IS> В идеале, если файлов не много, но они большие, то вся информация о
> IS> vnode'ах уже будет в памяти, и воркеры не будут блокироваться на
> IS> открытии файлов. Если же файлов много, то воркеры будут блокироваться
> IS> на открытии.
> 
> У  меня  как раз файлов очень много, но вроде бы большинство влезает в
> память:
> 
> kern.maxvnodes: 2000000
> vfs.numvnodes:  1167098
> 
> Видимо сейчас блокировки возникают из-за открытия редких файлов,
> которые почему-то не попали в кэш vnode-ов...

Возможно.

> Эх, жаль никак не получается ограничиться одним воркером... :-)

Есть идея, всё блокирующееся делать отдельным трэдом, но это не скоро.

> Кстати, нормально ли делать vfs.aio.max_aio_procs: 256 ? Или ядро
> может не потянуть столько ядерных тредов?

Нет, с нитями, я думаю, проблем не будет, но, мне кажется, 32 достаточно.

> Мог  бы  ты  описать  вкратце, как работает AIO во FreeBSD. Там каждый
> ядерный  тред  имеет  свою  очередь  файлов  на чтение и по очереди их
> читает? По sysctl -d vfs.aio можно лишь догадываться о том как там всё
> работает...

Насколько я понимаю, все процессы берут запросы из одной общей очереди,
размер которой vfs.aio.max_aio_queue. Текущее число необработанных
запросов в vfs.aio.num_queue_count.


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





More information about the nginx-ru mailing list