我试图在Dockerfile官方回购的基础上为内存中的MongoDB创建/蒙戈/。
在dockerfile-entrypoint.sh中,我遇到了:
numa='numactl --interleave=all'
if $numa true &> /dev/null; then
set -- $numa "$@"
fi基本上,当numactl --interleave=all存在时,它会将numactl添加到原始的docker命令中。
但我不太明白NUMA的政策。您能解释一下NUMA的真正含义吗?--interleave=all代表什么?
为什么我们需要使用它来创建MongoDB实例呢?
发布于 2015-10-24 09:34:23
The 手册页提到
libnuma库为Linux内核支持的NUMA (非统一内存访问)策略提供了一个简单的编程接口。在NUMA体系结构中,一些内存区域具有与其他内存区域不同的延迟或带宽。
这并不适用于所有的体系结构,这就是为什么第14期确保只在numa机器上调用numa。
正如“将默认numa策略设置为“交错”系统。”中所解释的:
似乎大多数推荐显式numactl定义的应用程序要么创建libnuma库调用,要么在包装器脚本中合并numactl。
interleave=all缓解了像卡桑德拉这样的应用程序遇到的问题(一个分布式数据库,用于管理跨许多商品服务器的大量结构化数据):
默认情况下,Linux试图在内存分配方面保持智能,以便数据接近其运行的NUMA节点。对于大型数据库类型的应用程序来说,如果优先级是避免磁盘I/O,特别是使用Cassandra,那么这并不是最好的方法,我们无论如何都是多线程的,而且没有特别的理由相信一个NUMA节点比另一个节点“更好”。 在NUMA节点之间分配不均匀的后果可能包括内核试图分配内存时过多的页面缓存清除--比如重新启动JVM。
有关更多信息,请参见"MySQL“交换疯狂”问题及NUMA体系结构的影响“
没有努马
在基于NUMA的系统中,内存被划分为多个节点,系统应该如何处理这一点并不一定简单。 系统的默认行为是在同一个节点上分配内存,就像线程被调度在同一节点上一样,这对于少量的内存很有效,但是当您想要分配超过一半的系统内存时,甚至在一个NUMA节点上都无法在物理上这样做:在一个两个节点的系统中,每个节点中只有50%的内存。

与努马:
解决这一问题的一个简单方法是交错分配的内存。如上文所述,使用numactl可以做到这一点:
# numactl --interleave all command我提到了在评论中,numa枚举硬件来理解物理布局。然后将处理器(而不是核心)划分为“节点”。
对于现代的PC处理器来说,这意味着每个物理处理器都有一个节点,而不管现在的核数如何。
正如格里斯托·伊里耶夫指出的那样,这有点过于简单化了:
拥有更多核心的AMD实际上是双向NUMA系统,有两个HT (HyperTransport)-interconnected芯片,在一个物理包中有自己的内存控制器。 另外,具有10个或更多核心的Intel Haswell-EP CPU具有两个高速缓存相关的环形网络和两个内存控制器,并且可以以一种在芯片上群集的方式运行,而这种模式本身就是一个双向NUMA系统。 更明智的说法是,- NUMA节点是一些可以直接到达某些内存的核,而无需经过HT、 QPI (QuickPath )、NUMAlink或其他互连。

https://stackoverflow.com/questions/33315950
复制相似问题