提问人:JIST 提问时间:10/30/2023 最后编辑:JIST 更新时间:10/31/2023 访问量:113
K8s 中微服务利用率低的性能问题(对开发和 DevOps 也有影响)
Performance issue with low microservice utilization in K8s (impact to development and devops also)
问:
当我设计微服务并部署到 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)?
答:
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 密集型工作负载。如果您认为有帮助,请接受我的回答。谢谢!
评论