Skip to content

模型Model

NUMA内存位置与迁移成本

NUMA memory placement · First-touch allocation · NUMA page migration

把页框所有权与节点距离分开,计算首次实际触页的放置、优先和绑定策略,以及线程位置变化下迁移页内容的回本门槛。

一页内存分配正确、内容也正确,访问它的处理器仍可能要经过更远的链路。物理页框分配决定哪些帧可交付;NUMA还给每帧附上位置,使“放在哪”成为独立的成本问题。

形式陈述 ​

页在哪里,执行它的线程又在哪里 ​

NUMA是非均匀内存访问:从不同处理器位置访问同一内存节点,延迟、可用带宽等成本可能不同。教学MEM-16分成两个节点:N0管理页框0到7,N1管理8到15。两边CPU都能正确访问全部页框;本例仅规定跨节点更贵,没有把远端内存当成不可访问。

对一次访问记录CPU节点 c、页所在节点 n 和成本 L(c,n)。本例取本地100、远端180个成本单位。值为固定参数,不是某机型纳秒实测;忽略缓存命中、带宽拥塞、预取和其他并行开销,以便单独复算位置的作用。

迁移线程改变CPU执行位置,页内容未必移动;迁移页面把内容复制到另一节点的帧,并更新所有相关映射,虚拟地址可以保持不变。两个动作改变不同坐标。线程移到N1后,原来在N0的页不会因为变量指针没变,就自动变成N1本地页。

直觉

第一次真正取页,才决定初始位置 ​

在本页的按需匿名分配模型中,预留虚地址时不立即取物理页。线程第一次写入某页触发实际分配,若采用本地优先且有合格空间,就从当时执行CPU附近的节点拿页。这种first-touch说的是触发实际分配的访问;只读共享零页、文件映射或已有驻留页不必遵循这条简化轨迹。

假设一个初始化线程在N0依次写满8页,然后N1上的工作线程反复计算。按照上述合同,初始页全在N0,后续计算会访问远端。若让两节点的工作线程分别首次写入自己将长期使用的4页,则可在两边各放4页。实际收益还取决于任务分工能否持续、线程是否迁移及页面是否共享。

程序调用分配函数的那个时刻,未必就是所有物理页的首次分配时刻。若库已经复用了旧页,或系统提前分配,后来再写并不会重新选节点。因此解释first-touch实验,需要确认初态,而不是只看代码中谁调用了分配函数。

例子与边界

同一CPU位置下,迁移要用多少次访问偿还 ​

一页当前在N0,此后线程固定在N1。把它迁到N1一次需8000单位,之后每次访问从180降到100。若未来还有 m 次访问,不迁移成本为 180m,迁移成本为 8000+100m。迁移严格更便宜当且仅当

80m>8000,m>100.

所以整数访问次数至少101。恰好100次时两者都为18000,只是打平;99次时迁移仍亏80。只报“访问很多次值得迁”不如把一次成本和每次收益放进同一单位里核算。

未来访问位置决定迁移收益

如果另一半访问来自原节点 ​

现在不再假设全部访问来自N1。未来 m 次中,有比例 α 从N1发出,其余从N0发出。保持在N0时,每次平均成本为 100+80α;迁到N1后为 180−80α。不计迁移费的每次净节省为

80(2α−1).

当 α=3/4 时,每次只省40。条件变成 40m>8000,即 m>200;若精确要求总次数里恰有四分之三来自N1,则m还必须为4的倍数,最小可实现整数轨迹为204次,来自N1的153次和N0的51次。若 α 仅表示独立访问位置的概率,则201次在期望成本上已有正收益,两种说法的样本合同不同。

若 α=1/2,两种放置的平均访问成本相同,迁移只增加费用;若小于1/2,迁到N1还会使访问本身更贵。一次短采样里“最近大都在N1”不是未来比例的保证,反复追逐短时热点可能把收益全部花在来回迁移上。

位置偏好与合法节点集 ​

设N1暂时没有合格空闲页。本地优先政策可以尝试N1,失败后退到N0;严格只允许N1的绑定政策则不能通过远端回退来满足请求。前者获得较贵但合法的页,后者可能等待、回收或失败。两种接口向调用者承诺的内容不同。

分区与保留预算可作为每个候选节点内部的资格检查工具。距离最近的节点若没有设备可寻址的区、没有所需连续块,或不允许动用保留页,也不能仅凭“本地更快”就使用。节点位置和区的访问约束是可以同时存在的两层属性。

Linux的NUMA策略文档将MPOL_PREFERRED与MPOL_BIND明确区分:前者允许在偏好失败后寻找其他节点,后者把分配限制在给定集合中。实际还受cpuset及具体映射类型等约束。这里引用它们说明合同差异,不把两节点教学例子当完整内核策略实现。

推论与应用

页迁移需要保住内容和映射 ​

把N0页复制到N1空帧后,不能立即把旧帧交给别人。若另一个线程仍持有旧TLB翻译,它可能继续向旧帧写入,使副本落后甚至破坏新的所有者。实际迁移要协调并发访问、复制时机、页表更新和相关翻译失效,只有旧引用都不能再使用后才回收旧帧。

只读共享页也不代表可无条件随意复制:新增副本改变驻留量与映射管理。可写共享页若存在多个独立副本,还需要额外的一致性合同。本页只迁移同一逻辑页的物理位置,不引入复制协议。

数据缓存一致性保证相关访问观察到应有的数据变化,并不承诺访问成本均匀。一个跨节点共享的频繁写变量可以逻辑上完全正确,却仍因数据移动或争用变慢。要研究这种行为,需要扩展当前忽略缓存的100/180模型。

把决定写成可推翻的预测 ​

一份放置建议应同时说明当前页位置、未来CPU位置分布、预计剩余访问次数、一次迁移代价与可用目标帧。之后若线程被重新调度、任务进入新阶段或迁移耗时高于估计,原收益判断应重新计算。指针地址和进程名称不包含这些信息。

整个MEM-16单元的终点见容量、连续性与局部性练习:分别判断数量、形状、资格、驻留、翻译和位置,给每个结论附上能复算的轨迹或不等式。它们都影响“内存表现”,但需要不同证据。

参考资料
关系图谱4 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系