Использование нескольких процессоров / процессорных ядер дает серверным приложениям возможность обрабатывать несколько клиентских подключений (и запросов) параллельно (для достижения более высокой производительности).
В мире многоядерных процессоров этот вопрос был предметом обширных исследований.
Существует 3 способа устранения параллелизма (например, многоядерные процессоры):
с использованием нескольких процессов;
использование нескольких потоков в одном процессе;
использование нескольких потоков в нескольких процессах.
Apache исследовал несколько моделей, и Nginx использует опцию №1.
Какая модель работает лучше, обычно считается вопросом реализации (по крайней мере, в Unix, где процессы очень легкие, поэтому они могут конкурировать с потоками).
Теперь вернемся к вопросу (на основании опубликованных тестов чтения здесь ): правильная (многопоточная) архитектура Apache должна масштабироваться лучше, чем Nginx на многоядерных процессорах.
Как это ни парадоксально, это не означает, что Apache работает быстрее, чем Nginx: это просто означает, что на 1, 2, 3, ... 16 ядрах Apache будет масштабироваться лучше, чем Nginx, тогда как Nginx будет обрабатывать больше клиентских запросов:
Быстродействие должно быть быстрым (обработка большего числа запросов в секунду на одноядерном процессоре)
Масштабируемость - это способность обрабатывать больше запросов в секунду при увеличении числа ядер ЦП (идеальным является линейное масштабирование: удвоение запросов в секунду при удвоении количества ядер ЦП).
Масштабирование без производительности не имеет смысла, если число запросов в секунду к серверу, который масштабируется, ниже скорости сервера, который не масштабируется (обратите внимание, что если сервер ДЕЙСТВИТЕЛЬНО хорошо масштабируется, есть момент, когда наличие МНОГИХ ядер должно заставить его работать лучше, чем сервер, который не масштабируется).
Выполнение без масштабирования делает сервер неспособным использовать преимущества многоядерных процессоров.
Безусловно, будущее будет за серверными приложениями, которые выполняют обе функции правильно, чтобы обеспечить наилучшую производительность при любых условиях (всего несколько ядер или много-много ядер).