Evented PLEG: iSulad 稳态 CPU 利用率降低30%的关键特性

背景

容器技术在不断发展的过程中,已被广泛应用于多种场景。OpenAtom openEuler(简称"openEuler") 社区容器引擎项目 iSulad[1]面向 CT、IT 领域的不同需求而生,它具有轻量级、高性能的特点,可以在资源受限的环境中运行,如边缘计算和 IoT 场景,并始终在提高容器运行效率、降低容器运行底噪开销等问题上进行着不断地尝试与 探索。iSulad 向北支持 CRI 接口,对接 Kubernetes,并始终紧跟上游社区,提供最新的生态支持。在 openEuler 23.09中,iSulad 引入 Sandbox 语义[2]用于支持 Kuasar,用户能够使用 Sandbox API 管理沙箱,将沙箱管理与容器管理解耦,简化调用链,提高了容器引擎的性能和稳定性。基于 Sandbox API,在 open Euler 24.03 LTS 中,iSulad 开始提供对普通容器 CRI V1 接口的支持,并将 CRI 接口更新至1.29[3],为 iSulad 的性能提升提供了新的优化空间,而其中性能提升的关键特性就在于 EventedPLEG。

Pod 生命周期管理事件

概述

Kubelet 作为每个节点的守护进程,在管理节点中的 Pod 时,需要获取所有容器的最新状态, PLEG(Pod Lifecycle Event Generator)负责为 Kubelet 生成容器运行时的 Pod 生命周期事件,从而执行相应控制逻辑并驱动 Pod 状态以匹配 Pod 规格。

Generic PLEG

Kubelet 在1.26之前,会通过 Generic PLEG 定期查询容器运行时,调用 CRI 的 ListPodSandbox 和 ListContainers 接口,获取 Pod 和容器的信息,更新到缓存中,并组装成事件发送至 Kubelt 的 PLEG Channel。

然而随着 Pod 和容器数量的不断增加,轮询会产生不可忽略的开销,定期、并发、大量的请求会造成 CPU 利用率飙升,影响性能,并且可能会导致容器运行时不堪重负从而带来可靠性问题。

Evented PLEG

为减少稳态状态下轮询造成的开销,KEP-3386[4]提出 Evented PLEG,Kubelet 通过监听来自 CRI 实现的 gRPC 服务器流事件,试图减少容器在没有规格、状态变化时的不必要轮询工作。通过减少对容器状态的频繁轮询,降低 Kubelet、容器运行时稳态状态下的 CPU 利用率。

Evented PLEG 特性

社区方案

