Ос И Веб-Сервер — Вместе Веселее

Всем привет. Сначала я подумал, что лучше всего будет продолжить тему nginx на примере почищенного и закомментированного конфига с одного из продакшн-серверов, но потом понял, что для этого потребуется достаточно большое количество дополнительной информации.

Поэтому я решил попробовать для начала рассказать в общих чертах о том, как работает nginx и почему он работает так быстро.

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

Всем давно известно о разделении процессорного времени между задачами и переключении задач с помощью таймера в современных операционных системах.

Но если бы у компьютера был только один процессор, он все равно не смог бы выполнять более одного запроса одновременно.

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

Все дело в том, что современные компьютеры имеют более одного процессора.

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

Основные из них — это DMA-контроллер(ы), специализированный контроллер на сетевой карте, контроллер жёсткого диска, процессор видеокарты (хотя в веб-серверах он ещё не используется) и так далее, и тому подобное.

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

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

Например, процессор может сказать контроллеру DMA «переместить эти данные с диска в эту область памяти» и сделать что-то еще.

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

Но это не то, о чем мы сейчас говорим.

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

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

Правда, здесь скрыта небольшая проблема.

Операционные системы традиционно проектировались таким образом, что работающие программы могут даже не подозревать, что они не одни.

И даже средства для выполнения быстрых асинхронных системных вызовов появились относительно недавно в Linux, FreeBSD и Windows (я не имею в виду выбор и опрос).

В принципе, я думаю, вы уже поняли, к чему я клоню.

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

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

Точнее, вы, конечно, можете использовать операции блокировки, но это остановит ВЕСЬ процесс веб-сервера, и обслуживание всех соединений, пока блокировка не будет завершена.

В частности, это одна из проблем использования встроенного Perl в nginx. Во время любой операции ввода-вывода он может быть заблокирован — и это замедляет всю работу.

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

Правильно настроив ОС, при больших нагрузках можно повысить производительность сервера на многие десятки процентов.

PS Спасибо моим друзьям и коллегам за бета-тестирование текста.

:) Теги: #Nginx #операционные системы #о жизни

Вместе с данным постом часто просматривают: