当前位置: 首页 > news >正文

调度域和调度组

目录

一、处理器拓扑结构:NUMA 和SMP

1.1、SMP(Symmetric Multi-Processing,对称多处理)

1.2、NUMA(Non-Uniform Memory Access,非一致性内存访问)

1.3、SMP 与 NUMA 关键对比

1.4、现代系统的实际情况

二、调度域和调度组

2.1、 核心概念详解

2.2、 实例演示:双路 NUMA 服务器

2.3、 如何查看系统中的调度域?

一、处理器拓扑结构:NUMA 和SMP

在多处理器系统中,SMP(对称多处理)NUMA(非一致性内存访问)是两种核心的硬件架构设计,它们决定了 CPU 如何访问内存以及系统如何扩展。下面将对两者进行详细解析和对比。


1.1、SMP(Symmetric Multi-Processing,对称多处理)

1. 核心思想

SMP 是最传统的多处理器架构。其核心特点是:

  • 所有 CPU 完全平等:没有主从之分。
  • 共享统一内存:所有 CPU 通过一条共享总线连接到同一块物理内存。
  • 统一内存访问 (UMA):任何 CPU 访问内存中任意地址的延迟和带宽都相同。

2. 架构图

+-------+ +-------+ +-------+ | CPU 0 | | CPU 1 | | CPU N | +-------+ +-------+ +-------+ \ | / \ | / \ | / \ | / +----------+ | 共享总线 | +----------+ || +-----------+ | 统一内存 | +-----------+

3. 优点

  • 架构简单:硬件和操作系统设计相对容易。
  • 编程模型简单:程序员无需关心数据在内存中的具体位置,所有内存访问都是透明的。

4. 缺点与瓶颈

  • 可扩展性差:随着 CPU 数量的增加,所有 CPU 都要争抢同一条共享总线来访问内存。
  • 内存带宽瓶颈:总线的带宽是有限的,当 CPU 数量增多时,内存带宽成为系统性能的严重瓶颈。
  • 不适合大规模系统:通常只适用于 CPU 核心数较少(如 2-8 核)的系统。

1.2、NUMA(Non-Uniform Memory Access,非一致性内存访问)

1. 核心思想

NUMA 是为了解决 SMP 的可扩展性问题而诞生的。其核心特点是:

  • 节点化(Node-based):系统被划分为多个节点(Node)。
  • 每个节点包含:一组 CPU 核心 + 本地内存(Local Memory)。
  • 非一致性内存访问:
    • 本地访问(Local Access):CPU 访问自己所在节点的内存,延迟低、带宽高。
    • 远程访问(Remote Access):CPU 访问其他节点的内存,需要通过高速互连总线(如 Intel UPI, AMD xGMI),延迟高、带宽低。

2. 架构图

+----------------------+ +----------------------+ | Node 0 | | Node 1 | | +--------+-------+ | | +--------+-------+ | | | CPU0 | CPU1 | | | | CPU 2 | CPU3 | | | +--------+-------+ | | +--------+-------+ | | | | | | | | +--------------+ | | +---------------+ | | | 本地内存 A |<---|------|->| 本地内存 B | | | +--------------+ | 互连 | +--------------+ | +----------------------+ 总线 +----------------------+

3. 优点

  • 高可扩展性:通过增加节点可以轻松扩展 CPU 和内存容量,避免了单一总线的瓶颈。
  • 更高的内存带宽:每个节点都有自己的内存控制器和通道,总内存带宽随节点数线性增长。
  • 适合大规模系统:现代服务器、数据库、HPC(高性能计算)集群普遍采用 NUMA 架构。

4. 缺点与挑战

  • 架构复杂:硬件和操作系统(特别是调度器和内存管理器)的设计更复杂。
  • 编程模型复杂:为了获得最佳性能,应用程序需要具备 NUMA 意识(NUMA-aware),尽量让进程在其本地内存上分配和访问数据,避免昂贵的远程访问。
  • 性能不均衡:如果负载分配不当,可能会导致某些节点过载,而其他节点空闲,且跨节点通信开销大。

