проблема с производительностью nginx nodejs faye

Я работаю над балансировкой нагрузки nginx для нескольких серверов чата Faye. Я вижу значительную производительность при обычных HTTP-запросах. Но производительность соединения через веб-сокет очень низкая при сравнении результатов без nginx.

Вот моя конфигурация nginx.

upstream backend {
    server 127.0.0.1:4000;
    server 127.0.0.1:4002;
    server 127.0.0.1:4003;
    server 127.0.0.1:4004;
}

server {
    listen   4001;

    root /var/www/html/laughing-robot;
    index index.html index.htm;

    server_name backend;

    location /faye {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }

        location / {
            proxy_http_version 1.1;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header   X-NginX-Proxy    true;
            proxy_set_header   Host             $http_host;
            proxy_set_header   Upgrade          $http_upgrade;
            proxy_redirect     off;
            proxy_pass         http://backend;
        }
}

Я использую websocket-bench для тестирования соединений Faye (websocket).

Вот результат без nginx:

user@machine:/etc/nginx/sites-enabled$ websocket-bench -a 2000 -c 500 -t faye http://127.0.0.1:4000/faye
Launch bench with 2000 total connection, 500 concurent connection
0 message(s) send by client
1 worker(s)
WS server : faye
trying : 500 ...
trying : 1000 ...
trying : 1500 ...
trying : 2000 ...

#### steps report ####
┌────────┬─────────────┬────────┬──────────────┐
│ Number │ Connections │ Errors │ Duration(ms) │
├────────┼─────────────┼────────┼──────────────┤
│ 500    │ 500         │ 0      │ 2488         │
├────────┼─────────────┼────────┼──────────────┤
│ 1000   │ 500         │ 0      │ 2830         │
├────────┼─────────────┼────────┼──────────────┤
│ 1500   │ 500         │ 0      │ 2769         │
├────────┼─────────────┼────────┼──────────────┤
│ 2000   │ 500         │ 0      │ 2144         │
└────────┴─────────────┴────────┴──────────────┘
#### total report ####
┌────────┬─────────────┬────────┬──────────────┬──────────────┬──────────────┐
│ Number │ Connections │ Errors │ Message Send │ Message Fail │ Duration(ms) │
├────────┼─────────────┼────────┼──────────────┼──────────────┼──────────────┤
│ 2000   │ 2000        │ 0      │ 0            │ 0            │ 5150         │
└────────┴─────────────┴────────┴──────────────┴──────────────┴──────────────┘

Общая продолжительность меньше 6000 ms.

Вот результаты с балансировщиком нагрузки nginx:

user@machine:/etc/nginx/sites-enabled$ websocket-bench -a 2000 -c 500 -t faye http://127.0.0.1:4001/faye
Launch bench with 2000 total connection, 500 concurent connection
0 message(s) send by client
1 worker(s)
WS server : faye
trying : 500 ...
trying : 1000 ...
trying : 1500 ...
trying : 2000 ...

#### steps report ####
┌────────┬─────────────┬────────┬──────────────┐
│ Number │ Connections │ Errors │ Duration(ms) │
├────────┼─────────────┼────────┼──────────────┤
│ 500    │ 500         │ 0      │ 6452         │
├────────┼─────────────┼────────┼──────────────┤
│ 1000   │ 500         │ 0      │ 9394         │
├────────┼─────────────┼────────┼──────────────┤
│ 1500   │ 500         │ 0      │ 12772        │
├────────┼─────────────┼────────┼──────────────┤
│ 2000   │ 500         │ 0      │ 16163        │
└────────┴─────────────┴────────┴──────────────┘
#### total report ####
┌────────┬─────────────┬────────┬──────────────┬──────────────┬──────────────┐
│ Number │ Connections │ Errors │ Message Send │ Message Fail │ Duration(ms) │
├────────┼─────────────┼────────┼──────────────┼──────────────┼──────────────┤
│ 2000   │ 2000        │ 0      │ 0            │ 0            │ 19173        │
└────────┴─────────────┴────────┴──────────────┴──────────────┴──────────────┘

Для всего 2000 подключений и 500 одновременных подключений производительность nginx loadbalancer очень низкая.

Я также настроил nofile и file-max:

/etc/security/limits.conf

*       soft    nofile  2048
*       hard    nofile  65536

/etc/sysctl.conf

fs.file-max = 100000

В Fedora я получаю много ошибок отказа в соединении на /var/log/nginx/error.log. Но на Ubuntu 13.04 ошибок нет.

Было бы очень ценно, если бы кто-то смог направить меня в правильном направлении.

Спасибо!


person Community    schedule 25.01.2014    source источник
comment
Я не вижу, где вы определяете переменную $connection_upgrade. И какую версию nginx вы используете?   -  person Alexey Ten    schedule 06.02.2014
comment
@alexeyten: это определено в файле /etc/nginx/nginx.conf.   -  person    schedule 06.02.2014
comment
Мне кажется, что websocket-bench просто сломан.   -  person VBart    schedule 10.02.2014
comment
@VBart: почему это пришло тебе в голову? Вы можете объяснить больше?   -  person    schedule 13.02.2014
comment
Цифры, которые он показывает, смешны даже в случае без nginx. Открытие 2000 соединений на локальном хосте не имеет большого значения, оно не должно занимать более 10 мс. И на самом деле nginx без проблем обслуживает сотни тысяч подключений.   -  person VBart    schedule 13.02.2014


Ответы (1)


знаете ли вы https://github.com/observing/balancerbattle?

Если вы не получаете ошибок в Ubuntu, какова там производительность? (надеюсь, системы сопоставимы по производительности)

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

Также вы должны, если возможно, попробовать несколько нагрузочных тестов. Тесты, которые вы провели, проводились на сервере, на котором работает nginx. Как тесты сравниваются с фактическим внешним IP-адресом в вашем домене?

Я бы посоветовал запустить нагрузочный тест на машине разработчика, а не на реальном сервере. Кроме того, что top говорит о процессоре / памяти как для процессов nginx, так и для узлов? Не голодает ли nginx один из ваших процессов и/или сам тест?

Веб-сокеты более стабильны по сравнению с ssl, возможно, стоит проверить и это.

Они использовали Thor для тестов, он дает такие же результаты? https://github.com/observing/balancerbattle/blob/master/results/messaging/HAproxy/1k.md

person Paul Scheltema    schedule 06.02.2014