Отделение блокирующих функций

Igor Sysoev is at rambler-co.ru
Mon Feb 20 13:11:00 MSK 2006


On Sun, 19 Feb 2006, Alexey Polyakov wrote:

> Просьба Игорю и остальным участником списка оценить следующую идею.
> Проблема - раздача статики заведомо сильно превышающей объемом доступную ОП.
> Решение - сделать небольшой демон, с применением libthr на FreeBSD 6
> либо NPTL на Linux 2.6, который при запуске создает сколько-то потоков
> (напр. 500 штук, при небольшом thread stack size вполне нормально), и
> слушает berkeley-сокет. Accept Mutex передавать через встроенные же
> функции поточной библиотеки. Демон этот уметь должен всего лишь одну
> вещь - отпарсить запрос GET /path/to/filename HTTP/1.0, и сделать
> sendfile().
> Соответственно с другой стороны сокета - nginx, с 1 воркером, с
> выключенной буферизацией проксирования.
>
> Насколько эффективным будет такое решение?

В данном случае будет два копирования - демон > nginx > client.

Есть такой академический сервер Flash, в котором разделяются блокирующиеся
и неблокирущиеся запросы. Основной процесс проверяет страницы за'mmap'ленного
файла на предмет присутствия в памяти с помощью mincore() и, если страницы
в памяти нет, то вспомогательный процесс читает кусок файла. Есть развитие
этого сервера, см. "Making the ``Box'' Transparent: System Call Performance
as a First-class Result", http://www.cs.princeton.edu/~yruan/
где файлы не mmap'ять, а используется sendfile(), и в результате во
FreeBSD 5.х у sendfile() появился флаг SF_NODISKIO.

При проектировании nginx'а такая архитектура учитывалась и кое-где
учитывается, что чтение из файла может вернуть NGX_AGAIN, но реализации
специального процесса нет.

Что касается большого количества потоков, то как показывает практика,
по-видимому, потоков нужно меньше, иначе они создают много паралелльных
запросов к диску.


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





More information about the nginx-ru mailing list