Pull to refresh

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

Nginx *
Translation
Original author: Kevin Schroeder
Недавно я слышал, что 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. Он справился с 5200 запросами.  Такого большого количества я раньше никогда не видел. Я выполнил те же запросы с -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 по-прежнему является лучшим решением.

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

Tags:
Hubs:
Total votes 56: ↑10 and ↓46 -36
Views 30K
Comments Comments 35