service RuntimeService {    ...    // GetContainerEvents gets container events from the CRI runtime    rpc GetContainerEvents(GetEventsRequest) returns (stream ContainerEventResponse) {}}
message GetEventsRequest {}
message ContainerEventResponse {    // ID of the container    string container_id = 1;    // Type of the container event    ContainerEventType container_event_type = 2;    // Creation timestamp of this event    int64 created_at = 3;    // Sandbox status    PodSandboxStatus pod_sandbox_status = 4;    // Container statuses    repeated ContainerStatus containers_statuses = 5;}
enum ContainerEventType {    // Container created    CONTAINER_CREATED_EVENT = 0;    // Container started    CONTAINER_STARTED_EVENT = 1;    // Container stopped    CONTAINER_STOPPED_EVENT = 2;    // Container deleted    CONTAINER_DELETED_EVENT = 3;}

来源于github 社区[3]

为减少稳态状态下轮询造成的开销,Kubernets 新增如上所述的 CRI 接口,通过 GetContainerEvents 作为与 CRI 运行时的长连接,Kubelet 能够监听来自 CRI 实现的 gRPC 服务器流事件,CRI 运行时从而能够提供一种当容器状态发生改变时通知 Kubelet 的方式。

Kubelet 获取容器状态发生变化时的事件,对应 ContainerEventType 定义的四种类型:

  • 容器创建
  • 容器启动
  • 容器停止
  • 容器删除

生成的事件中包含了对应事件类型、容器 ID、事件发生时间戳、容器所对应的 Pod 状态 PodSandboxStatus 和 Pod 中所包含所有的容器状态的 ContainerStatus。

Kubelet Evented PLEG 机制

Evented PLEG 能够减少稳态情况(没有容器规格、状态变化)下的轮询频率,而不主张完全去除轮询,原因在于 gRPC 连接错误等异常情况可能造成事件的缺失。

Evented PLEG 开启后,Kubeltet 的 Pod 状态来源有两个,通过列举实现的 Generic PLEG 和通过事件流实现的 Evented PLEG。

为防止 Generic PLEG 与 Evented PLEG 状态信息的竞争,开启 Evented PLEG 后,Generic PLEG 应该依赖 CRI 接口 PodSandboxStatus 直接获取 Pod 状态信息,Generic PLEG 和 Evented PLEG 获取的 Pod 状态的时间戳信息应该来自 CRI 运行时,从而能够更加接近实际的 Pod 状态的真实时间。

如图所示,Kubelet 从而能够根据时间戳信息确定最新的 Pod 状态并缓存,防止旧的 Pod 状态缓存覆盖新的状态信息。

图片

图1 Kubelet Modified Cache Setter

iSulad 实现与效果

iSulad 的 Evented PLEG 实现采用了发布者-订阅者模式,每一次 CRI rpc 接口 GetContainerEvents 的调用作为一个订阅者,该接口调用可以来自 Kubelet 或者 crictl 调试工具,当 iSulad 监控到 Pod、容器 生命周期的变化时,会生成对应的事件广播至所有的订阅者。

图片

图2 iSulad Evented PLEG 设计图

在实现上 iSulad 新增 mailbox 模块,提供发布者-订阅者模式支持。每一个 GetContainerEvents CRI rpc 接口调用会通过 mailbox_subscribe 函数进行事件订阅,在容器或者 Pod 生命周期状态发生变化 时,iSulad的 sandbox 模块和容器运行时模块调用 maibox_publish,生成对应的 CRI Container Event,添加至 mailbox 模块中的消息队列中,最终由该消息队列广播至所有的订阅者,订阅者从而将收到的消息发送至 Kubelet 或 crictl 调试工具。

下表给出了开启 Evented PLEG 后 iSulad 和 Kubelet 在不同 busybox 容器数目下稳态 CPU 利用率所减少的值,可以看到稳态情况下为 iSulad 平均带来30%左右的性能提升,为 Kubelet 带来10%左右的 性能提升。

busybox 容器数iSuladKubelet
1030.5%11.0%
5027.5%10.4%
10028.5%10.1%

表1 iSulad、Kubelet Evented PLEG 性能提升

总结

此次 CRI V1 的升级为 iSulad 引进了上游社区最新的特性,同时还为 iSulad 稳态情况下带来了30%左右的性能提升。iSulad 在演进过程中始终紧跟上游生态,提供最新的社区支持,并且不断在提高容器运行效率、降低容器运行底噪开销等问题上探索新的方向。

文中所述的特性支持,由 iSulad SIG 参与,相关源码均已在 openEuler 社区开源。如果您对相关技术感兴趣,欢迎您的围观和加入。您可以添加小助手微信,加入对应 SIG 微信群。您可以添加小助手微信,加入对应 SIG 微信群。

图片

参考

[1] iSulad,https://gitee.com/openeuler/iSulad

[2] iSulad Sandbox API:简化调用链,可靠性倍增, https://mp.weixin.qq.com/s?__biz=MzkyMjYzN jU0Ng==&mid=2247507591&idx=1&sn=267e5ec03dfbc311e76b882cd458ea29&source=41#wech at_redirect

[3] CRI v1.29,https://github.com/kubernetes/cri-api/tree/kubernetes-1.29.0

[4] KEP-3386: Kubelet Evented PLEG for Better Performance,https://github.com/kubernetes/enh ancements/blob/master/keps/sig-node/3386-kubelet-evented-pleg/README.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C++11] noexcept 完整解析

说明:noexcept是C11标准引入的一个关键字,用于指示一个函数是否被保证不会抛出异常。如果但从设计角度看会感觉很奇怪,明明是有问题才抛出异常,那为什么还是在某些时候禁止抛异常呢?接下来我们了解下C11 为什么引入了 …

高性能LDO电路设计,有配套文档

内容: 1、电路文件(有仿真状态)和PDK(TSMC180) 2、配套仿真结果文档讲解6页 3、参考资料三篇 指标: LDO 温度系数1.09ppm LDO 环路增益在 64.3dB,相位裕度在 66,系统稳定。 LDO 最大…

【问题】升级指定conda虚拟环境的python到指定版本

1 背景 当前conda环境的名字为python38,进入环境python38命令如下: conda activate python38 2 升级python到3.10版本 conda install python=3.10 3 查看python版本 conda list -n python38 python

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术,允许组件之间进行松耦合通信。通过使用事件监听机制,应用程序的各个组件可以在其他组件不直接引用的情况下,相互发送和接受消息。 需求 在技术派中有这样一个需求,当发布文章或…

Linux驱动入门-最简单字符设备驱动

一、字符设备驱动概念 1. 什么是字符设备驱动? 字符设备是 Linux 驱动中最基本的一类设备驱动,按字节流进行读写操作,数据读写有先后顺序。常见的字符设备包括LED灯、按键、IIC、SPI、LCD等。字符设备驱动就是为这些设备编写的驱动程序。 …

ollama,springAi实现自然语言处理

ollama安装使用: https://ollama.com/ 下载速度比较慢的可以直接使用以下版本0.1.41 https://pan.baidu.com/s/1hCCkYvFjWqxvPyYA2-YElA?pwdotap 直接管理员身份双击安装,安装成功后会在任务栏里出现这个小图标: 打开cmd,输入…

java实现图像分割合并

Java实现图片操作:切割、缩放、重置、拼接、合并、水印、画单点、画线段等_java拼接图片并截掉一部分-CSDN博客

WhatsApp:连接世界的即时通讯巨头

在数字化浪潮席卷全球的今天,即时通讯工具已成为人们日常生活中不可或缺的一部分。其中,WhatsApp凭借其卓越的功能、出色的用户体验和广泛的用户基础,在全球通讯领域崭露头角,成为连接世界的即时通讯巨头。今天将带您深入了解What…

tkinter显示图片

tkinter显示图片 效果代码解析打开和显示图像 代码 效果 代码解析 打开和显示图像 def open_image():file_path filedialog.askopenfilename(title"选择图片", filetypes(("PNG文件", "*.png"), ("JPEG文件", "*.jpg;*.jpeg&q…

2024.7.1 刷题总结

2024.7.1 **每日一题** 2065.最大化一张图中的路径价值,本题可以从数据范围得到思路的参考,根据总最大时间和单个最小时间得到最多可以有十条边,即搜索树有11层,每个节点最多有4个儿子,可视为一棵层数至多为11的四叉树…

数据资产赋能企业决策:通过精准的数据分析和洞察,构建高效的数据资产解决方案,为企业提供决策支持,助力企业实现精准营销、风险管理、产品创新等目标,提升企业竞争力

一、引言 在信息化和数字化飞速发展的今天,数据已成为企业最宝贵的资产之一。数据资产不仅包含了企业的基本信息,还蕴含了丰富的市场趋势、消费者行为和潜在商机。如何通过精准的数据分析和洞察,构建高效的数据资产解决方案,为企…

【论文通读】GUI Action Narrator: Where and When Did That Action Take

GUI Action Narrator: Where and When Did That Action Take 前言AbstractMotivationSolutionAct2CapData CollectionMetrics MethodExperimentAblation StudyVisual Prompt SizeSpatial PromptTemporal Prompt Conclusion 前言 一篇GUI操作benchmark的工作,作者提…

tkinter实现进度条

tkinter实现进度条 效果代码解析导入需要的模块定义进度条 代码 效果 代码解析 导入需要的模块 import tkinter as tk from tkinter import ttk定义进度条 def start_progress():progress[value] 0max_value 100step 10for i in range(0, max_value, step):progress[valu…

Win11找不到组策略编辑器(gpedit.msc)解决

由于需要同时连接有线网络和无线网络,且重启后双网络都自动连接,因此需要配置组策略。 但是win11找不到组策略编辑器。 灵感来源:Win11找不到组策略编辑器(gpedit.msc)解决教程 - 知乎 (zhihu.com) 在Win11中&#…

国网协议电表采集方案

项目背景及需求项目地点:重庆港西光伏电站(中广核重庆)项目背景:光伏发电并网项目电能监控项目目的及难点:实现对EDMI协议电表(Mk6E)的数据采集,监控光伏发电有效性,做到…

项目管理九大口诀

有工作一定有目标 有目标一定有任务 有任务一定有计划 有计划一定有执行 有执行一定有监控 有监控一定有调整 有调整一定有结果 有结果一定有责任 有责任一定有奖惩 🩷有工作一定有目标 目标制定:SMART Specific(具体性)&#x…

# 职场生活之道:善于团结

在职场这个大舞台上,每个人都是演员,也是观众。要想在这个舞台上站稳脚跟,除了专业技能,更要学会如何与人相处,如何团结他人。团结,是职场生存的重要法则之一。 1. 主动团结:多一个朋友&#x…

《昇思25天学习打卡营第1天|基本介绍》

文章目录 前言:今日所学: 前言: 今天非常荣幸的收到了昇思25天学习打卡营的邀请。昇思MindSpore作为华为昇腾AI全栈的重要一员,他支持端、边、云独立的和协同的统一训练和推理框架,有着易于开发、执行效率高、全场景框…

客户满意度调查方法有哪些

用户满意度调查作为改进用户体验工作中重要的一项活动,可以帮助企业深入了解客户对产品服务各方面评价。有许多企业想开展客户满意度调查,但是在调查方式上不清楚该用那种方式?另外还要考虑预算,民安智库(公众满意度调…

Kotlin扩展函数(also apply run let)和with函数

also apply run let with的使用例子 private fun testOperator() {/*** also*/val person Person("ZhangSan", 18)person.also {// 通常仅仅打印使用, 也可以通过it修改it.name "ZhangSan1"println("also inner name: " it.name)}println(&qu…