ARM 处理器(譬如鲲鹏 920)相较于常见的 x86 处理器,其 CPU 拓扑结构与 NUMA 层级相对复杂。在程序启动和运行过程中,需要在调度和内存管理上充分做到 NUMA 亲和,才能发挥处理器的最大性能。
举例来说,鲲鹏 920 处理器一个 CPU 上有 2 个 DIE,每个 DIE 上有若干个物理 core,构成一个 NUMA 域。在每个 NUMA 域当中,若干个物理 core 又进一步组成一个 cluster,进一步增强 cache 亲和性。此外,不同 NUMA 域之间访问时延也不同。再考虑到多 CPU 系统,会进一步加剧这种复杂性。
当前较新的 Linux 内核(6.12+)支持用户态调度(sched_ext),在 openEuler 24.03 SP1+ 上也实现了类似的功能。通过用户态调度机制,允许用户在用户空间动态加载自定义的调度策略,结合 NUMA 亲和的内存管理(分配、迁移、缓存等),可以对运行的应用实现最佳 NUMA 亲和的调度与内存管理,提升应用性能。
1.1.1 问题要求
基于较新的 Linux 内核(6.12+)或者 openEuler 24.03 LTS SP1 系统(6.6 内核,已实现类似 sched_ext 的可编程调度机制)和某一款 ARM 处理器平台作为执行与验收环境。
对典型多进程/多线程业务场景,如 MySQL,PostgreSQL,Nginx,Redis(6.x+),Spark,Hadoop 等,进行性能优化。不对应用进行修改,只能对 OS 系统进行优化(如果确实涉及到对 GCC、JDK 等编译器/运行时的合理配置,可酌情适当进行调整)。
通过上游 Linux 内核提供的 sched_ext 接口或者 openEuler 提供的可编程调度接口实现用户态自定义调度器,实现业务亲和的自适应调度调优能力。
改进系统自带的 numa balance 工具或者实现新的 numa 调优工具,结合上述用户态调度机制实现对应用的性能优化。
决赛项目:位于分支v8
项目文档:分支v8 ——ARM-NUMA项目说明书.docx
演示视频:分支v8 ——演示视频.mp4
sched-ext调度器:分支v8 ——/scx_simple.bpf.c
/scx_simple.c
LD挂钩程序: 分支v8——/read_test1/LDcode/log_read.cpp
1. 问题概述
1.1 赛题说明
ARM 处理器(譬如鲲鹏 920)相较于常见的 x86 处理器,其 CPU 拓扑结构与 NUMA 层级相对复杂。在程序启动和运行过程中,需要在调度和内存管理上充分做到 NUMA 亲和,才能发挥处理器的最大性能。
举例来说,鲲鹏 920 处理器一个 CPU 上有 2 个 DIE,每个 DIE 上有若干个物理 core,构成一个 NUMA 域。在每个 NUMA 域当中,若干个物理 core 又进一步组成一个 cluster,进一步增强 cache 亲和性。此外,不同 NUMA 域之间访问时延也不同。再考虑到多 CPU 系统,会进一步加剧这种复杂性。
当前较新的 Linux 内核(6.12+)支持用户态调度(sched_ext),在 openEuler 24.03 SP1+ 上也实现了类似的功能。通过用户态调度机制,允许用户在用户空间动态加载自定义的调度策略,结合 NUMA 亲和的内存管理(分配、迁移、缓存等),可以对运行的应用实现最佳 NUMA 亲和的调度与内存管理,提升应用性能。
1.1.1 问题要求
1.1.2 本项目的特色之处
(1) 采用两层调度,确保了高速 I/O 介质上的忙等待不会过度抢占计算密集型进程的 CPU
当应用同时存在以下两类进程时:
传统 CFS 调度器会导致 I/O 线程因忙等待频繁抢占计算线程,被抢占线程可能被迁移到非最优 NUMA 节点,跨 NUMA 内存访问激增,有效内存带宽下降 40% 以上。
针对这种现象,提出了双层调度方法:
(2) I/O 映射 CPU 自适应硬件线程分配
传统 I/O 绑定存在两大局限:
提出的改进方法:
(3) 基于有效执行时间的完全公平调度 + NUMA 本地性
传统 CFS 在复杂 NUMA 系统中的问题:
改进方法:
(4) 基于 LD_PRELOAD 的系统调用挂钩
1.1.3 当前指标达成情况
1.1.4 相较于初赛的改进
(1) 基于 LD_PRELOAD 的系统调用挂钩
pread/pwrite等系统调用,封装为 request 对象并队列化调度。(2) 基于 LD 挂钩负载与 CPU 利用率的动态核心分配算法
special队列,运行在专用核心上。