1

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

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

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

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

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

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

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

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

EDIT: Я также не считаю, что это проблема с инструментом для тестирования нагрузки - как я с помощью внешней платной услуги, которая утверждает, чтобы иметь возможность моделировать до 100k одновременных запросов.

EDIT 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 (я подтвердил это и увидел, что к нему добавлены узлы). Ниже приведены файлы ниже, которые я использовал с кубернетами для управления кластером.

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 

услуги.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 
+0

Дайте нам еще кое-что, чтобы продолжить .. Можете ли вы предоставить ссылку на свой файл докеров? Кроме того, как вы балансируете свою нагрузку? Кластеризация сильно зависит от хорошего метода балансировки нагрузки. Из ваших тегов Я собираюсь предположить, что вы использовали кубернете. Вы использовали loadbalancer? Вы видите движение, идущее на оба узла? – RoyB

+0

Привет, @RoyB - спасибо за комментарий. Я редактировал вопрос, чтобы включить важные файлы (включая Dockerfile). Я действительно использовал службу LoadBalancer с кубернетами, которые создали Google Cloud Balancer, и я видел, что к ним добавлены узлы, однако я не проверял трафик непосредственно на любом из узлов. – Sam

+0

Привет @Sam, проверка трафика на каждом узле может быть полезна. Это может помочь определить, является ли Cloud Cloud Balancer узким местом. – caesarxuchao

ответ

1

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

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