K8s 中微服务利用率低的性能问题(对开发和 DevOps 也有影响)

Performance issue with low microservice utilization in K8s (impact to development and devops also)

提问人:JIST 提问时间:10/30/2023 最后编辑:JIST 更新时间:10/31/2023 访问量:113

问:

当我设计微服务并部署到 K8s 时,我发现我无法为我的微服务获得更高的利用率(最大利用率仅为 0.1-0.3 CPU)。你有最佳实践吗,我们如何提高微服务 CPU 利用率?

让我描述一下 LAB 环境:

  • 具有 5 个节点的 K8s
    • 每个节点具有 14 个 CPU 和 128 GB RAM(节点在具有 VMWare 的虚拟机上构建)
    • 带有 nginx 的 K8s 设置了完整日志等。
  • 微服务
    • 在 python 语言中(在一个进程中处理的 GIL 限制,这意味着最多 1 个 CPU 利用率)
    • 我用了三个豆荚
    • 接口 REST 请求/响应(无需添加 I/O 操作)
    • 每次调用的处理时间为 ~100 毫秒

我们进行了性能测试,您可以看到以下输出:

  • 微服务利用率:每个 Pod 中最大 0.1-0.3 个 CPU

我预计问题是,K8s 管理(路由、日志等)会产生更高的源代码利用率,并且无法为我们的微服务的利用提供高吞吐量。我认为,提高微服务利用率的最佳实践可以是:

1] 增加豆荚数量

  • 优点,我们将获得更高的微服务利用率,但每个 K8s 节点的 Pod 数量有限
  • 缺点,每个 Pod 的微服务利用率仍然相同

2] 使用微批处理

  • 优点,我们可以支持捆绑调用(例如每 1 秒、2 秒),在这种情况下,微服务端的处理时间会更高
  • 缺点,我们将增加处理时间,因为捆绑(不是实时处理的理想场景)

3] K8s 更改日志级别

  • 优点,我们可以降低nginx中的日志级别,...到错误
  • 缺点,详细问题跟踪可能存在问题

4] 将 K8s 节点与物理硬件(非 VMware)配合使用

  • 优点,性能更好
  • 缺点,此更改可能会产生额外的成本(新硬件)和维护

您是否在 k8s 中使用了其他最佳实践和高微服务利用率的想法(我的目标是为这个 python 代码获得每个 pod 0.8-1 个 CPU)?

Python 性能 微服务 实时

评论

0赞 dankal444 10/30/2023
你有没有考虑过在 devops.stackexchange.com 上问这个问题?似乎您的问题与 K8 的关系比编码本身更相关(我猜是出于这个原因,有人已经投票关闭了这个问题)
0赞 JIST 10/30/2023
@dankal444,好点,我认为这与发展有关也见2。批处理(批量数据)或其他影响开发的活动。注意:我在标题中提到它也会影响开发和 DevOps。

答:

2赞 Cosmin Ioniță 10/31/2023 #1

性能测试是一个非常复杂的话题,在构建测试设置时需要很高的精度,并且需要对所有建筑部件有扎实的知识,因为很容易把事情搞砸(我做过很多次)。

我这边的几个想法:

  • 如果您在配置了 1 个以上 CPU 的 Pod 上运行单线程应用程序,则永远不会在 Pod 级别看到高 CPU 使用率。
  • 即使运行具有大量 I/O 密集型工作负载(例如大量外部 HTTP 调用)的多线程应用,您仍然不会看到高 CPU 使用率,因为线程大部分时间都处于不可运行状态。
  • Kubernetes 管理工作流确实有一些开销,在查看集群级别(甚至节点级别)指标时可以观察到,但 Pod 级别的指标与您的应用程序(尤其是 CPU 使用率)完全相关。

因此,要查看 Pod 级别的高 CPU 使用率,您可以执行以下 2 项操作:

  • 使用配置了 1 个 CPU 的 Pod 运行单线程应用(执行 CPU 密集型任务)
  • 如果您有一个多线程应用,则 Pod CPU 内核应与应用中的线程数相同(当然,应用工作负载应受 CPU 限制),以获得最大 CPU 使用率。

评论

0赞 JIST 10/31/2023
因此,微服务仅使用 CPU(不添加 I/O,仅使用 REST 请求/响应),并且由于 Python,单进程和多线程处理是可能的。
0赞 Cosmin Ioniță 10/31/2023
您的应用在收到的每个请求上执行什么?
0赞 JIST 10/31/2023
只计算分数(在内存计算加决策树中),自己的计算速度非常快(~100ms)。
0赞 Cosmin Ioniță 10/31/2023
明白了,所以它应该是一个 CPU 密集型工作负载。如果您认为有帮助,请接受我的回答。谢谢!