1.3、SMP 与 NUMA 关键对比

表格

特性

SMP (对称多处理)

NUMA (非一致性内存访问)

内存访问

统一 (UMA):所有 CPU 访问内存延迟/带宽相同

非统一:本地访问快,远程访问慢

可扩展性

:受限于共享总线带宽

:可通过增加节点线性扩展

适用场景

小型服务器、桌面电脑(核心数少)

大型服务器、数据中心、HPC(核心数多)

硬件复杂度

瓶颈

内存总线带宽

跨节点通信延迟


1.4、现代系统的实际情况

  • “纯” SMP 已罕见:即使是普通的消费级多核 CPU(如 Intel i7, AMD Ryzen),其内部也采用了类似 NUMA 的设计。例如,一个 CPU 封装内可能有多个 CCX(Core Complex),CCX 之间通过 Infinity Fabric 或 Ring Bus 互联,访问不同 CCX 的 L3 缓存或内存控制器会有微小的延迟差异。但在操作系统层面,通常仍将其视为一个 NUMA 节点(即 numactl --hardware 显示只有一个 node)。
  • 真正的 NUMA 系统:主要出现在双路(2P)、四路(4P)甚至更多路的服务器上。在这些系统中,每个物理 CPU 插槽通常对应一个 NUMA 节点。
  • 如何查看 Linux 系统的 NUMA 拓扑?
# 安装 numactl 工具 sudo apt-get install numactl # Debian/Ubuntu sudo yum install numactl # RHEL/CentOS
# 查看 NUMA 节点信息 numactl --hardware
# 查看详细的 CPU 和内存拓扑 lscpu

二、调度域和调度组

在 Linux 内核中,调度域(Scheduling Domain, SD)调度组(Scheduling Group, SG)是调度器(Scheduler)用来管理多核 CPU 负载均衡的核心数据结构。它们将系统中的所有 CPU 核心按照物理拓扑结构(如超线程、多核、NUMA 节点等)组织成一个层次化的树状结构,以便高效地进行任务迁移和负载平衡。

以下是对这两个概念的详细解析及举例:

2.1、 核心概念详解

调度域 (Scheduling Domain, SD)

  • 定义:调度域是 CPU 拓扑结构中某一层级的逻辑集合。它代表了一组共享某些硬件资源(如 L2/L3 缓存、内存控制器)的 CPU。
  • 作用:调度器在进行负载均衡时,会优先在较小的调度域内寻找空闲 CPU 或迁移任务,以减少跨域迁移带来的性能开销(如缓存失效、内存访问延迟)。
  • 特性:
    • 层次化:系统由多个层级的调度域组成(例如:SMT 级 -> Core 级 -> NUMA 级 -> System 级)。
    • 重叠性:不同层级的调度域可以重叠。一个 CPU 可以同时属于 SMT 域、Core 域和 NUMA 域。
    • 属性:每个调度域都有特定的标志位(flags),定义该域内的负载均衡策略(例如是否允许跨域迁移、是否开启负载均衡等)。

调度组 (Scheduling Group, SG)

  • 定义:调度组是调度域内的基本调度单元。在一个特定的调度域层级中,CPU 被划分为若干个互不重叠的组。
  • 作用:调度组是负载均衡算法直接操作的对象。调度器统计的是“组”的负载,而不是单个 CPU 的负载。当某个组负载过高时,调度器会尝试将任务迁移到同一调度域内负载较低的另一个组中。
  • 特性:
    • 互斥性:在同一个调度域层级内,调度组之间是互斥的(不重叠)。一个 CPU 在该层级只能属于一个调度组。
    • 从属关系:一个调度组从属于一个特定的调度域。
    • 包含关系:一个调度组通常包含一个或多个 CPU(或者是下一层级的调度域)。

