Как стать автором
Обновить

ОС и вебсервер — вместе веселей

Время на прочтение3 мин
Количество просмотров5.9K
Привет всем. Сначала я думал, что лучше всего продолжить тему nginx на примере подчищенного и откомментированного конфига с одного из боевых серверов, но потом понял, что это потребует довольно большого объёма дополнительной информации. Поэтому, я решил попробовать, для затравки, рассказать в общих чертах о том, как nginx устроен, и почему он работает так быстро.


Начать нужно с того, чтобы понять, как вообще сервер с одним условным процессором, может обрабатывать больше чем один сетевой запрос одновременно. Все уже давно в курсе про разделение времени CPU между задачами и про переключение задач по таймеру в современных операционных системах. Но если бы в компьютере был только один CPU, выполнять более чем один запрос одновременно он всё-равно не смог бы. Разделение задач на кванты, и их чередование приводило бы не к уменьшению, а к увеличению общего времени работы над всеми задачами.

Всё дело в том, что в современных компьютерах процессор не один. :) Даже если у вашего CPU всего одно ядро, ему помогает куча других микросхем. Основные из них — это контроллер(-ы) DMA, специализированный контроллер на сетевой плате, контроллер жёсткого диска, процессор видеокарты (хотя в веб-серверах он пока не используется), и прочая, прочая… Все эти девайсы могут взять на себя много узкоспециализированной работы, освобождая центральный процессор для выполнения других задач.

Работа операционной системы и заключается в том, чтобы грамотно распределять нагрузку по устройствам, которые найдутся в вашем компьютере. Например, процессор может сказать контроллеру DMA «перешли вот эти данные с диска, вот в этот участок памяти», и заняться чем-то другим. Чем именно «другим», определяет один из специальных алгоритмов планирования, каждый — со своими преимуществами и недостатками (про них советую почитать очень хорошую книжку господина Танненбаума «Современные операционные системы»). Но речь сейчас не об этом.

Я бы хотел обратить ваше внимание на то, что сама архитектура современных x86-компьютеров навязывает асинхронность выполнения заданий для увеличения производительности системы в целом. Операционная система может скрывать от пользователей эту асинхронность, предоставляя синхронные системные вызовы, но можно выиграть очень много, если написать программу с учётом того, что происходит «под капотом».

Правда тут скрывается небольшая проблема. Операционные системы, традиционно, разрабатывались таким образом, чтобы выполняемые программы могли даже не подозревать о том, что «они тут не одни». И даже средства для выполнения быстрых асинхронных системных вызовов появились в Linux, FreeBSD и Windows относительно недавно (я не имею в виду select и poll).

Собственно говоря, думаю, вы уже поняли, к чему я веду. Nginx работает очень быстро, потому что не порождает по отдельному процессу (потоку) на каждый обрабатываемый запрос от пользователя, а выполняет все задачи в одном процессе, пользуясь асинхронными системными вызовами для операций ввода-вывода (работа с сетью, и жёстким диском). Такой подход обладает рядом преимуществ:

— всю работу может выполнять один процесс, или, в общем случае, N процессов, где N — число ядер в вашем сервере;
— количество переключений между контекстами выполнения минимизируется;
— практически нет необходимости в синхронизации процессов или потоков;
— уменьшается использование памяти;

У этого подхода есть и свои недостатки, главными из которых можно назвать необходимость очень тщательного подхода к программированию сервера, и отсутствие возможности использовать блокирующиеся операции ввода-вывода. Точнее, использовать блокирующиеся операции вы конечно можете, но это остановит ВЕСЬ процесс веб-сервера, и обслуживание всех соединений, до завершения блокировки. В частности, в этом и есть одна из проблем с использованием встроенного в nginx Perl. При любой операции ввода-вывода он может блокироваться — а это тормозит всю работу.

В завершение, хотел бы добавить, что быстродействие вашего сервера с nginx в значительной степени зависит от операционной системы и её настроек. Грамотным тюнингом ОС, под большими нагрузками, можно увеличить производительность сервера на многие десятки процентов.

PS Спасибо моим друзьям и коллегам за бетатестинг текста. :)
Теги:
Хабы:
+54
Комментарии82

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн