我正在尝试基于https://hub.docker.com/_/mongo/的官方回购为内存中的MongoDB创建Actual Year in Calendar object: 190728635
Maximum Year: 292278994
Maximum Integer: 2147483647
。
我在Dockerfile
遇到过:
dockerfile-entrypoint.sh
基本上,当numa='numactl --interleave=all'
if $numa true &> /dev/null; then
set -- $numa "$@"
fi
存在时,它会将numactl --interleave=all
添加到原始docker命令。
但我真的不明白这个NUMA政策的事情。你能否解释一下NUMA的真正意义,numactl
代表什么?
为什么我们需要用它来创建MongoDB实例?
答案 0 :(得分:7)
libnuma库为Linux内核支持的NUMA(非统一内存访问)策略提供了一个简单的编程接口。在NUMA架构上,某些内存区域具有与其他内存区域不同的延迟或带宽。
这并非适用于所有体系结构,这就是issue 14确保仅在numa机器上调用numa的原因。
如" Set default numa policy to “interleave” system wide":
中所述似乎推荐显式numactl定义的大多数应用程序都会生成libnuma library call或在a wrapper script中合并numactl。
# numactl --interleave all command
缓解了应用程序遇到的问题,例如 cassandra (用于管理跨多个商品服务器的大量结构化数据的分布式数据库):
默认情况下,Linux会尝试熟悉内存分配,以便数据靠近运行它的NUMA节点。对于大型数据库类型的应用程序,如果优先级是避免磁盘I / O,则这不是最好的做法。特别是对于Cassandra,无论如何我们都是多线程的,并且没有特别的理由相信一个NUMA节点是更好的"而不是另一个。
在NUMA节点之间分配不均匀的后果可能包括在内核尝试分配内存时过多的页面缓存逐出 - 例如在重新启动JVM时。
有关详情,请参阅" The MySQL “swap insanity” problem and the effects of the NUMA architecture"
没有numa
在基于NUMA的系统中,内存被划分为多个节点,系统应如何处理这一点并不一定是直截了当的。
系统的默认行为是在调度运行的线程的同一节点中分配内存,这适用于少量内存,但是当你想分配超过一半的系统内存时,它不再是物理内存甚至可以在单个NUMA节点中执行:在双节点系统中,每个节点中只有50%的内存。
使用Numa:
一个简单的解决方案是交错分配的内存。使用如上所述的numactl可以做到这一点:
{{1}}
我提到in the comments numa枚举硬件以理解物理布局。然后将处理器(而不是核心)划分为“节点” 对于现代PC处理器,这意味着每个物理处理器只有一个节点,而不管存在的核心数量。
这有点过分简化,正如Hristo Iliev所指出的那样:
具有更多内核数量的AMD Opteron CPU实际上是双向NUMA系统,它们具有两个HT (HyperTransport) - 互连的裸片,在单个物理封装中具有自己的内存控制器。 此外,具有10个或更多内核的Intel Haswell-EP CPU配有两个高速缓存一致的环网和两个内存控制器,可以在片上集群模式下运行,该模式本身就是一个双向NUMA系统。更明智的是, NUMA节点是一些可以直接访问某些内存而无需通过HT,QPI (QuickPath_Interconnect),NUMAlink或其他互连的内核。