SD 与 SG 的关系

  • 包含关系:一个调度域包含一个或多个调度组。
  • 视角差异:
    • 调度域定义了“在哪里”进行负载均衡(范围)。
    • 调度组定义了“谁”参与负载均衡(实体)。
  • 链表结构:
    • 同一 CPU 在不同层级的调度域通过 parent/child 指针连接成垂直的双向链表。
    • 同一调度域内的所有调度组通过 next 指针连接成水平的单向链表。

2.2、 实例演示:双路 NUMA 服务器

假设我们有一台服务器,配置如下:

  • 2 个 NUMA 节点 (Node 0, Node 1)
  • 每个节点有 2 个物理 CPU (Socket)
  • 每个 CPU 有 4 个核心 (Core)
  • 每个核心支持 2 线程 (SMT/Hyper-Threading)
  • 总逻辑 CPU 数 = 2 * 2 * 4 * 2 = 32 个逻辑 CPU (CPU 0 - CPU 31)

拓扑结构与调度域/组划分

Linux 调度器会建立如下层次结构(从下往上):

表格

层级 (Level)

名称

描述

调度域 (SD) 示例

调度组 (SG) 示例

Level 0

SMT

共享 L1/L2 缓存的兄弟线程

SD_SMT: 包含 CPU {0, 1}

SG_0: {CPU 0},SG_1: {CPU 1}
(注:在 SMT 层,通常每个线程视为一个组,或者整个 SMT 对视为一个组,具体取决于内核版本和配置,通常是为了平衡兄弟线程间的负载)

Level 1

MC(Multi-Core)

共享 L3 缓存的物理核心

SD_MC: 包含 CPU {0, 1, 2, 3, 4, 5, 6, 7} (即 Socket 0 的第一个 CPU 的所有核)

SG_Core0: {0, 1},SG_Core1: {2, 3} ...
(每个物理核心及其线程构成一个组)

Level 2

DIE/PKG

同一个物理封装 (Socket)

SD_PKG: 包含 CPU {0...15} (整个 Socket 0)

SG_CPU0: {0..7},SG_CPU1: {8..15}
(每个物理 CPU 芯片作为一个组)

Level 3

NUMA

共享本地内存的节点

SD_NUMA: 包含 CPU {0...31} (如果是单 NUMA) 或 {0...15} (如果是双 NUMA 隔离)

SG_Node0: {0..15},SG_Node1: {16..31}
(每个 NUMA 节点作为一个组)

Level 4

SYSTEM

整个机器

SD_SYSTEM: 包含所有 CPU {0...31}

SG_All: {0..31} (通常作为顶层兜底)

(注:实际内核中的层级名称可能略有不同,如 SD_SIBLING, SD_CORE, SD_NUMA 等)

负载均衡过程举例

假设CPU 0上的负载非常高,而CPU 2很空闲。

  1. SMT 层级检查:
    • 调度器查看 CPU 0 所在的 SMT 调度域(包含 CPU 0 和 CPU 1)。
    • 发现兄弟线程 CPU 1 也很忙。无法在 SMT 组内平衡。
  2. MC (多核) 层级检查:
    • 调度器向上遍历到 MC 调度域(包含 CPU 0-7)。
    • 在这个域内,它将 CPU 分组为 SG_Core0 ({0,1}), SG_Core1 ({2,3}) 等。
    • 发现 SG_Core0 负载高,SG_Core1 负载低。
    • 决策:将 CPU 0 上的一个进程迁移到 CPU 2 上。
    • 优势:因为 CPU 0 和 CPU 2 在同一个物理 CPU 内,共享 L3 缓存,迁移成本低,缓存命中率损失小。
  3. NUMA 层级检查(如果 MC 层无法平衡):
    • 假设 Socket 0 (CPU 0-15) 全部都很忙,而 Socket 1 (CPU 16-31) 空闲。
    • 调度器在 NUMA 调度域发现 SG_Node0 负载高,SG_Node1 负载低。
    • 决策:将任务迁移到 CPU 16。
    • 代价:这是一个跨 Socket 甚至跨 NUMA 节点的迁移。虽然平衡了负载,但新任务访问原内存数据时可能会发生远程内存访问(Remote Memory Access),延迟较高。调度器会权衡这种开销。

