为什么我不能在Kubernetes上水平扩展简单的HTTP / 2服务?

西西斯

我已经部署了一些简单的服务作为概念验证:装有https://stackoverflow.com/a/8217856/735231的nginx Web服务器,以实现高性能。

我还进行了编辑/etc/nginx/conf.d/default.conf,使行listen 80;变为listen 80 http2;

我正在使用Locust分布式负载测试工具,该类具有交换requests模块hyper以测试HTTP / 2工作负载的类。就性能而言,这可能不是最佳选择,但是我可以催生许多蝗虫工人,因此这不是一个大问题。

为了进行测试,我在5台计算机的GKE上生成了一个集群,每个集群2个vCPU,4GB RAM,安装了Helm以及这些服务的图表(如果有用,我可以稍后将它们发布在要点上)。

我用min_time = 0和max_time = 0测试了Locust,以便产生尽可能多的请求。一个nginx实例有10个工人。

拥有10个工作人员,总共140个“客户”,我每秒收到约2.1k个请求(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不受资源限制,蝗虫工人每个pod只能使用1个CPU):

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%
迭戈·门德斯

如果我理解正确,那么您确实在与Pod相同的群集/节点上运行了负载测试,这肯定会对总体结果产生影响,我建议您将客户端与服务器分开放置在单独的节点上,以免影响彼此。

对于您报告的值,可以清楚地看到工作人员正在消耗比nginx服务器更多的CPU。

您应该检查:

  • 主机CPU的使用情况,上下文切换可能会承受很高的压力,因为线程数量远远大于可用的CPU数量。
  • 网络瓶颈,也许您可​​以尝试添加更多节点或增加工作人员容量(SKU)并将客户端与服务器分离。
  • 客户端没有足够的容量来生成负载,您增加了线程,但原始限制是相同的

您还应该测试单个服务器的容量以验证每个服务器的限制,因此,如果结果与预期值一致,则可以使用一个参数进行比较。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能在@NgModule 中导入 Angular 2 服务?

为什么不能在节点/ RPM中全局使用http服务器?

为什么我不能在nodeJS服务器上接收文件?

为什么我的实时服务器不能在Visual Studio代码中工作?

为什么我不能在 C# 中调用 web 服务?

为什么 Unity (DI) 可以在 Controller 中工作,而不能在我的服务层中工作?

为什么我不能在Backrill服务中的Cyrillic中插入基础文本?

为什么我的图像隐藏了 h2?为什么导航不能水平渲染?

为什么heroku不能在没有HTTP服务器的情况下运行WebSocket服务器?

为什么FreeRADIUS服务不能在Centos上使用?

为什么我不能让Apache2从/ var / www以外的目录提供站点服务?

Angular2简单的Http服务注入

为什么我不能通过其IP访问Kubernetes服务?

Kubernetes / Azure ACS:为什么我不能访问服务的外部IP?

为什么我不能在Dart 2中使用通用类型作为参数?

为什么我不能在Unity ShaderLab的循环内使用tex2D?

为什么我不能在 ggplot2 中绘制平滑曲线

为什么我不能在angular 2组件中加载google map?

为什么我不能在Angular 2中用方括号表示法定义变量

为什么我不能在tensorflow中导入tfprof_log_pb2?

为什么我的线宽不能在2D Forge Viewer中显示?

为什么我不能在render方法中使用2个JSX标签?

yii2为什么我不能在数据库中存储数据?

为什么我不能在远程ssh服务器主机的默认`$ DISPLAY`上启动GUI程序?

为什么我不能在这个 Angular 9 应用程序中将变量从组件传递到服务?

为什么我不能在Debian Wheezy服务器上获取带有默认cron的文件?

为什么我不能在Windows Server 2008中使用system()从服务启动批处理文件?

为什么我不能在同一个 Go 项目中启动两台服务器?

为什么不能叫这个简单的网络服务?