非常欢迎大家来参加我们的赛选今天是最后一天的最后一场技术的情人非常高我先自我介绍一下我叫善石梅 我来自英特尔我是一位云云软件工程师目前从事的是云云生的这种资源方面的研究之前也做过弹性云 边云云IoT 还有OpenStack方面的开发和研究我们另外一位的研家者叫Kassie Zhang他是我们英特尔的高级首席架构师他主要从事的领域是高性能计算方面的解决方案但是有一些形成的原因所以Kassie这次没有办法参加这次演讲所以这次的主题主要是由我来为大家分享我今天跟大家讨论的一个主题就是填补Kassie的一个空白IoT资源的调度与隔离首先我介绍一下我们这次演讲的一个议程首先我会介绍一下我们为什么要做这个项目做这个项目的动机以及使用场景是怎么样的然后我会介绍一下IoT资源调度和隔离的一个软件站它具体是做了什么东西最后我们会结合一个测试的实验来验证一下就是启用了我们IoT调度和隔离的功能以后我们能做到达到一些什么的成果首先来讲一下动机要做资源隔离的动机应该蛮简单就是要提高资源的利用率因为在很多数据中心的话目前它的数据中心的资源利用率都是没有得到充分利用的根据Vertif对229位数据中心的专业人士的调查显示绝大多数的数据中心专业人士都期望在2025年能够把数据中心的资源利用率达到60%左右然后我们提高数据中心的资源利用率的好处也是非常明显的一方面就是能降低人工的成本就是运为的成本另外一方面就是降低硬件的成本还有就是降低碳排放但是提高资源利用率本身会带来一些问题比如说这里列出的一个净零干扰的问题就是说如果一个工作负载在一个工作节点上如果能够平稳运行但是如果多个工作负载在一个工作节点上同时运行的话会对某些资源造成一部分的影响就是说它们加起来的资源使用量的总和会超过这个工作负载的一个附和所以会对每个工作负载的性能都会造成一定的降低所以这是我们这个解决方案也要解决的一个问题先说一下我们的一个用户故事就是我们的使用场景在我们的使用场景里面我们的工作负载分为A和B两种A的工作负载的话它主要是需要IO资源保证的一类的工作负载通常在我们企业环境中这类工作负载就是对企业比较重要的对IO延迟敏感比较敏感的这种工作负载还有一个就是类型B类型B的话它对IO资源没有一些很实施性的要求作为集群管理员的话我希望保证我类型A的工作负载的IO资源同时我又希望我的集群能够根据我工作负载的类别还有IO资源的可用性来进行调度作为一个SV我希望我的工作负载能够根据我期望的一个IO的带宽或者IO的一个请求来评稳的运行我们这里可以先来看一下目前K8S支持的一些资源K8S目前支持的资源可以主要分为两种类型一种社区叫做first class的资源另外一种就是可扩展资源first class的资源在这个图里面主要是CPU内存和临时存储这三种资源可扩展资源的话它通常是跟Device Plugin一起来使用的就是通过Device Plugin或者是集群管理员来汇报在每个节点上面的可用的资源的数量它是以整形数量来发布的大业这一块其实它也是以扩展设备这种形式来发布的但因为它的类型比较特殊它的Key的类型比较特殊所以在代码里做了一些特殊的处理所以我这里也把它列为一种资源但对于IO资源比如说网络IO或者磁盘IO资源的还有缓存资源这一类的资源的话其实K8S是没有一个官方的解决方案的也没有一个很推荐的解决方案所以我们这个项目主要是在K8S的基础上添加了磁派IO和网络IO感知的调度和隔离的功能我们提供了一套端道端的解决方案来使云服提供商能够在同一台节点上能够跑更多的工作负载提高资源利用率同时我们也能保证在这个工作节点上关键应用的IO的性能我们可以先来看一下我们这个IO资源调度和隔离的一个软件站从上往下看的话可以看到最上面都是一些我们结极需要保护的一些应用就需要IO资源保护的一些应用比如说是一些AI推理的应用还有数据库相识队列和web server这些都是对延迟敏感要延迟比较敏感的然后在下面的这个控制面控制面这里的话我们会提供网络IO和磁盘IO感知的调度就是根据工作负载的QS类型以及集区内节点的IO可用性进行相应的调度在每个工作节点上我们会分为这些模块首先我们会对工作节点上的一些网络设备和磁盘设备做一些测量就是看一下他们的容量能力是多少以及会取一些预先人命配置的一些参数在这两个模块我们会监控和分析每一个工作负载实时的IO的使用量然后一旦发现在工作节点上有一些IO资源使用紧张的情况的话我们会根据这些预先定义的一些策略采取一定相应的措施同时我们为了更好地做资源的隔离我们也用到了一些高级的平台特性比如说像我们英特尔800系列网卡提供的ADQ功能ADQ它的全程是应用设备对列顾名思义它就是把特定的应用或者关键的应用提供专用通道这样子的话能更好地保证相应应用的网络IO的性能另外就是我们对磁盘IO这里我们会用到英特尔的IPU的设备IPU其实是一个可编程的网络设备它可以高速地管理网络和磁盘的基础设施在我们的场景里面的话我们用IPU就像一个智能的网卡它有自己的操作系统 自己的CPU和Memory它可以释放一部分的工作节点的资源消耗把一部分的工作移到IPU上面来做处理我们在我们的场景里面我们用IPU把工作负载的QS这部分工作交给IPU来做这个是我们怎么样来标注我们的工作负载需要多少IO的资源就是左边是我们的磁盘IO的请求的标注右边是网络IO请求的标注我们把这些信息标注在PodSpac的注释里面目前是把它放在注释里面对不起然后在磁盘IO这里我们可以希望我们这个工作负载需要的吞吐量比如说读写的吞吐量还有一些 比如说关于我们这个工作负载的BlockSize还有读写的比例之类的一些信息可以帮助调度器来判断怎么样来做调度然后对于网络IO这边的话我们是可以标注我们这边工作负载需要多少英国词和英国词的带宽如果带有这个标注的话我们就认为这个工作负载是需要此排IO保证的那如果没有带这个标注的话我们认为它就是属于比翼的工作负财不需要IO资源的保证这里是一个关于此排IO调度与隔离的一个流程图从右边这个图我们可以看到有两个颜色一个是灰色 一个是橙色灰色部分的话是现有的KBS现存的模块然后橙色的部分是为了我们这个IO资源隔离有调度的功能添加的模块首先在左边控制面这一块的话我们自己开发了一个IO资源感知的调度期差件这个调度期差件会根据工作负载的QS的类型以及每个节点上的IO的可用性进行调度在这个差件下面是一个聚合器这个聚合器的功能是从每个工作节点汇报上来的IO可用性的数据把它归总起来一起汇报给调度期差件然后右边就是我们的工作节点工作节点上的主角就是NodeIO的agentsNodeIO的agents主要做了三件事情一件事情就是做资源隔离我们目前主要是采用Segububi2来做磁盘IO的隔离另外一个事情就是我们做本地磁盘的IO使用量的监控然后把监控到的数据通过聚合器反馈给调度期的差件最后一个事情就是当我们发现这个在工作节点上它的IO资源比较紧张的时候NodeIOagents还会压缩根据预定的策略压缩比意义工作负载的资源边界以达到保证直接工作负载的性能然后这边是网络IO这一块的一个流程图基本上类似唯一的区别就是这里是用TC对IO的流量做一些控制我们这里后面会讲一下怎么样把ADQ就ADQ功能的网卡的特性用到我们的工作当中首先我们可以介绍一下ADQADQ如果把网卡比做一个高速公路的话ADQ就相当于在高速公路上的一个快车道当有一个关键应用上来的时候我们会给这个关键应用开辟一个快车道然后这个车道是别的应用不可以抢占的以这样的方式来保证关键应用的一个IO服务的性能这样做的好处一方面就是他们可以在我们给他的专用车道上面以固定的速度来发包这样子的话可以提高包到来的可预测性另外可以提高包处理的一个效果另外可以减少上下门的切换就是说我们ADQ这边是建议在一个服务当中如果是一个多线程的服务他建议给每个线程能绑定一个对列这样子的话就可以减少发包的时候上下门切换的开销另外就是我们每一个应用的话就ADQ里面会给每个应用绑定到特定的对列上面去这样的话也便于我们给应用的网络IO做整形或者空流这是ADQ在我们网络IO的空流和隔离方面的应用就是说从左边这张图上面我们可以看到对于GA的工作负载我们给它预留一个比较大的池子就是大概预留95%的网卡的带宽然后给比翼的工作负载的话我们给它预留一个相对比较小的池子大概5%的网卡的带宽然后从右边看在10克A的话如果这个时候有一个GA的工作负载和三个比翼的工作负载同时在运行这个时候GA的工作负载对带宽的要求相对是比较低的这个时候GA负载的池子的带宽然后它们可以在工作节点上运行然后到10克B的时候我们这边发现又有两个GA负载调度上来了这个时候ADQ就会帮助这两个池子做动态的调整就是说GA的池子会动态的扩大然后比翼的池子会动态的缩小这样来保证GA池子总能用到足够的带宽另外就是关于我们这个解决方案的一个调度的流程图从这里可以看到就是我们刚刚说的就是在一开始的时候我们会对每个工作节点上的设备Io设备做一些测量然后拿到这些设备上面的一些容量特性一些数据然后以CR的形式汇报给API Server然后这个时候Schedule调度器的插件也会也会监听CR的一些变化然后把这些信息存到调度器插件的缓存里面去这个时候有一个租户如果创建一个带Io请求的一个POD的时候调度器会发现有一个未绑定的POD被安排上来这个时候我们的带Io感知的调度器插件就会根据当前工作负载的QS的类型以及集群内Io的可用性每个节点的Io可用性做相应的调度然后它确定把POD绑定到某一个节点了以后它会通过聚合器通知NodeIoAgent的告诉它我们这边有一个新的POD即将绑定到NodeIoAgent上面去了然后这个时候Couplet应该在差不多时间也会知道也会有一个Node绑到这个工作节点上面来然后它会调用容器运行时让它去创建POD或者我也创建POD做一些准备这个时候我们就用到了NI这个框架NI它这边是一个可能的地的一个新的特性它是一种容器运行时CI的一种插件然后它主要是做节点资源管理的一个插件框架我们NodeIoAgent实现了框架然后在容器创建或运行的时候它能感知到容器的存在然后可以在这个间隙做一些事情在我们的场景里面就是通过NI的框架我们能够通知到这个容器已经创建运行然后我们NodeIoAgent可以及时的监控把这个容器容纳到我们的监控系统及时的把监控这个容器的实时的Io的使用情况最后NodeIoAgent会把节点上整体的一个复载的使用情况再汇报给API Server以下的形式汇报给API Server这样就循环网幅完成了这样的一次调度的工作这里是我们的一个实验就是说我们对我们的Io调度和隔离的功能做了一下测试就是说我们这里把卡夫卡作为我们的一个Ga的工作复载把API用APIを模拟一个比翼的工作复载然后卡夫卡它在没有任何干扰情况下的话它的吞吐量大概在200张每秒左右然后在没有启用我们的Io资源调度和隔离的功能的时候我们跑了一个卡夫卡的服务和4个FIL这样的一个容器然后跑了10次所谓跑了10次就是因为我们用一个卡夫卡的客户端触发卡夫卡的Server作读写所以能看到这里有10个十次读写的过程能够看到在没有我们Io资源隔离和调度的功能的情况下Io的吞吐量其实波动还是很明显的每次波动都很明显然后它的平均值其实也是达不到它需要保证的200张每秒的这个下方的图是每个比翼工作负载的10次的吞吐量的情况可以看到比翼工作负载其实吃掉了不少的Io的带宽然后但是第三列就是我们这边加了我们Io资源调度和隔离的解决方案了以后可以看到我们的卡夫卡的也就是Ga的工作负载它又回到了它之前需要保证的200张每秒的吞吐量然后我们的notepadagent会把那些比翼的工作负载的带宽做相应的压缩以保证Ga工作负载的Io的性能最后就是总结一下我们这次的一个演讲首先我们要这个工作主要是要把Ga和比翼的工作负载同时跑在工作节点上同时要保证Ga工作负载的一个Io的性能另外我们还利用到了一些高级的平台的性能来帮助我们更好地做Io资源的隔离和控流比如说像代英ADQ功能的英特尔网卡和英特尔的IPO设备最后这边是Cassie和我的邮件的联系方式如果大家有任何问题或者想要讨论的点都可以及时地联系我们另外我们在SIG Scheduling也提了一个CAP就是关于自判Io赶值的一个调度的一个框架如果大家有兴趣可以去看一下欢迎大家留言评论最后大家有什么问题吗你好 刚才那个Disk Io那一块我看了一下就是Ga的上报Disk Io Agent上报它是上报的实时的Io的数据就比如IoPS的还剩余的量还是上报的是剩余的cota那部分我看第三个你刚才写的是Monitor Real Time Io这个是说实时的就比如说我当快sd10帆我有一万的IoPS那么我使用了3000那你是上报的是还可以再调度7000还是说上报的是就剩2000了我们应该汇报给调度7000差践的应该主要是当前工作节点上还可以用剩余的带框还有多少还可以用实时用是吗对这个时候如果再调用一些Ga的这种泼得过来它是总量超了因为毕竟它Io并不会实时有会出现多个泼的峰值超过你本地自判的限值会有这种情况出现吗这种情况下那如何保证你的意思是说如果还有一些Ga的工作负载过来会超过我们这里汇报上来的它可用的Io的负载的话因为你这地方刚才说上报的是实时值我的意思是说Io赤盘本身的IoPS是有限的但是上报的实时值就比如说我先调度几个Ga过来但它并没有跑或者是它Io并没有产生比如它是凝层产生这个Io导致我调度过来但是我本身应用会不会特性变了明白但是它的IoPS就上来了导致会超限那这种情况下竞争我理解就会产生那这种情况下是如何去解决的这种还是主要是一种预留的机制就是说它请求了多少我们还是给它预留多少资源所以它如果要超出的概率上报的其实是既包括本地的IoPS的总限值分配值以及实时值都会上报可以这么理解吗就是在我们的开始里面会存就是每个工作负载它需要请求的IoPS的值以及工作节点上会上报它还剩余多少如果我们通过一些计算公事来判断到底能不能调度这个工作负载OK讲到一个问题就是你这个初始上报的值是通过Load-IoA进的自动去检测出来的吗对我们会做一些这一个是什么时机去处发呢就比如说我如果重启困难的如果你这个地方每次初始化都会去大量写字盘的话应该会对应用产生一些干扰应该是在我们整个solution要启用之前建议去做这样一个profile就是我们会开发了一个profile的工具专门来做这样的一个测试质量我说它那个profile的那个时机是什么时候时机就在集群启用之前启动之前对在启用之前是吗对不然你在用的时候的话应该这个测评不是很准就是大家读写都蛮多的OK还有那个后面那个图为什么它那个限制之后比如说那个卡不卡之后不用的时候那个量还没起来呢那个是什么原因我理解这个好像你这个B在卡不卡没有用时机因为它应该会会流量应该会起来你说第一个是吗小后面那个就是你限制之后的那个字限制之后那个那是因为我们给它做了压缩因为它是属于B的工作负载吗对 我的意思是卡不卡没用的时候那个流量下来之后为什么它也没有流量没有上去看起来是因为这里也没有数据你这个是属于没画是吗对 应该没画对就是每个柱子这里的应该是对应的上面的一个峰值这里然后下面当中不是有一个空档的吗就是在没有触发那个Bankmark的时候它这边是没有画的OK 好的你好 那个我们自己在做那个磁盘海鸥那个就是限制的时候遇到一个问题就是说一般的应用它都很少用直接磁盘海鸥它是用的是带缓程的磁盘海鸥这样的话会有Linux会有一个进程叫journody好像还有一个进程有两个进程专门负责所有的进程的IO这样我们对一个进程做那个C Group的IO限制它根本就不起作用因为我现在是那个进程但是这写词盘的其实是journody那个进程所以我不知道你们有没有遇到过这个问题就是怎样限制我发现我们根本限制不住这是定义问题我觉得C Group v1好像有这样的问题就是它不考虑缓存的营俗但C Group v2的话我们中国测试它应该会把缓存的使用也会考虑进去因为journody它是公共的它为所有的进程把它的操作系统内存里面缓存刷新到磁盘上你如果限制journody的一个比如IO比例上是限制所有人的你也不知道journody哪一个它哪一个写的字节是哪一个进程我不知道这个就是公共的刷的 对吧对这个如果您有问好我可以和其在联系你这个我感觉就很困难那第二个问题第二个问题就是您往前翻一下那个我想问一下EBPF在那个IO限制流是起什么作用监控的作用监控的作用它并不起到限制作用没有限制 对它目前是只读的就是读那怎么还要的使用的数值根据每个容器的 对刚才那个定义同事我也可以回答一下就是我们自己也在做一个字眼的这种调度就是您说的那个问题实际上就是就是说上报这个东西我们上报实施值和上报它的预留额我们两个都要上报实施值一般是用来监控的上报那个配额是用来调度的比如说我一上来发现这个磁盘的IO速率是1000Mbps我就设定了它的可分费额都是1000Mbps然后有N个应用有的要200张有的300张是500张如果200张300张500张一分费完这个DG绝不能再用了就是说你上报的两个东西其实都有用但调度的时候一般上报的就是它的配额上报它实施值其实就于监视作用因为就像你说的你分费额调度过去了它不一定再用但其实你登记了我用了200张那如果不超设的话那我现在就把这200张花给你了下面你就不能再用了谢谢你的补充好 谢谢你好我也有两个问题第一个问题是咱们这个项目现在是到了一个什么样的阶段我目前只是把一个端斗档的一个框架的设计已经完成了然后一些硬件的这个集成也是正在做比如说像IPO的那个还在做ADQ的已经集成进去了就是还在做的阶段以及各个性能的细节在逐步完善就比如说大家提的有些问题OK那预计比如说正式的一个第一个发布的版本会到什么时候啊这个取决于老板OK好的 谢谢第二个问题是您刚刚提到就是我理解的就在这里做限制包括网络和磁盘嘛 对吧网络的L我理解那个限制是通过您刚刚说的一个叫ADQADQ的一个硬件的支持 对吧对 硬件和不加硬件的都有一些解决方案OK那磁盘的L是通过什么方式来做C Group V2啊C Group V2就是通过C Group V2来做限制对对对主要通过它来做限制好 谢谢您好我想问一下因为C Group V2做限制的时候它是要指定那个设备号嘛就是然后你这边实现的时候是会去便利这个跑道它所挂在的Volume的那个底层的那个设备号是吗嗯对我们就是在做Profile的那个阶段Node Io Agint会去便利这个节点上所有的Io的设备比如说网络和磁盘的设备它的设备号什么都可以拿到然后通过CR的形式汇报给APS我的问题是这样子就是说如果我一个Volume不是 我的一个跑道它挂的是一个IoVM类型的这么一个东西然后它可能底层的到物理设备那边的话它可能会对应不同不同类型的这么一个物理设备它的物理设备的种类不一样它的Io情况它的上限就不太一样嘛所以我就比较好奇就是说你这个调度是怎么这一块是怎么弄的目前我们还不支持IoVM因为IoVM很复杂因为底层它可以多个设备也说目前是一个单块磁盘对对 单块磁盘多块磁盘我们也在即将要支持但IoVM它本身底层你就不知道它对应多少块磁盘然后它也可以动态扩容这种就更复杂了好的 就是说整体的今天的演讲的话是一个通用的解决方案还是说是一个音乐专属的方案有看有好几个有通用的解决方案也是可以带上英特尔硬件的解决方案都有好 谢谢我们知道就是那个像这种磁盘的IoVM可能对应用的在使用的时候可能很多新玩意都是那种突发性的就是说它一要的时候它可能需要一个非常大的IoVM但是它可能很长时间它不会去做这个IoVM那其实如果说按照它最大的一个要求去配的话其实可能对资源利用率反而不是提升可能会是降低所以这块我不知道有没有什么在算法上有没有什么更好的一些优化对 以后应该会有就是比如说对应用它的一些使用的模式比如说什么时间点来使用这可能需要一些历史的数据分析根据这些数据分析来怎么样对这个设备工作节点做打分啊这样做调度你好 我想问一下就是刚才说这个磁盘的Io限制是通过西伯维尔做的吗然后是西伯维尔他我理解他是有IoMax还有IoCost的这两种能力我们目前是这两种能力是都使用的吗还是使用的其中一种呢目前使用了IoMax那就是Cost是暂时没有用上什么Cost暂时没有用上然后那个卫桃源支撑也没有用上目前没有用那还有个问题是我看这边有那个Resource Io Aggregator这边在调入过程中会去通知这个Node Agent这个目的是什么为什么要有这个动作呢你不能说直接等Node Agent就等肯定地去中国NRI去触发它对 这是个好问题就是因为我们现在Node IoAgent汇报上来的是一个整个某一块磁盘的可用性但是这样它汇报上来只是一个数字你不知道它对应的是有多少个工作负载所以我们在已经绑定到把POD绑定到一个Node上以后我们就要及时告诉Node IoAgent可能你还会漏掉一个POD的节点我们就把它给它预留的带宽也要加上去然后作为这个要反馈的Io可用的可用的带宽反馈给那个汇报上来汇报给那个聚合期就说你如果不及时通知它的话它反馈的是个总量但你没有办法知道这个总量是包括哪些工作负载的但是这个你下发的那个新的POD它不是就是从那个Aggregator或者从调入器这边当中会有一个时间差就是就有可能它绑了但是很久还没起就当中会有个时间差你们数据是以Node IoAgent为准以它上报上来的为准或者说有没有考虑说我们就以调入器里面的那个缓存为准的话是不是就可以省略掉这个步骤呢因为因为我们这边的每个负载它实施的使用量我们会从Node IoAgent这边把它算出来然后根据它用了多少然后磁盘总的能力是多少然后把它算出来可剩余可用的是多少把剩余可用是多少通过聚合期反馈给调度器插件了解可能就是说就是可能提早通知这个agent去采集对应这个POD的一些对 告知它这个POD的存在就是它在汇报的时候就不会会丢失这个POD的信息因为我在一个时间间隔内就是在那个在它这里通知聚合器到Ni通知那个Node IoAgent当中应该会有一个时间差的有的时候会有一个时间差如果集群延迟比较长的话好 那我最后一个问题就是我看它我们设置Limiter的时候是通过POD的Annotation上面去设置那我看它上面设置好像是没有针对特定的盘我不太清楚我们这个限制是比如说几点上面它有多块盘我们是限制它的总多块盘的一个总的IoAgent还是说能够有办法去限制特定某块盘我们现在的实现主要是对那个Firmware Storage的IoAgent做限制所以没有写盘但我们后面如果是要对多盘的做支持的话可能会把Volume或者盘的那些信息都放上去现在可能主要是限制容器它本身临时传输了一个是谢谢 没问题不好意思 我补充一下我刚才那个问题就是比如说机上的磁盘IoAgentIoAgentIoAgentIoAgentIoAgentIoAgentIoAgentIoAgentIoAgentIoAgentIoAgentIoAgentIoAgentIoAgentNiOaiOPS比如说它可能就那么多然后CPU资源可能它本来可以分配比如说如果是它一个物理机它有100盒它可能可以分几十个POD然后每个比如说4U8G或者多少它可以分那么多下去但是如果说你按照它iOPS再分出这几十分来的话可能它的这个每个POD它能分到的Garantee的这个iOPS非常的小那这时候可能可以对应用来说它的这个性能的影响会非常大我不知道这种是不是会有这样的问题就是因为比如说如果sdd的硬盘它的iOPS可能就只有几百那如果你给它分成再再划成几十分的话可能每个就只能几个iOPS这种上线限制我们现在的这个应用主要是在NVME盘上面的一个分配对于sdd可能是比较特殊的场景对企业级因为一般也主要是NVME盘好的你好我刚才想问一下我刚才他们问了说咱们这边主要还是一个单盘的场景具体的实现具体的使用场景是用什么是用那个零时存出的那个零时就MTDIR不是吧就是Formal Storage的那个Formal Storage是用MTDI那个对啊就是MTDIR那如果用MTDIR跑有状态应用的话感觉好像不是一个最佳实践应该只能目前是保证就是在一个工作节点上多个POD的之间可能对零时MTDIR的这个Volume的使用的时候造成的影响吧但是后期我们应该会支持除了MTDIR以外的那种盘也会出一个CSI去干准的事情对对对类似于一个CSI了估计哦okok好如果大家没有再多的问题的话欢迎大家到时候邮件或者用github上来联系我来讨论来讨论谢谢大家