当我设计微服务并部署到 K8s 时,我发现我无法获得更高的微服务利用率(最大利用率仅为 0.1-0.3 个 CPU)。您有最佳实践吗?我们如何提高微服务 CPU 利用率?
让我描述一下实验室环境:
- 具有 5 个节点的 K8
- 每个节点配备 14 个 CPU 和 128 GB RAM(节点构建在使用 VMWare 的虚拟机上)
- K8s 与 nginx 并设置完整日志等
- 微服务
- 在Python语言中(单个进程中处理的GIL限制,意味着最多1个CPU利用率)
- 我用了三个 Pod
- 接口(interface)REST请求/响应(无需额外的I/O操作)
- 每次调用的处理时间约为 100 毫秒
我们进行了性能测试,您可以看到这些输出:
- 微服务利用率最大值每个 Pod 中 0.1-0.3 个 CPU
我预计问题是,K8s 管理(路由、日志等)会产生更高的资源利用率,但无法为我们的微服务的利用提供高吞吐量。我认为,提高微服务利用率的最佳实践可以是:
1]增加 Pod 数量
- 优点,我们将获得更高的微服务利用率,但每个 K8s 节点的 Pod 数量受到限制
- 缺点,每个 Pod 的微服务利用率仍然相同
2]使用微批处理
- 优点,我们可以支持调用捆绑(例如每一秒、两秒),在这种情况下,微服务端的处理时间会更长
- 缺点,我们会增加处理时间,因为捆绑(不是实时处理的理想场景)
3]K8s更改日志级别
- 优点,我们可以降低 nginx 中的日志级别,...到错误
- 缺点,详细问题跟踪可能存在问题
4] 将 K8s 节点与物理硬件(而非 VMware)结合使用
- 优点,性能更好
- 缺点,此更改可能会产生额外成本(新硬件)和维护成本
您是否使用其他最佳实践、想法在 k8s 中实现高微服务利用率(我的目标是为该 Python 代码让每个 pod 获得 0.8-1 个 CPU)?
最佳答案
性能测试是一个非常复杂的主题,在构建测试设置时需要非常精确,并且需要对所有构建部分有扎实的知识,因为很容易把事情搞砸(我做了很多次)。
我的一些想法:
- 如果您在配置了 1 个以上 CPU 的 Pod 上运行单线程应用,那么您将永远不会在 Pod 级别看到较高的 CPU 使用率。
- 即使您运行的多线程应用程序具有繁重的 I/O 密集型工作负载(例如大量外部 HTTP 调用),您仍然不会看到高 CPU 使用率,因为线程将是大部分处于不可运行状态的时间。
- Kubernetes 管理工作流程确实存在一些开销,在查看集群级(甚至节点级)指标时可以观察到这些开销,但 Pod 级指标与您的应用程序(尤其是 CPU 使用率)完全相关。
因此,要查看 Pod 级别的高 CPU 使用率,您可以执行以下两件事:
- 使用配置有 1 个 CPU 的 Pod 运行单线程应用(执行 CPU 密集型任务)
- 如果您有一个多线程应用程序,Pod CPU 核心数应与应用程序中的线程数相同(当然,应用程序工作负载应受 CPU 限制),以获得最大 CPU 使用率。
关于python - K8s 中微服务利用率低的性能问题(也对开发和 DevOps 产生影响),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77387280/