Дзен системного администрирования

Записки сисадмина бредущего в пустоте


Previous Entry Share Next Entry
Слон и кит: кто кого сборет?
капуста
zenadmin
Этот эксперимент был вызван к жизни постом http://ru-sysadmins.livejournal.com/1726092.html
В ходе обсуждения возник вопрос - кто ж быстрее отдает статику apache или nginx. Попробуем узнать ответ...


Условия опыта:

Платформа - RHEL 6 (2.6.32-71.el6.x86_64), под VMware Fusion 3.1.2 (1 CPU, 1024 RAM)

В синем углу ринга - apache httpd-2.2.15-5.el6.x86_64, установлен из дистрибутива RHEL6, все настройки взяты по умолчанию.
В красном углу ринга nginx-0.8.54-1.el6.x86_64, установлен из репозитория EPEL, все настройки оставлены по умолчанию, кроме выделеных жирным:
    server {
        listen       8080;
        server_name  _;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   /var/www/html;
            index  index.html index.htm;
        }

        error_page  404              /404.html;
        location = /404.html {
            root   /usr/share/nginx/html;
        }


В роли яблока раздора выступает файл с именем index.html, содержащий в себе великую мантру "Hello World!"

Больше в этом файле нет ничего.

Противники выходят на ринг, пожимают друг другу tcp-сокеты и начинается бой. В роли рефери выступает беспристрастный ab из апачевского пакета. Внимание, барабанная дробь:
[]# ab  -n 10000 http://127.0.0.1:8080/index.html 
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        nginx/0.8.54
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /index.html
Document Length:        13 bytes

