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,一经查实,立即删除!

相关文章

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

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

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

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

ollama,springAi实现自然语言处理

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

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

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

tkinter显示图片

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

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

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

【论文通读】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…

Redis-分布式锁(基本原理和不同实现方式对比)

文章目录 1、基本原理2、不同实现方式 1、基本原理 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行&am…

Firewalld 概述

1.firewalld简介 firewalld的作用是为包过滤机制提供匹配规则(或称为策略),通过各种不同的规则,告诉 netfiter对来自指定源、前往指定目的或具有某些协议特征的数据包采取何种处理方式。 为了更加方便地组织和管理防火墙,firewalld 提供了支持网络区域…

以太网基础知识

文章目录 一、以太网(Ethernet)介绍二、协议介绍三、什么是PHY?1.标准接口协议:2.寄存器配置:3.自动协商: 四、时序4.1RGMII接口时序4.1.1 对其模式4.1.2 延时模式(常用) 4.2MDIO接口…

WEB01MySQL安装和数据库

第一天、WEB课程 web课程主要讲三部分内容 数据库 数据库介绍 什么是数据库 数据存储的仓库,其本质也是一个文件系统 数据库会按照特定的格式对数据进行存储,用户可以对数据库中的数据进行增加,修改,删除及查询操作。 数据库…

2024/6/30 英语每日一段

Years of economic and political turbulence have brought stagnation.“In a world where there is more risk and uncertainty, people become reluctant to voluntarily move jobs and find better jobs,” says Manning. At the same time, businesses have cut back on i…

企业互联网建站源码系统 附带完整的安装代码包以及搭建部署教程

系统概述 企业互联网建站源码吸系统是一款集众多先进功能于一身的建站工具。它提供了丰富的模板和组件,允许企业根据自身需求和品牌形象进行个性化定制,快速搭建出具有独特风格的网站。 代码示例 系统特色功能一览 1.用户友好界面:系统采用…