作业帮kubernetes serverless在大规模任务场景下落地和优化

2021-11-05 16:08:57在作业帮的云原生容器化改造进程中,各个业务线原本部署在虚拟机上的定时任务逐渐迁移到kubernetes集群cronJob上。开始cronjob规模较小,数量在1000以下时,运行正常,但是随着cronjob规模的扩大到上万个后,问题就逐渐显现出来。
一、背景
在作业帮的云原生容器化改造进程中,各个业务线原本部署在虚拟机上的定时任务逐渐迁移到kubernetes集群cronjob上。开始cronjob规模较小,数量在1000以下时,运行正常,但是随着cronjob规模的扩大到上万个后,问题就逐渐显现出来。
二、问题
当时主要面临着两个问题:一是集群内节点稳定性问题,二是集群的资源利用率不高。
第一个问题:集群内节点稳定性
由于业务上存在很多分钟级执行的定时任务,导致pod的创建和销毁非常频繁,单个节点上平均每分钟有上百个容器创建和销毁,机器的稳定性问题频繁出现。一个典型的问题是频繁的创建pod导致节点上cgroup过多,特别是memory cgroup不能及时回收,读取/sys/fs/cgroup/memory/memory.stat变慢,由于kubelet会定期读取该文件来统计各个cgroup namespace的内存消耗,cpu内核态会逐渐上升,上升到一定程度时,部分cpu核心会长时间陷入内核态,导致明显的网络收发包延迟。
在节点上 perf record cat /sys/fs/cgroup/memory/memory.stat 和 perf report 会发现,cpu主要消耗在memcg_stat_show上:
而cgroup-v1的memcg_stat_show函数会对每个cpu核心遍历多次memcg tree,而在一个memcg tress的节点数量达到几十万级别时,其带来的耗时是灾难性的。
为什么memory cgroup没有随着容器的销毁而立即释放呢?主要是因为memory cgroup释放时会遍历所有缓存页,这可能很慢,内核会在这些内存需要用到时才回收,当所有内存页被清理后,相应的memory cgroup才会释放。整体来看,这个策略是通过延迟回收来分摊直接整体回收的耗时,一般情况下,一台机器上创建容器不会太多,通常几百到几千基本都没什么问题,但是在大规模定时任务场景下,一台机器每分钟都有上百个容器被创建和销毁,而节点并不存在内存压力,memory cgroup没有被回收,一段时间后机器上的memory cgroup数量达到了几十万,读取一次memory.stat,耗时达到了十几秒,cpu内核态大幅上升,导致了明显的网络延迟。
除此之外,还有dockerd负载过高,响应变慢、kubelet PLEG超时导致节点unready等问题。
第二个问题:集群的节点资源利用率
由于我们使用的智能卡的CNI网络模式,单个节点上是有的pod数量上限的,节点有几乎一半的pod数量是为定时任务的pod保留的,而定时任务的pod运行的时间普遍很短,资源使用率很低,这就导致了集群为定时任务预留的资源产生了较多的闲置,不利于整体的机器资源使用率提升。
其他问题:调度速度、服务间隔离性
在某些时段,比如每天的0点,会同时产生几千个JOB需要运行。而原生调度器是k8s调度pod本身是对集群资源的分配,反应在调度流程上则是预选和打分阶段是顺序进行的,也就是串行。几千个JOB调度完成需要几分钟,而大部分业务是要求00:00:00准时运行或者业务接受误差在3s内。
有些服务POD是计算或者IO密集型,这种服务会大量抢占节点CPU或者IO,而cgroup的隔离并不彻底,所以会干扰其他正常在线服务运行。
三、在k8s集群中使用serverless
所以对CRONJOB型任务我们需要一个更彻底的隔离方式,更细粒度的节点,更快的的调度模式。
为了解决上述问题我们考虑将定时任务POD和普通在线服务的POD隔离开,但是由于很多定时任务需要和集群内服务互通,最终确定了一种将定时任务的pod在集群内隔离开来的解决办法 —— k8s serverless。我们引入了虚拟节点,来实现在现有的k8s体系下使用k8s serverless。部署在虚拟节点上的 POD 具备与部署在集群既有节点上的 POD 一致的安全隔离性、网络连通性,又具有无需预留资源,按量计费的特性。如图所示:
任务调度器
所有cronjob型workload都使用任务调度器,任务调度器批量并行调度任务POD到serverless的节点,调度上非串行,实现完整并行,调度速度ms级。也支持serverless节点故障时或者资源不足时调度回正常节点。
解决和正常节点上POD差异
在使用k8s serverless前首先要解决serverless pod和运行在正常节点上的POD的差异,做到对业务研发无感。
1.日志采集统一
在日志采集方面,由于虚拟节点是云厂商维护的,无法运行DaemonSet,而我们的日志采集组件是以DaemonSet的形式运行的,这就需要对虚拟节点上的日志做单独的采集方案。云厂商将容器的标准输出收集到各自的日志服务里,各个云厂商日志服务的接口各不一样,所以我们自研了日志消费服务,通过插件的形式集成云厂商日志client,消费各个云厂商的日志,和集群统一的日志组件采集的日志打平后放到统一kafka集群里以供后续消费。
2.监控报警统一
在监控方面,我们对serverless上的pod 做了实时的cpu/内存/磁盘/网络流量等监控,做到了和普通节点上的pod一致,暴露pod sanbox 的export接口。我们的promethus负责统一采集。迁移到serverless时做到了业务完全无感。
提升启动性能
Serverless JOB 需要具备秒级的启动速度才能满足定时任务对启动速度的要求,比如业务要求00:00:00准时运行或者业务接受误差在3s内。
主要耗时在以下两个步骤:1. 底层sanbox的创建或者运行环境初始化2. 业务镜像拉取
主要是做到同一个workload的sanbox能够被复用,这样主要耗时就在服务启动时长,除了首次耗时较长,后续基本在秒级启动
四、总结
通过自定义job调度器、解决和正常节点上POD的差异、提升serverless POD启动性能措施,做到了业务无感的切换到serverless,有效的利用serverless免运维、强隔离、按量计费的特性,既实现了和普通业务pod隔离,使得集群不用再为定时任务预留机器资源,释放了集群内自有节点的上万个pod,约占总量的10%;同时避免了节点上pod创建过于频繁引发的问题,业务对定时任务的稳定性也有了更好的体验。定时任务迁移到serverless,释放了整个集群约10%的机器,定时任务的资源成本降低了70%左右。
什么是显卡物理加速
我来简单说几句
物理加速使得3D游戏更佳逼真
物理加速非但不能加速 开启了物理加速 就会更卡
A卡和N卡物理加速 是在处理能力上 N卡强些 但是A卡通用性高 而且数量远超N卡 所以两家不分好坏
神魔大陆都有哪些职业
精灵:接触精灵,总体感觉,就是妖男艳女,实在过于妖艳,超越妩媚。 耳朵自然是尖的。 由于是技术测试,所以时装立刻就是极致的,非常的华丽,女性的裙子好看。 精灵可以选择的职业有:战士,牧师,法师,吟游诗人。 人类:人类就是漂亮,而且主观上选择的人群会少一些。 可选的职业:战士,牧师,法师,刺客。 血族:这是一个神秘的种族,天生有吸血鬼的本质,看上去泛出紫光,外型很酷,技能都是一样的,华丽兼流畅性不够。 可以选择的职业有:刺客,法师,血魔。 血魔似乎会吸血,使得好奇更浓。 我几乎是体验了一下所有职业的技能。 总体感觉,未来选血族的人群是占大多数的,冲着外观和职业,都是大有人在。 在职业上,我先前最搞不懂的就是吟游诗人和牧师,因为在《指环王OL》里,吟游诗人是奶妈。 神魔里,牧师是奶妈,至于吟游诗人是一个很神秘的职业,使用技能会有乐谱,但是还不知道有什么用。 有人说诗人是辅助类职业,目前来说,还看不到辅助他人的技能。 。 。 可以弹弹琴,杀杀人血魔,同样是新奇职业,看了大概技能,属于诅咒类职业,还能吸血,属于中距离的攻击者。 和法师相接近。 法师:顾名思义,没什么解释,我体验较少。 刺客:在测试玩家当中,都说刺客会是一个不错的职业,无论是攻击还是喜爱程度,近距离的杀手。 战士:我玩了下精灵战士,居然才几级就2个中距离控制技能,缠绕,晕眩,我都搞不懂了,到底还是不是近战DPS。 。 。 。 。 巨人MT:这个我没有体验,看得出身旁的MM玩得也很郁闷,所知甚少,居然不了了之。 。 。 看到有人说到第一个FB,火枪手都可以顶BOSS,我都有点心寒了。 希望在日后能改观MT的重要地位,免得没人玩就不好了。 。 。 火枪手:这个是我喜欢的职业,据说和《奇迹世界》里有点像,就是拿枪炮的。 果不其然,火枪手就是代替了以往游戏里不可缺少的远距离DPS,即弓手猎人。 相信在DPS上,也是和法师不相伯仲的。
1、画面: (1)vs完美世界 由于世界观不同,背景不同,画风所以有所不同。 神魔画面更细腻,场景更为宏大,建筑的表达更为突出,金字塔和狮身人面像很令人震撼。 但这么重要两处建筑目前看仅仅是摆设,跟系统联系不大。 完美世界中那个硕大的太阳和天天都在过十五的月亮还是那么的熟悉,不明白为什么不管是日出还是日落,阳光总是那么强烈?不管初一还是十五,月亮总是圆的?还有夜空的星星连眨都不眨一下,真假啊。 不知道这个怎么能和星座系统联系起来? (2) vs魔兽世界 有人说的好,引擎决定了品质。 相比魔兽世界神魔趋于写实,魔兽世界更奇幻风,魔兽世界的每个场景都能给玩家带来一阵阵的感动,细节刻画的绝对到位。 人物走在雪地上的吱吱声、沙滩上的脚印、甚至坐骑的脚印、水里呆久了会缺氧、跳到火堆里会烧伤。 还有逼真的内景设置。 而神魔贴图的地方太多了,所有的地面感觉都一样,想必这个也很难改变了....... 2、操作:这个问题现在争议最大,站桩先不说,就是跟完美世界比神魔也是一大退步。 我觉得起码有50%以上玩家会不爽...... 3、游戏性: (1)vs完美世界 几个特色副本很有新意任务系统也丰富很多,想必完美把这些年所有游戏的精华都拿到这里了吧? (2)vs魔兽世界 神魔 30级以后升级还是较慢,某些循环任务要求完成次数太多浪费时间,奖励也少些,时间长了也会引起玩家疲乏和反感。 目前测试只开到40级,不知道40级以后是不是还是这样的升级套路,如果是的话,那就杯具了.......20级—40级之间限制在一张地图很不自由,低等级玩家不能到高级地图探险有些失败.......如果40—60级还是停留在一张地图的话,就真的没什么意思了........... 4、种族和职业 (1) vs完美世界 种族更丰富 职业搭配更自由、更合理,队伍除了牧师角色不可或缺外不再依赖某几个职业,没有职业失业现象。 (2)vs魔兽世界 种族特色更鲜明虽然每个种族不像魔兽世界可选职业多 但职业特点和种族特长安排更紧密贴切,这上面策划组考虑得很周到。 好比,一提到猎人玩家首先想到的是巨魔和暗夜精灵 兽人更适合练战士 亡灵更适合练法师等等....... 5、人设 (1) vs完美世界 虽然少了自定义,但可选性还是比较自由的,头发的层次感非常突出。 人物形象与种族背景联系很到位,人物从外形上就能一眼看出职业种族。 矮人萝莉是个大胆的尝试,很可爱,这点很值得肯定。 不过男矮人过于猥琐,巨人面部表情太僵硬,有点像大傻!体形太过宽大,腿短。 有点像德莱尼,除了没有尾巴!想必也是目前两个角色相对冷落的一部分原因吧,希望这一点上能有改观! (2)vs 魔兽世界 这个不用说了 ,完美在这一点上完胜魔兽。 6、技能除了xp技能很好用,其他方面不如前两款游戏,控制技能太少。 技能表现手法和技能效果上没有大的突破,仍然停留在学习魔兽的阶段而不敢超越,就拿恐惧和猎手印记看,有些东施效颦的味道!游戏里不管物理怪和法术怪都有蓝条,但是他们却不掉蓝?另外,种族技能冷却时间也过长....... 7、ui设置卫星地图放右下角让人很不舒服,是想创新么?当初第一次进永恒之塔发现地图在右下角就觉得不习惯退出来了,后来才发现那个是可以移动的。 (1) vs完美世界 少了人物血条和功能键的折叠隐藏功能!卫星地图少了昼夜显示功能。 组队后,职业图标在完美世界连男女角色都能显示出来,队友图标也不如完美世界的好,这个神魔退步了....... (2)vs魔兽世界 没有时间显示功能对喜欢全屏的玩家很不舒服,不方便。 技能扩展栏扩展后不能自由设置和移动。 拿800*600分辨率为例:如果两个技能扩展栏都扩展开的话,在加上组队队友血条占一部分空间,任务追踪占一部分空间,被攻击目标血条,状态图标。 屏幕上就只能剩下一点点的空间了。 现在80%以上的玩家都用的是宽屏吧,所以,我建议技能扩展栏第三栏应该像魔兽世界一样可以移动,减少占用屏幕的横向空间,优化资源配置。 卫星地图等也可以自由移动,方便玩家按个人喜好安排ui。 。 。 。 。 。 。 。 8、关于4D的争议: 很X玩家慕名4D而来,结果觉得受骗了。 按玩家的理解4D应该是3维空间+时间,而神魔号称有纪元更替,游戏里却没有时间概念。 我觉得游戏里应该设置时间系统,按现实时间4:1的比例进行昼夜更替。 还原玩家真正的4D,而不仅仅是噱头! 9、建议开放拍卖行系统,现在玩家在自由港摆摊使本来就卡的服务器压力更大!另外,摆摊的小丑造型也太难看了............. 细节决定成功,品质决定未来
人一辈子奋斗的目标是什么?
面对现实,不说大道理,自己的前途,自己来把握当我们追求理想时,当然不能忽略了实际问题。 最完美的是能将理想和实际相结合,找一份你最爱的工作。 当理想和实际有分歧时,你要分三步走。 (1)面对现实,只要能得温饱,有了一定的收入,你能从中得到物质的享受 (2) 从实际出发,做你不是最喜爱的工作。 把不爱做的工作做得“足够好”,然后再说去追逐什么理想。 (3)逐步实现理想,做你不是最爱的工作,而在你不爱的工作上拚命,赚够了钱,解决了吃饭的问题,再去做你最爱的工作。 。 。 。 理想与实际是可以兼得的。 但是你必须有计划,必须付出,必须执著。 三百六十行,行行出状元,所以不能说什么工作好什么工作不好。 许多做出成就的人其实都是从小事做起,兢兢业业,然后才取得成功的。 一个工作只要你喜欢,而且这个工作又特别适合你,能最大限度地发挥你的长处,那么,这就是个好工作。 我不太赞成找不到工作就不就业的做法。 在就业的同时能实现择业当然好,但是,在就业形势比较严峻的形势下,很难在就业的同时实现择业。 在这种情况下,先就业后择业未必就不是一件好事,在这个过程中你会发现自己积累了好多社会经验,积累了许多职业技能,而现在企业越来越看中经验。 所以先积累经验,这也有助于你以后找到更为理想的工作。 打工,实践,积蓄,有一定条件后自己发展。 应该说哪一行都不好做,只要努力哪一行都能做好!祝你成功!
发表评论