Concurrency Level:      1
Time taken for tests:   2.186 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2230000 bytes
HTML transferred:       130000 bytes
Requests per second:    4574.10 [#/sec] (mean)
Time per request:       0.219 [ms] (mean)
Time per request:       0.219 [ms] (mean, across all concurrent requests)
Transfer rate:          996.12 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       4
Processing:     0    0   0.1      0       4
Waiting:        0    0   0.1      0       4
Total:          0    0   0.1      0       4

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      0
  95%      0
  98%      0
  99%      0
 100%      4 (longest request)




[]# ab  -n 10000 http://127.0.0.1:80/index.html 
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache/2.2.15
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /index.html
Document Length:        13 bytes

Concurrency Level:      1
Time taken for tests:   2.963 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2800000 bytes
HTML transferred:       130000 bytes
Requests per second:    3374.47 [#/sec] (mean)
Time per request:       0.296 [ms] (mean)
Time per request:       0.296 [ms] (mean, across all concurrent requests)
Transfer rate:          922.71 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       8
Processing:     0    0   0.3      0      10
Waiting:        0    0   0.2      0      10
Total:          0    0   0.3      0      10

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      0
  95%      0
  98%      0
  99%      0
 100%     10 (longest request)



Подведем итоги:
nginx - 4574.10 запросов в секунду
apache - 3374.47 запросов в секунду

Итого - почти в полтора раза.
За явным преимуществом побеждает nginx.

  • 1
Спасибо.

Если не лень, попробуйте ещё на какой-нибудь картинке среднего размера (килобайт сто), и на чём-нибудь большом, мегабайт в десять.

да не вопрос:
На картинке размером 300 кб:
nginx -
Document Path: /1.png
Document Length: 307298 bytes

Concurrency Level: 1
Time taken for tests: 6.830 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 3075120000 bytes
HTML transferred: 3072980000 bytes
Requests per second: 1464.09 [#/sec] (mean)
Time per request: 0.683 [ms] (mean)
Time per request: 0.683 [ms] (mean, across all concurrent requests)
Transfer rate: 439673.68 [Kbytes/sec] received

apache -

Document Path: /1.png
Document Length: 307298 bytes

Concurrency Level: 1
Time taken for tests: 8.027 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 3075580000 bytes
HTML transferred: 3072980000 bytes
Requests per second: 1245.84 [#/sec] (mean)
Time per request: 0.803 [ms] (mean)
Time per request: 0.803 [ms] (mean, across all concurrent requests)
Transfer rate: 374188.49 [Kbytes/sec] received

а тут разница уже поменьше, но всё равно ощутимая

И теперь на большем файле (только мне лень десять тысяч запросов гонять, обойдемся тысячей):

nginx -

Document Path: /initrd.img
Document Length: 13971139 bytes

Concurrency Level: 1
Time taken for tests: 19.243 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 13971370000 bytes
HTML transferred: 13971139000 bytes
Requests per second: 51.97 [#/sec] (mean)
Time per request: 19.243 [ms] (mean)
Time per request: 19.243 [ms] (mean, across all concurrent requests)
Transfer rate: 709019.24 [Kbytes/sec] received


apache -
Document Path: /initrd.img
Document Length: 13971139 bytes

Concurrency Level: 1
Time taken for tests: 18.661 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 13971417000 bytes
HTML transferred: 13971139000 bytes
Requests per second: 53.59 [#/sec] (mean)
Time per request: 18.661 [ms] (mean)
Time per request: 18.661 [ms] (mean, across all concurrent requests)
Transfer rate: 731158.87 [Kbytes/sec] received

а вот теперь апач вырывается вперед!!!!

не, все таки попробую на 10000, для чистоты эксперимента

nginx -

Document Path: /initrd.img
Document Length: 13971139 bytes

Concurrency Level: 1
Time taken for tests: 9.869 seconds
Complete requests: 497
Failed requests: 0
Write errors: 0
Total transferred: 6945285193 bytes
HTML transferred: 6945146749 bytes
Requests per second: 50.36 [#/sec] (mean)
Time per request: 19.856 [ms] (mean)
Time per request: 19.856 [ms] (mean, across all concurrent requests)
Transfer rate: 687278.74 [Kbytes/sec] received


apache -

Document Path: /initrd.img
Document Length: 13971139 bytes

Concurrency Level: 1
Time taken for tests: 193.748 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 139714170000 bytes
HTML transferred: 139711390000 bytes
Requests per second: 51.61 [#/sec] (mean)
Time per request: 19.375 [ms] (mean)
Time per request: 19.375 [ms] (mean, across all concurrent requests)
Transfer rate: 704213.03 [Kbytes/sec] received

может я что-то не понимаю но почему для nginx Complete requests: 497? остальные скинул под Timeout? Не смотря на то что Failed 0...

А тут вообще почти одинаково. Вероятно, на таком размере накладные расходы в сервере становятся незаметны на фоне собственно отдачи контента.

А попробуйте pls еще какой-нибудь более старый nginx, типа 0.6.x
Он должен быть помедленнее 0.8-го, как говорят тут: http://habrahabr.ru/blogs/nginx/68480/

а вот где бы его взять? :)))

Придется собрать из SRPM
http://pkgs.org/centos-5-rhel-5/kbs-extras-testing-i386/nginx-0.6.39-1.el5.kb.i386.rpm.html
Сможете?
Я смогу собрать часа через два, не раньше.

ну вот тоже не сейчас - уже пора бежать с работы... предлагаю продолжить в понедельник :)

Не должен он быть помедленнее в данном тесте. AIO по умолчанию отключен.

1) И кого практически интересует файлик в 13 байт??? При страничках, начинающихся с 20k?

2) А nginx точно кэшырованием не занялся? Не помню, как у него там сделано -- но не удивлюсь, если он почти ничего не читает в таком случае. Тогда и апачу надо бы кэш настроить, возможно, это что-то изменит.

2) И, на самом деле, практически чаще интересно не сколько метров в секунду можно выжать на хорошэм тэсте -- а на каком наплыве уепассажыров он копыта отбросит.

И кого практически интересует файлик в 13 байт??? При страничках, начинающихся с 20k?
Интересует не файлик в 13 байт, а разница в накладных расхода между апачем и nginx. Увеличение размера контента эту разницу слегка нивелирует, при правильно подобранном тесте :)

ab -n 10000 http://127.0.0.1:8080/index.html

вот причина всех проблем ;)
Попробуйте запустить нгинкс и апач поочереди и спрашивать файлы с другой машины. Вот тогда должна появиться разница. А сейчас вы все плюсы нгинкса нивелировали условиями теста.

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

Нет никаких проблем, точнее есть, но не у nginx.

ab -n 1000 -c 20 http://127.0.0.1...
апач:
Requests per second: 3143.25 [#/sec] (mean)
Time per request: 6.363 [ms] (mean)
Time per request: 0.318 [ms] (mean, across all concurrent requests)
Transfer rate: 870.68 [Kbytes/sec] received

nginx
Requests per second: 6916.39 [#/sec] (mean)
Time per request: 2.892 [ms] (mean)
Time per request: 0.145 [ms] (mean, across all concurrent requests)
Transfer rate: 1452.44 [Kbytes/sec] received

Разница - более чем в два раза по rps.

а если мпм воркер у апача?

Тест синтетический. Проведите тест с динамическим содержимым и с полноценной страничкой с контентом

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

Во-вторых, для интереса эксперимента надо все-таки гнать не один поток. Потому как апач именно там начнет конкретно затыкаться, когда одновременно надо будет отдавать контент в 1000 коннектов.


  • 1
?

Log in