mku*_*kov 4 numa mongodb docker numactl
我正在尝试Dockerfile基于https://hub.docker.com/_/mongo/上的官方回购创建内存中的MongoDB .
在dockerfile-entrypoint.sh我遇到过:
numa='numactl --interleave=all'
if $numa true &> /dev/null; then
set -- $numa "$@"
fi
Run Code Online (Sandbox Code Playgroud)
基本上它存在numactl --interleave=all于原始docker命令之前numactl.
但我真的不明白这个NUMA政策的事情.你能否解释一下NUMA的真正含义,以及它--interleave=all代表什么?
为什么我们需要使用它来创建MongoDB实例?
该手册页提到:
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的系统中,内存被划分为多个节点,系统应如何处理这一点并不一定是直截了当的.
系统的默认行为是在调度运行的线程的同一节点中分配内存,这适用于少量内存,但是当你想分配超过一半的系统内存时,它不再是物理内存甚至可以在单个NUMA节点中执行此操作:在双节点系统中,每个节点中只有50%的内存.
与Numa:
一个简单的解决方案是交错分配的内存.如上所述,可以使用numactl执行此操作:
# numactl --interleave all command
Run Code Online (Sandbox Code Playgroud)
我在评论中提到numa枚举硬件以理解物理布局.然后将处理器(而不是核心)划分为"节点".
对于现代PC处理器,这意味着每个物理处理器有一个节点,而不管存在的核心数量.
正如Hristo Iliev指出的那样,这有点过分简化了:
具有更多内核数量的AMD Opteron CPU实际上是双向NUMA系统,两个HT(HyperTransport)连接的芯片在一个物理封装中具有自己的内存控制器.
此外,具有10个或更多内核的Intel Haswell-EP CPU配有两个高速缓存一致的环网和两个内存控制器,可以在片上集群模式下运行,该模式本身就是一个双向NUMA系统.更明智的是,NUMA节点是一些可以直接访问某些内存而无需通过HT,QPI(QuickPath_Interconnect),NUMAlink或其他互连的内核.
| 归档时间: |
|
| 查看次数: |
5767 次 |
| 最近记录: |