快速开发、验证、上线新特性 , 稳定后放入内核主线 针对不同业务场景做定制优化 , 以 RPM 包的形式发布和维护非通用调度器特性 统一管理调度器热补丁 , 避免多个热补丁之间的冲突而引发故障 应用案例 1:新增 Group Identity 调度特性
Group Identity 是阿里云用于混部场景的调度特性 , 它基于 CFS 调度器增加了一颗存储低优先级任务的红黑树 , 而且会对每一个 cgroup 分配一个默认优先级 , 用户也可自行配置其优先级 , 当队列中存在高优先级任务时 , 低优先级任务会停止运行 。 我们利用 plugsched 对 anck 4.19 的一个老版本内核(没有该调度特性)进行调度器热升级 , 并将 Group Identity 调度特性移植到生成的调度器模块中 , 涉及 7 个文件 , 2500+ 行的修改量 。
安装该调度器模块后 , 在系统中创建两个 cpu cgroup A 和 B , 并绑定同一个 CPU , 分别设置最高和最低优先级 , 然后各自创建一个 busy loop 任务 。 理论上 , 当 A 中有任务执行时 , B 中的任务会停止运行 。 此时用 top 工具查看该 CPU 利用率 , 发现只有一个利用率是 100% 的 busy loop 任务 , 说明模块中的 Group Identity 特性已生效;而动态卸载该模块后 , 出现了两个各占 50% CPU 的 busy loop 任务 , 说明模块已经失效 。
应用案例 2:与内核发布解耦及定制化调度器
阿里云某客户使用的旧版本内核 , 由于该内核调度器对 load 的统计算法不合理 , 导致 CPU 利用率过高 , 虽然修复补丁已经合入内核主线 , 但是新内核版本还未发布 , 而且业务方也不打算更换内核 , 因为集群中部署了大量的业务 , 升级内核成本较高 。
除此之外 , 客户的内核开发人员对其混部业务场景(Group Identity 调度特性)进行了针对性的优化 , 想将优化内容合入内核主线 。 但是 , 阿里云内核开发人员发现 , 该优化内容在其它场景中有性能回退 , 属于非通用优化 , 因此不允许将优化内容合入主线 。 于是 , 客户的内核开发人员使用 plugsched 将优化修复内容全部移植到调度器模块中 , 最后规模部署 。 该案例可以体现出 plugsched 的与内核发布解耦、定制化调度器的优势 。
那么 Plugsched 该如何使用? 目前 , plugsched 默认支持 Anolis OS 7(内核ANCK-4.19版本) 系统 , 其它操作系统需要调整边界配置 。 为了减轻搭建运行环境的复杂度 , 我们提供了容器镜像和 Dockerfile , 开发人员不需要自己去搭建开发环境 。 为了方便演示 , 这里购买了一台阿里云 ECS(64CPU + 128GB) , 并安装 Anolis OS 7.9 ANCK 系统发行版 , 我们将演示对其内核调度器进行热升级的过程 。
1、登陆云服务器后 , 先安装一些必要的基础软件包:
# yum install anolis-repos -y # yum install podman kernel-debuginfo-$(uname -r) kernel-devel-$(uname -r) --enablerepo=Plus-debuginfo --enablerepo=Plus -y 2、创建临时工作目录 , 下载系统内核的 SRPM 包:
# mkdir /tmp/work # uname -r 4.19.91-25.2.an7.x86_64 # cd /tmp/work # wget https://mirrors.openanolis.cn/anolis/7.9/Plus/source/Packages/kernel-4.19.91-25.2.an7.src.rpm 3、启动并进入容器:
# podman run -itd --name=plugsched -v /tmp/work:/tmp/work -v /usr/src/kernels:/usr/src/kernels -v /usr/lib/debug/lib/modules:/usr/lib/debug/lib/modules docker.io/plugsched/plugsched-sdk # podman exec -it plugsched bash # cd /tmp/work 4、提取 4.19.91-25.1.al7.x86_64 内核源码:
# plugsched-cli extract_src kernel-4.19.91-25.2.an7.src.rpm ./kernel 5、进行边界划分与提取:
# plugsched-cli init 4.19.91-25.2.an7.x86_64 ./kernel ./scheduler 6、提取后的调度器模块代码在 ./scheduler/kernel/sched/mod 中 , 简单修改 __schedule 函数 , 然后编译打包成调度器 rpm 包:
- Linux|嵌入式开发:保护嵌入式Linux设备中的引导顺序
- Linux|升级第12代酷睿之后 华硕无畏15 2022是否值得选?
- 算法|谷歌针对俄罗斯的地图开源不再模糊化处理它的居心何在?会产生什么影响?
- Linux|趋于完美?小米12 Ultra或延续上代设计,各方面配置相当惊喜
- 零售业|阿里云PolarDB开源数据库社区与 Tapdata 联合共建开放数据技术生态
- 阿里巴巴|中国科协发布2021开源创新榜 阿里巴巴2大开源社区 5大开源项目上榜
- 华为鸿蒙系统|鸿蒙开源版OpenHarmony 4.0 社区版发布计划 公布功能列表
- 算法|中国科协发布2021开源创新榜 阿里巴巴2大开源社区 5大开源项目上榜
- Linux|耳机赛道有多卷,这个手机厂商告诉你
- 软件|81% 的代码库包含已知的开源漏洞