Почему я не могу масштабировать горизонтально простую службу HTTP / 2 в Kubernetes? - PullRequest
0 голосов
/ 13 февраля 2019

Я развернул несколько простых сервисов в качестве подтверждения концепции: веб-сервер nginx с исправлением https://stackoverflow.com/a/8217856/735231 для высокой производительности.

Я также отредактировал /etc/nginx/conf.d/default.conf, чтобы строка listen 80;становится listen 80 http2;.

Я использую инструмент распределенного нагрузочного тестирования Locust с классом, который меняет модуль requests на hyper для тестирования рабочих нагрузок HTTP / 2.Это не может быть оптимальным с точки зрения производительности, но я могу порождать многих саранчовых, поэтому это не большая проблема.

Для тестирования я создал кластер на GKE из 5 машин, 2 vCPU, 4 ГБ ОЗУ каждая, установил Helm и графики этих сервисов (я могу опубликовать их в гисте позже, если это будет полезно).

Я протестировал Locust с min_time = 0 и max_time = 0, чтобы он порождал как можно больше запросов;с 10 работниками против одного экземпляра nginx.

С 10 работниками, всего 140 "клиентов", я получаю ~ 2,1 тыс. запросов в секунду (RPS).

10 workers, 260 clients: I get ~2.0k RPS
10 workers, 400 clients: ~2.0k RPS

Теперь я пытаюсьмасштабировать по горизонтали: я порождаю 5 экземпляров nginx и получаю:

10 workers, 140 clients: ~2.1k RPS
10 workers, 280 clients: ~2.1k RPS
20 workers, 140 clients: ~1.7k RPS
20 workers, 280 clients: ~1.9k RPS
20 workers, 400 clients: ~1.9k RPS

Использование ресурсов довольно низкое, как показано kubectl top pod (это для 10 работников, 280 клиентов; nginx не ограничен в ресурсах,рабочие саранчи ограничены одним ЦП на модуль):

user@cloudshell:~ (project)$ kubectl top pod
NAME                           CPU(cores)   MEMORY(bytes)
h2test-nginx-cc4d4c69f-4j267   34m          68Mi
h2test-nginx-cc4d4c69f-4t6k7   27m          68Mi
h2test-nginx-cc4d4c69f-l942r   30m          69Mi
h2test-nginx-cc4d4c69f-mfxf8   32m          68Mi
h2test-nginx-cc4d4c69f-p2jgs   45m          68Mi
lt-master-5f495d866c-k9tw2     3m           26Mi
lt-worker-6d8d87d6f6-cjldn     524m         32Mi
lt-worker-6d8d87d6f6-hcchj     518m         33Mi
lt-worker-6d8d87d6f6-hnq7l     500m         33Mi
lt-worker-6d8d87d6f6-kf9lj     403m         33Mi
lt-worker-6d8d87d6f6-kh7wt     438m         33Mi
lt-worker-6d8d87d6f6-lvt6j     559m         33Mi
lt-worker-6d8d87d6f6-sxxxm     503m         34Mi
lt-worker-6d8d87d6f6-xhmbj     500m         33Mi
lt-worker-6d8d87d6f6-zbq9v     431m         32Mi
lt-worker-6d8d87d6f6-zr85c     480m         33Mi

Я изобразил этот тест на GKE для упрощения репликации, но я получил те же результаты в кластере частного облака.

Почему кажется, что не имеет значения, сколько экземпляров я порождаю для службы?

ОБНОВЛЕНИЕ : Согласно первому ответу, я обновляю информацию информацией об узлах ио том, что происходит с одним рабочим из саранчи.

1 worker, 1 clients: 22 RPS
1 worker, 2 clients: 45 RPS
1 worker, 4 clients: 90 RPS
1 worker, 8 clients: 174 RPS
1 worker, 16 clients: 360 RPS
32 clients: 490 RPS
40 clients: 480 RPS (this seems over max. sustainable clients per worker)

Но, прежде всего, кажется, что основная проблема заключается в том, что я нахожусь на пределе возможностей:

user@cloudshell:~ (project)$ kubectl top pod
NAME                                 CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%
gke-sc1-default-pool-cbbb35bb-0mk4   1903m        98%       695Mi           24%
gke-sc1-default-pool-cbbb35bb-9zgl   2017m        104%      727Mi           25%
gke-sc1-default-pool-cbbb35bb-b02k   1991m        103%      854Mi           30%
gke-sc1-default-pool-cbbb35bb-mmcs   2014m        104%      776Mi           27%
gke-sc1-default-pool-cbbb35bb-t6ch   1109m        57%       743Mi           26%

1 Ответ

0 голосов
/ 13 февраля 2019

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

Для указанных вами значений ясно видно, что работники потребляют больше ресурсов ЦП, чем серверы nginx.

Вы должны проверить либо:

  • Загрузка ЦП хоста, это может быть под высоким давлением с переключениями контекста, потому что количество потоков намного больше, чем число доступных ЦП.
  • Узкое место в сети, возможно, вы можете попытаться добавить больше узлов или увеличить рабочую емкость (SKU) и разделить клиента от серверов.
  • У клиентов недостаточно емкости для создания нагрузки, вы увеличиваетепотоки, но исходные ограничения одинаковы.

Необходимо также проверить емкость отдельного сервера, чтобы проверить ограничение каждого сервера, поэтому у вас есть параметр для сравнения, если результаты соответствуют ожидаемым значениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...