Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker中的Mongodb:numactl——interleave=all解释_Mongodb_Docker_Numa_Numactl - Fatal编程技术网

Docker中的Mongodb:numactl——interleave=all解释

Docker中的Mongodb:numactl——interleave=all解释,mongodb,docker,numa,numactl,Mongodb,Docker,Numa,Numactl,我正试图根据官方的回购协议为内存中的MongoDB创建Dockerfile 在dockerfile entrypoint.sh中,我遇到了: numa='numactl --interleave=all' if $numa true &> /dev/null; then set -- $numa "$@" fi 基本上,当numactl存在时,它将numactl--interleave=all预先添加到原始docker命令 但我真的不明白NUMA的政策。你能解释一下NUM

我正试图根据官方的回购协议为内存中的MongoDB创建
Dockerfile

dockerfile entrypoint.sh
中,我遇到了:

numa='numactl --interleave=all'
if $numa true &> /dev/null; then
    set -- $numa "$@"
fi
基本上,当
numactl
存在时,它将
numactl--interleave=all
预先添加到原始docker命令

但我真的不明白NUMA的政策。你能解释一下NUMA的真正含义吗?它代表什么

为什么我们需要使用它来创建MongoDB实例

libnuma库为Linux内核支持的NUMA(非统一内存访问)策略提供了一个简单的编程接口。在NUMA体系结构上,某些内存区域的延迟或带宽与其他内存区域不同

这并不适用于所有体系结构,这就是为什么要确保只在numa机器上调用numa

如“”所述:

似乎大多数推荐显式numactl定义的应用程序要么在中创建或合并numactl


interleave=all
缓解了像这样的应用程序遇到的问题(用于跨多个商品服务器管理大量结构化数据的分布式数据库):

默认情况下,Linux会尝试在内存分配方面保持智能,以便数据靠近运行它的NUMA节点。对于大型数据库类型的应用程序,如果优先考虑的是避免磁盘I/O,那么这不是最好的做法。特别是对于Cassandra,我们无论如何都是多线程的,没有特别的理由相信一个NUMA节点比另一个“更好”

在NUMA节点之间分配不均的后果可能包括当内核尝试分配内存时(例如重新启动JVM时),页面缓存被过度逐出

有关详细信息,请参见“”

没有numa

在基于NUMA的系统中,内存被划分为多个节点,系统应该如何处理这一点并不一定简单。
系统的默认行为是在调度线程运行时在同一节点中分配内存,这对少量内存很有效,但当您想要分配超过一半的系统内存时,甚至在单个NUMA节点中都无法再进行分配:在双节点系统中,每个节点中只有50%的内存

使用Numa:

一个简单的解决方案是交错分配的内存。如上所述,可以使用numactl执行此操作:


我提到numa枚举硬件以了解物理布局。然后将处理器(而非核心)划分为“节点”。
对于现代PC处理器,这意味着每个物理处理器有一个节点,而不管存在多少个内核

正如所指出的,这有点过于简化了:

拥有更多内核的AMD Opteron CPU实际上是独立的2路NUMA系统,具有两个互连的芯片,在单个物理包中具有自己的内存控制器。
此外,具有10个或更多内核的Intel Haswell EP CPU配备了两个高速缓存相干环网和两个内存控制器,可以在片上群集模式下运行,这表现为一个双向NUMA系统

更明智的说法是,NUMA节点是一些可以直接访问某些内存而无需经过HT、NUMAlink或其他互连的内核


此处的“节点”是物理内存设备吗?或者某种仅存在于NUMA系统上的逻辑除法原语?@mkurnikov NUMA列举硬件以了解物理布局。然后将处理器(而非核心)划分为“节点”。对于现代PC处理器,这意味着每个物理处理器有一个节点,而不管存在多少个内核。@VonC,您最后的评论并不完全正确。拥有更多内核的AMD Opteron CPU实际上是独立的2路NUMA系统,具有两个HT互连管芯,在单个物理包中具有自己的内存控制器。此外,具有10个或更多内核的Intel Haswell EP CPU配备了两个高速缓存相干环网和两个内存控制器,可以在片上群集模式下运行,这表现为一个双向NUMA系统。更明智的说法是,NUMA节点是一些可以直接访问某些内存的内核,而无需经过HT、QPI、NUMAlink或其他互连。@HristoIliev感谢您的评论(为了更直观,我在答案中包含了它,并提供了一些定义HT和QPI的链接)。我同意我最初的评论是基于对CPU架构的过度简化。
# numactl --interleave all command