2.3、 如何查看系统中的调度域?

在 Linux 系统中,可以通过/proc/sys/kernel/sched_domain/目录查看当前系统的调度域配置(需要 root 权限且内核开启了相关 proc 接口,较新内核可能在/sys/devices/system/cpu/下):

# 查看 CPU 0 的调度域层级 ls /sys/devices/system/cpu/cpu0/topology/ --------------------------------------------------- # 查看具体的调度域参数 (如果内核支持) # 注意:不同发行版和内核版本路径可能不同 find /proc/sys/kernel/sched_domain/ -name "cpu0" #更直观的工具是使用 lstopo (来自 hwloc 包) 查看物理拓扑,这直接对应了调度域的构建基础: lstopo --no-io

总结

  • 调度域 (SD) 是地图,划定了负载均衡的“搜索范围”,遵循硬件拓扑以减少开销。
  • 调度组 (SG) 是玩家,是负载均衡算法中实际承载负载并参与比较的“单位”。
  • 这种机制确保了 Linux 在多核、多路、NUMA 架构下,既能充分利用所有 CPU 资源,又能尽可能让进程运行在离数据最近的地方(缓存亲和性与内存局部性)。
http://www.cnnetsun.cn/news/2897380.html

相关文章:

  • 编写程序录入家人过敏食材清单,搭配每日菜谱,自动规避致敏食物并提醒。
  • 3分钟掌握:高效实用的网易云音乐ncm转mp3完整指南
  • 海量SKU背后的管理黑洞:PLM如何终结配方、包材与成本的混乱状态?
  • 3个关键功能,让Snap Hutao成为你原神冒险的最佳伙伴
  • 别再让单片机直接驱动电机了!用ULN2003驱动步进电机的保姆级教程(附Arduino代码)
  • 物流全自动包装产线PLC控制系统设计23(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • TCP 与 UDP:从核心区别到面试必问的可靠性机制
  • 深度解析ExplorerPatcher:3大实战技巧让你的Windows桌面效率提升50%
  • 嵌入式安全实践:基于IEC 60730标准的MCU硬件特性与软件自检设计
  • 终极NES模拟器Mesen完全指南:从怀旧游戏到专业调试的完整解决方案
  • 从‘金银岛’到背包问题:贪心算法的适用边界与实战场景分析
  • 【CANdelaStudio-从入门到深入到实战】01 开篇:为什么你写的诊断代码总被退回来?
  • Fast-GitHub浏览器插件架构解析:国内GitHub访问优化实现原理
  • DRG Save Editor:如何轻松管理你的深岩银河游戏存档?
  • 自建量化回测系统完全指南 (上):四大技术栈与主流开源框架深度对比
  • 微信数据库解密完整指南:3步掌握AES-256加密破解技术
  • 计算机毕业设计之一款在线实验报告软件的设计
  • CANdevStudio:零成本开启你的CAN总线仿真开发之旅
  • 终极透明浏览器:Glass Browser完整使用指南与最佳实践
  • PyTorch模型部署避坑指南:torch.load加载模型时,map_location参数到底该怎么设?
  • 告别资源焦虑:用Snap Hutao智能工具箱重构你的原神游戏体验
  • 汽车仪表盘MCU异构多核架构解析:从Cortex-A/M到ASIL-B功能安全
  • UWB波形还能‘调音’?手把手教你玩转802.15.4z的LCP脉冲组合
  • i.MX 6SoloX异构处理器开发实战:A9与M4协同、安全启动与性能优化
  • 终极实战指南:掌握TEB局部路径规划器的15个关键配置技巧
  • 5分钟打造你的专属Jupyter主题:告别单调代码的终极指南
  • DistroAV网络视频传输终极指南:3步实现多设备无线直播协作
  • 四川AI开发服务商:统好AI平台CRM功能解析
  • MonkeyCode Agent深度解析:AI如何自主完成从编码到部署
  • OpenCore Legacy Patcher四步法终极指南:让老Mac完美升级最新macOS并修复显卡驱动