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

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

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

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

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

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

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

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

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

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

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

Dockerfile:

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

1 ответ

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

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

Другие вопросы по тегам