我应该如何在 NUMA 机器上启动 MongoDB?

res*_*ing 6 upstart mongodb

当我第一次使用 apt-get 安装 MongoDB 2.2.3 时,按照 10gen 安装指南中的说明,它会在服务器启动时自动启动。

但是,按照 /var/log/mongodb/mongodb.log 中的说明进行操作后:

Tue Apr 30 11:35:28.643 [initandlisten] ** WARNING: You are running on a NUMA machine.
Tue Apr 30 11:35:28.643 [initandlisten] **          We suggest launching mongod like this to avoid performance problems:
Tue Apr 30 11:35:28.643 [initandlisten] **              numactl --interleave=all mongod [other options]
Tue Apr 30 11:35:28.643 [initandlisten]
Tue Apr 30 11:35:28.643 [initandlisten] ** WARNING: /proc/sys/vm/zone_reclaim_mode is 1
Tue Apr 30 11:35:28.643 [initandlisten] **          We suggest setting it to 0
Tue Apr 30 11:35:28.643 [initandlisten] **          http://www.kernel.org/doc/Documentation/sysctl/vm.txt
Tue Apr 30 11:35:28.643 [initandlisten]
Run Code Online (Sandbox Code Playgroud)

它不再自动启动。

所以现在我必须输入:

echo 0 > /proc/sys/vm/zone_reclaim_mode && numactl --interleave=all /usr/bin/mongod --config /etc/mongodb.conf &
Run Code Online (Sandbox Code Playgroud)

每次在终端中手动启动它。

但是,我怀疑以这种方式启动它也会导致service mongodb stop/restart失败。它会抛出一个stop: Unknown instance:错误。

有没有适当的方法来解决这个问题?

Dav*_*rds 7

如果您手动启动,Upstart 无法停止或重新启动您的服务。您需要更新 mongodb 的 upstart 脚本,使其以您需要的选项开始,然后以service mongodb start.

首先,由于 zone_reclaim_mode 设置是系统范围的而不是特定于 mongodb 的,因此您可以添加以下行:

vm.zone_reclaim_mode = 0
Run Code Online (Sandbox Code Playgroud)

to /etc/sysctl.conf,它在启动时配置系统变量。

接下来,您需要更新 upstart 用于启动 mongodb 的脚本/etc/init/mongodb.conf,以便它用numactl命令包装普通命令。所以这一行:

if [ "x$ENABLE_MONGODB" = "xyes" ]; then exec start-stop-daemon --start --quiet --chuid mongodb --exec  /usr/bin/mongod -- --config /etc/mongodb.conf; fi
Run Code Online (Sandbox Code Playgroud)

变成:

if [ "x$ENABLE_MONGODB" = "xyes" ]; then exec start-stop-daemon --start --quiet --chuid mongodb --exec  /usr/bin/numactl -- --interleave=all /usr/bin/mongod --config /etc/mongodb.conf; fi
Run Code Online (Sandbox Code Playgroud)

您还提到 upstart 不会在启动时自动启动您的服务;如果在进行上述更改后仍然发生这种情况,请附上/var/log/mongodb/mongodb.log失败启动的完整摘录。