libnuma提供的内存策略

libnuma提供的内存策略

libnuma提供的内存策略 #

所谓内存策略就是 CPU 访问内存节点的策略,分为先访问本地节点、先访问远程节点、只能访问本地节点等等。内存策略是 libnuma 提供的最主要的功能。现在实现的内存策略主要有 4 种,如下表所示:

在了解了内存策略之后,我们可以使用 set_mempolicy 接口来对进程的内存策略进行调整,这里用一个实际举例来展示这些 API 的功能。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <numa.h>
#include <numaif.h>
#include <unistd.h>
#include <sys/mman.h>
#define N ((1UL << 38) / sizeof(int)) // 128GB
int main() {
  uint64_t num_nodes = numa_num_configured_nodes();
  uint64_t all_nodes_mask = (1 << numa_num_configured_nodes()) - 1;
  uint64_t my_nodes_mask = all_nodes_mask ^ 0b0110;
  set_mempolicy(MPOL_BIND, &my_nodes_mask, 1);
  // allocate large array and write to it
  int *a = malloc(N * sizeof(int));
  for (size_t i=1; i < N; i++) {
    a[i] = 1;
  }
  free(a);
  return 0;
}

在上面的例子中我们分配了一个比较大的内存,你在实际测试过程中可以根据自己机器上的内存节点大小进行调整即可(修改第 9 行左移的位数),使它接近一个内存节点的空闲内存大小。

你可以在不同机器上使用不同策略(修改代码的第 16 行第一个参数),来验证内存策略的效果。不同架构 CPU 在内存策略上的实现还是有较大的不同的, aarch64 平台和 x86 平台的差异比较明显,如果你有兴趣的话,可以自行尝试。更多关于 libnuma API 的说明可以参考附录给出的文档。

Viewpoint #

From #