Я пытаюсь понять некоторые цифры, которые вижу, а также почему Haproxy, кажется, попадает в переменная лимиты на запросы / с.
Настройка теста довольно проста:
Я провел тест производительности для каждого из внутренних серверов, и они обслуживают ~ 8 тыс. Запросов / с, используя работа инструмент
Размещение Haproxy перед ними, кажется, ограничивается ~ 22 тыс. Запросов / с.
Загрузка ЦП на Haproxy крайне низкая (5-7%).
Сначала я подозревал, что это может быть ограничение на исходящее соединение, поэтому я запускал инструмент wrk параллельно на Haproxy на всех 20 внутренних серверах по отдельности. Это масштабировалось линейно - каждый из процессов смог выполнить ~ 8 тыс. Запросов / с.
Затем я переключил серверные серверы на экземпляр nginx, обслуживающий HTTP 204.
Затем я настроил Haproxy для добавления нескольких записей для одной конечной точки., т.е.
server nginx1 nginxbox:80
server nginx2 nginxbox:80
Это снизило пропускную способность еще больше, до диапазона ~ 25 тыс. Запросов / с.
Я проводил аналогичные эксперименты с Nginx, поражающим бэкенды (который достигает ~ 19k / s) и запускал Haproxy на Centos, Haproxy версии 1.6 и новой 1.7, но результаты кажутся довольно последовательными. Это заставляет меня чувствовать, что в Haproxy мне не хватает какой-то конфигурации, но я не смог ее понять.
Примечание: я специально удалил глобальный maxconn, потому что по какой-то причине его добавление увеличивало количество ответов об ошибках.
Вот конфигурация Haproxy:
global
daemon
log 127.0.0.1 local0
user haproxy
group haproxy
defaults
log global
mode http
option httplog
option dontlognull
option abortonclose
retries 3
timeout connect 5000
timeout client 10000
timeout server 10000
frontend www-http
log global
bind *:80
default_backend myapp_api-nossl
backend myapp_api-nossl
http-response add-header X-App-Server %b/%s
server myapp_vm-0 myapp_apivm-0:80 check maxconn 200
server myapp_vm-1 myapp_apivm-1:80 check maxconn 200
server myapp_vm-2 myapp_apivm-2:80 check maxconn 200
server myapp_vm-3 myapp_apivm-3:80 check maxconn 200
server myapp_vm-4 myapp_apivm-4:80 check maxconn 200
server myapp_vm-5 myapp_apivm-5:80 check maxconn 200
server myapp_vm-6 myapp_apivm-6:80 check maxconn 200
server myapp_vm-7 myapp_apivm-7:80 check maxconn 200
server myapp_vm-8 myapp_apivm-8:80 check maxconn 200
server myapp_vm-9 myapp_apivm-9:80 check maxconn 200
server myapp_vm-10 myapp_apivm-10:80 check maxconn 200
server myapp_vm-11 myapp_apivm-11:80 check maxconn 200
server myapp_vm-12 myapp_apivm-12:80 check maxconn 200
server myapp_vm-13 myapp_apivm-13:80 check maxconn 200
server myapp_vm-14 myapp_apivm-14:80 check maxconn 200
server myapp_vm-15 myapp_apivm-15:80 check maxconn 200
server myapp_vm-16 myapp_apivm-16:80 check maxconn 200
server myapp_vm-17 myapp_apivm-17:80 check maxconn 200
server myapp_vm-18 myapp_apivm-18:80 check maxconn 200
server myapp_vm-19 myapp_apivm-19:80 check maxconn 200
Вы, вероятно, используете значение по умолчанию (рассчитанное или скомпилированное) maxconn предел.
Вы не сказали, какую версию используете, поэтому я предполагаю, что 1.6 (текущая стабильная)
Вы можете установить это как на интерфейсе, так и на сервере. Кроме того, вам может потребоваться настроить параметры sysctl дескриптора файла.