简介
NUMA使用的目的是为了每个进程能使用local内存来实现高性能。但是假如某进程的local内存提前用完了,会导致无法使用其他进程的内存,反而需要SWAP的问题。(一般小例子遇不到)
https://blog.51cto.com/quantfabric/2594323
https://www.cnblogs.com/machangwei-8/p/10402644.html
NUMA的内存分配策略
- 缺省(default):总是在本地节点分配(分配在当前进程运行的节点上);
- 绑定(bind):强制分配到指定节点上;
- 交叉(interleave):在所有节点或者指定的节点上交织分配;
- 优先(preferred):在指定节点上分配,失败则在其他节点上分配。
因为NUMA默认的内存分配策略是优先在进程所在CPU的本地内存中分配,会导致CPU节点之间内存分配不均衡,当某个CPU节点的内存不足时,会导致swap产生,而不是从远程节点分配内存。这就是所谓的swap insanity 现象。
1 | $ numactl --hardware |
常见命令
1 | # 遇到内存不够时 |
查看程序的内存的 NUMA情况
在Linux系统上,可以通过以下常用方法来查看和分析程序的NUMA(非统一内存访问)情况:
1 | numastat:查看进程和每个NUMA节点的内存分配和访问统计。 |
通过综合使用这些工具,可以全面分析程序的NUMA性能,例如内存分布不均,访问模式导致的不均衡等,然后进行针对优化。
c++ malloc时能手动设置 内存位置
- libnuma: 直接调用libnuma提供的
numa_alloc_onnode()
和numa_free()
等API,在指定节点上分配释放内存。 - mmap
需要进一步的研究学习
暂无
遇到的问题
暂无