Скорость Nginx и как ее воспроизвести - PullRequest
8 голосов
/ 15 ноября 2011

Меня интересует это больше, чем с академической точки зрения, а не с практической точки зрения; Я не планирую создавать производственный веб-сервер, чтобы конкурировать с nginx. Что мне интересно, так это то, насколько точно nginx работает так быстро. Главный ответ Google для этого - этот поток, но он просто ссылается на загадочное слайд-шоу и общее покрытие различных стратегий ввода-вывода. Все остальные результаты, по-видимому, просто описывают скорость nginx, а не причину.

Я пытался создать простой сервер erlang, чтобы попытаться конкурировать с nginx, но безрезультатно; nginx выиграл. Все, что делает мой сервер, - это порождает новый процесс для каждого запроса, использует этот процесс для чтения файла в сокет, затем закрывает файл и убивает поток. Это не сложно, но учитывая легкие процессы erlang и основную структуру aio, я думал, что он будет конкурировать, но nginx по-прежнему выигрывает со стабильным средним значением 300 мс при тяжелом стресс-тесте.

Что делает nginx, а не мой простой сервер? Моей первой мыслью было бы хранить файлы в основной памяти, а не бросать их между запросами, но кеш файловой системы уже делает это, поэтому я не думал, что это будет иметь большое значение. Я ошибся? Или мне чего-то не хватает?

Ответы [ 4 ]

8 голосов
/ 16 ноября 2011

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

Я думаю, что многие обсуждения в этой теме могут сбить с толку тех, кто не знаком с дизайном серверов erlang и erlang. Я не хотел удалять ветку, поскольку в ней есть хорошая информация о nginx (и я не могу, у нее уже есть ответы), но я призываю всех, кто хочет создать сервер на основе erlang, провести некоторое исследование и написать много тесты, а не идти только то, что вы прочитали здесь.

0 голосов
/ 10 сентября 2013

Nginx написан на C, следовательно, он скомпилирован на родном машинном языке. У Эрланга есть своя ВМ. Уже одно это означает, что вы никогда не сравнитесь с производительностью хорошо спроектированной C-программы, использующей программу Erlang, учитывая интерпретатор байт-кода, который должен пройти модуль Erlang.

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

0 голосов
/ 15 ноября 2011

Я собираюсь сделать это немного проще, поскольку я не очень разбираюсь в этом вопросе.Но две самые важные вещи, которые делают Nginx быстрым, это то, что он использует опрос событий, и он не блокирует.

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

Вторым по важности является то, что вы не блокируете процесс Nginx.Если вы выполните блокирующую операцию, все остальные соединения будут поставлены в очередь, ожидая завершения.Если каждое соединение блокируется, производительность быстро падает до нуля.

Nginx делает гораздо больше, чем это, чтобы быть быстрым, например, минимизируя переключение контекста.Это, однако, слишком далеко от моего опыта, чтобы мне было удобно комментировать.

0 голосов
/ 15 ноября 2011

Ну, ваша архитектура безнадежно неэффективна.Рассмотрим, например, если вам нужно немного поработать с каждым из 50 соединений.Сколько контекстных переключателей вам понадобится?Предположим, что 50 подключений, которые вы обрабатываете, готовы к вводу / выводу.Сколько звонков в систему потребуется вам, чтобы узнать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...