当我设计微服务并部署到K8时,我发现我的微服务(最大利用率仅为0.1-0.3个CPU).您是否有最佳实践,我们如何提高微服务CPU利用率?

让我来描述一下实验室环境:

  • 带5个 node 的K8
    • 每个 node 具有14个CPU和128 GB RAM( node 构建在安装了VMWare的虚拟机上)
    • 带nginx的K8,设置已满日志(log)等
  • 微服务
    • 在python语言中(在一个进程中处理的GIL限制,意思是最大.1个CPU利用率)
    • 我用了三个豆荚
    • 接口REST请求/响应(不增加I/O操作)
    • 每个调用的处理时间约为100ms

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

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

我预计问题是,K8管理(路由、日志(log)、…)产生更高的资源利用率,并且不能为我们的微服务的利用提供高吞吐量.我认为,提高微服务利用率的最佳做法可以是:

1] Increase amount of pods

  • 优点是,我们将获得更高的微服务利用率,但每个K8S node 的Pod数量受到限制
  • 缺点是,每个Pod的微服务利用率仍将保持不变

2] Use micro batch processing

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

3] K8s change log level

  • 专业人士,我们可以降低ngix、…中的日志(log)级别go 犯错
  • 缺点,详细问题跟踪可能存在的问题

4] Use K8s nodes with physical HW (not VMware)

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

您是否使用了其他最佳实践,即在K8中实现高微服务利用率的 idea (我的目标是为这段Python代码的每个Pod获得0.8-1个CPU)?

推荐答案

性能测试是一个非常复杂的主题,它需要在构建测试设置时非常精确,并且对所有构建部分都有扎实的知识,因为它很容易搞砸(我已经做过很多次了).

我有几个 idea :

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

因此,要查看Pod级别的高CPU使用率,您可以做两件事:

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

Python相关问答推荐

决策树分类器的基础sklearn熵和log_loss标准是否有差异?

一切似乎都可以自己工作,但当我把它放在一起时,它会抛出RegexMatch错误

为什么图像结果翻转了90度?

使用unmanagedexports从Python调用的c#DLC

只需使用Python在图像中保留 colored颜色 范围区域

在Python中添加期货之间的延迟

如何使用scikit-learn Python库中的Agglomerative集群算法以及集群中声明的对象数量?

尽管进程输出错误消息,subProcess.check_call的CalledProcess错误.stderr为无

sys.modulesgo 哪儿了?

inspect_asm不给出输出

剧作家Python没有得到回应

Pandas 在最近的日期合并,考虑到破产

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

将数据框架与导入的Excel文件一起使用

如何找到满足各组口罩条件的第一行?

使用Python更新字典中的值

pandas:排序多级列

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

Polars asof在下一个可用日期加入

旋转多边形而不改变内部空间关系