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

标签 python performance microservices real-time

当我设计微服务并部署到 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/

相关文章:

python - 无法在我的 index.html 文件中调用服务; Django 错误

python - 如何从 Linux 上当前运行的 Python 进程访问数据结构?

python - 在 NumPy 数组中存储大于 64 位的整数

python - 非固定滚动窗口

Django 性能瓶颈

jquery - 使用 jquery 与普通 javascript 访问元素属性,哪个更快?

MySQL 查询速度连接

java - 微服务 - 如何使用授权服务器和资源服务器对注册流程进行建模?

java - 在 Spring Boot 服务中运行 H2 数据库多个实例

microservices - 如何使用异步请求/响应响应状态代码?