Почему я не вижу более высоких одновременных запросов при увеличении количества узлов/модулей в простом док-кластере NGINX?

Пытаясь настроить высокодоступный веб-сервер, я провел нагрузочный тест для очень простого контейнера докеров NGINX, обслуживающего один статический файл.

Сначала я попытался с одним узлом (n1-standard-4) и кластером с одним модулем, чтобы оценить, сколько может сделать один «модуль». Эта установка с одним узлом/модулем может справиться с примерно 20 000 одновременных запросов, прежде чем начнется тайм-аут для некоторых запросов/падения пропускной способности.

Затем я добавил еще один узел того же типа машины и масштабировал модули до двух реплик. Как только я убедился, что оба модуля/узла работают, я снова запустил тест с 20k. Производительность была хорошей, поэтому я увеличил до 40 000 — ожидая, что я увижу результаты, аналогичные 20 000 на установке с 1 узлом / модулем.

Тем не менее, производительность была очень плохой, запросы в секунду резко не прыгали между 15k и 30k.

Я снова провел тот же тест с 4 узлами/модулями и увидел аналогичные, если не чуть худшие результаты.

Мой вопрос (ы):

  • Я ошибаюсь, думая, что мои одновременные запросы должны линейно масштабироваться таким образом с помощью GKE/containers/kubernetes?

  • Чего мне не хватает, чтобы достичь желаемых результатов, чтобы иметь возможность справляться с N одновременными пользователями с M узлами/модулями в кластере?

РЕДАКТИРОВАТЬ: я также не считаю, что это проблема с инструментом нагрузочного тестирования, поскольку я использую внешний платный сервис, который утверждает, что может имитировать до 100 тыс. одновременных запросов.

РЕДАКТИРОВАТЬ 2: вот еще немного информации о настройке:

Файл Docker:

FROM nginx

ADD nginx.conf /etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
ADD data.json /usr/share/nginx/html/data.json

nginx.conf:

user  nginx;
worker_processes  4;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  4096;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    access_log off;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;


    server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /usr/share/nginx/html;

        # Serve the index.html page
        location / {
            try_files /index.html =404;
        }
    }

    include /etc/nginx/conf.d/*.conf;
}

index.html:

<head><title>Load Test Page</title></head><body><h3>Load Test!</h3></body>

Я использовал службу «LoadBalancer», которая, как мне кажется, настраивает Google Cloud Balancer (я подтвердил это и увидел, что к нему добавляются узлы). Вот файлы ниже, которые я использовал с kubernetes для управления кластером.

rc.yml:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-rc
  labels:
    name: nginx-rc
spec:
  replicas: 2
  selector:
    name: nginx-server
  template:
    metadata:
      labels:
        name: nginx-server
      name: nginx-server
    spec:
      containers:
      - name: nginx-server
        image: [[ my image ]]
        ports:
        - containerPort: 80
          hostPort: 80

services.yml:

apiVersion: v1
kind: Service
metadata:
  labels:
    name: nginx-lb
  name: nginx-lb
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    name: nginx-server
  type: LoadBalancer

person Sam    schedule 23.06.2016    source источник
comment
Дайте нам еще немного, чтобы продолжить .. Можете ли вы предоставить ссылку на ваш файл докеров? Кроме того, как вы балансируете свою нагрузку? Кластеризация сильно зависит от хорошего метода балансировки нагрузки. Судя по вашим тегам, я предполагаю, что вы использовали kubernetes. Вы использовали балансировщик нагрузки? Видите ли вы трафик, идущий на оба узла?   -  person RoyB    schedule 23.06.2016
comment
Привет @RoyB - спасибо за комментарий. Я отредактировал вопрос, включив в него важные файлы (включая Dockerfile). Я действительно использовал сервис LoadBalancer с kubernetes, который создал Google Cloud Balancer, и я видел, как к нему добавляются узлы, однако я не проверял трафик напрямую ни на одном из узлов.   -  person Sam    schedule 23.06.2016
comment
Привет @Sam, может быть полезно проверить трафик на каждом узле. Это может помочь определить, является ли Google Cloud Balancer узким местом.   -  person caesarxuchao    schedule 23.06.2016


Ответы (1)


Если вы хотите запустить предварительно настроенный нагрузочный тест, вы можете ознакомиться с инструкциями для kubernetes. scale-demo, которая показывает, как обслуживать 1 миллион запросов в секунду статических файлов с помощью nginx, что очень похоже на вашу тестовую установку.

Также имейте в виду, что одна виртуальная машина (независимо от количества запущенных на ней модулей) будет иметь ограничение в сколько пропускной способности он может использовать и сколько пакетов в секунду может обрабатывать. Чтобы обслуживать большую нагрузку, следует создать виртуальную машину большего типа или добавить дополнительные виртуальные машины.

person Robert Bailey    schedule 23.06.2016