Почему NginX с Fast-CGI быстрее, чем Apache с mod_php?

от автора

Недавно я слышал, что NginX, работающий с PHP через FastCGI был быстрее Apache с mod_php. Я также видел, что люди как отрицают, так и соглашаются с этой гипотезой.  Давайте проведем небольшой тест и узнаем показатели работы этих систем.

Для тестирования я создал небольшой Hello world скрипт.  Почему я не выбрал что-то посложнее?  Ответ прост: в интерпритаторе PHP не должно быть особой разницы производительности.  Почему же тогда я не создал абсолютно пустую страницу?  Дело в том, что хотелось протестировать двунаправленную передачу данных.  Целью является тестирование скорости работы веб-сервера в целом, а не только PHP.

Базовые тесты дают нам следующие результаты:.

Apache с mod_php

Total transferred: 3470000 bytes  HTML transferred: 120000 bytes  Requests per second: 2395.73 [#/sec] (mean)  Time per request: 4.174 [ms] (mean)  Time per request: 0.417 [ms] (mean, across all concurrent requests)  Transfer rate: 811.67 [Kbytes/sec] received

NginX с PHP-FPM

Total transferred: 1590000 bytes  HTML transferred: 120000 bytes  Requests per second: 5166.39 [#/sec] (mean)  Time per request: 1.936 [ms] (mean)  Time per request: 0.194 [ms] (mean, across all concurrent requests)  Transfer rate: 801.82 [Kbytes/sec] received

Apache удалось обработать 2400 запросов в секунду в отличии от Nginx. Он справился с 2500 запросами.  Такого большого количества я раньше никогда не видел. Я выполнил те же запросы с -c -f для Apache, чтобы узнать причины такой разницы.  -c отображает время системных запросов, -f следует ответвлениям.  Какой же результат для первых 10 строк?

% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ----------------  33.65 0.042063 4 10003 getcwd  16.10 0.020127 2 10001 writev  16.00 0.019994 2 10001 shutdown  10.54 0.013179 0 51836 40118 open  9.01 0.011263 1 20008 semop  5.22 0.006522 0 54507 10002 read  2.53 0.003158 0 10024 write  1.91 0.002386 0 88260 66483 close  1.57 0.001959 245 8 clone  1.16 0.001455 0 54832 384 stat64

getcwd?  Но почему?  После я вспомнил, что у меня активировано AllowOverwrite (.htaccess).  Выполнил те же тесты после отключения этой функции.

Total transferred: 3470000 bytes HTML transferred: 120000 bytes Requests per second: 5352.41 [#/sec] (mean) Time per request: 1.868 [ms] (mean) Time per request: 0.187 [ms] (mean, across all concurrent requests) Transfer rate: 1813.40 [Kbytes/sec] received

С 5352 обработанными запросами Apache опередил NginX.  Но что же произойдет тогдпн, когда объем передаваемых данных увеличится?  Я создал около 100k контента и попробовал снова.

Apache

Total transferred: 1051720000 bytes HTML transferred: 1048570000 bytes Requests per second: 2470.24 [#/sec] (mean) Time per request: 4.048 [ms] (mean) Time per request: 0.405 [ms] (mean, across all concurrent requests) Transfer rate: 253710.79 [Kbytes/sec] received

NginX

Total transferred: 1050040000 bytes HTML transferred: 1048570000 bytes Requests per second: 2111.08 [#/sec] (mean) Time per request: 4.737 [ms] (mean) Time per request: 0.474 [ms] (mean, across all concurrent requests) Transfer rate: 216476.53 [Kbytes/sec] received

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

Если Вы работаете с разными языками вроде CSS, JS и изображениямм, тогда Вам больше подойдет NginX. Его производительность будет выше, но PHP быстрее не станет.  Он также будет надежнее в плане защиты от DDoS, но CDN по-прежнему является лучшим решением.

Ниже представлены графики для сравнения производительности:

ссылка на оригинал статьи http://habrahabr.ru/post/226875/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *