Как повысить производительность Google Load Balancer с помощью GKE через HTTPS?

Я перемещаю Heroku на Google Cloud Platform, и в настоящее время я использую кластер GKE с 3 узлами n1-highcpu-4 для тестирования настройки и моего приложения. Кластер был построен с использованием конфигурации по умолчанию (за исключением вытесняемых узлов On). Чтобы создать Ingres, LB (с балансировкой NEG) и использовать SSL-сертификат, управляемый Google, я внимательно следил за этими руководствами:

https://cloud.google.com/kubernetes-engine/docs/concepts/ingresshttps://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancerhttps://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing

Все работало безупречно, пока я не начал нагрузочное тестирование.

Наше веб-приложение собирает данные с датчиков, отправляемые им через HTTP(S) POST. Я использовал loader.io для тестирования, и этот кластер обрабатывал примерно 30 тысяч запросов в секунду с временем отклика менее 200 мс по HTTP. Однако, когда я переключился на HTTPS и повторил тестирование, производительность резко упала до менее 4 тыс. Запросов в секунду при времени отклика 1,7–4 секунды.

Пытался запустить больше подов, добавить новые узлы; отправить больше запросов в LB из loader.io; настроить таймауты активности / простоя; несколько настроек ядра, но ни одно из них не помогло преодолеть барьер 4k RPS. Даже замена приложения контейнером nginx и тестирование его статической страницы приветствия дало те же результаты.

Метрики Stackdriver GCLB показывают задержку внешнего интерфейса около 10 мс и задержку внутреннего интерфейса 8 с. Однако показатели моего приложения показывают, что запросы обычно занимают от 20 мс до 700 мсек.

ingress.yml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: collector-non-prod
  annotations:
    kubernetes.io/ingress.global-static-ip-name: non-prod-cluster-ip
#    kubernetes.io/ingress.allow-http: "true"
    networking.gke.io/managed-certificates: "collector-dev,collector-staging"
spec:
  rules:
    - host: events-dev.xxx.dev
      http:
        paths:
          - backend:
              serviceName: collector-dev
              servicePort: 80
    - host: events-staging.xxx.dev
      http:
        paths:
          - backend:
              serviceName: collector-staging
              servicePort: 80

service.yml

apiVersion: v1
kind: Service
metadata:
  name: collector-dev
  labels:
    environment: dev
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
    beta.cloud.google.com/backend-config: '{"ports": {"80":"backend-config-non-prod"}}'
spec:
  type: NodePort
  selector:
    app: collector
    environment: dev
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

backend-config.yml просто это:

apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: backend-config-non-prod
spec:
  timeoutSec: 60
  connectionDraining:
    drainingTimeoutSec: 60

Я был бы очень признателен за любые рекомендации по повышению производительности HTTPS и уменьшению задержки запросов или за помощь в дальнейших исследованиях. Я застрял в данный момент:(Спасибо!

0 ответов

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