如何在 NUMA 机器上启动 MongoDB?

如何在 NUMA 机器上启动 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]

它不再自动启动。

所以现在我必须输入:

echo 0 > /proc/sys/vm/zone_reclaim_mode && numactl --interleave=all /usr/bin/mongod --config /etc/mongodb.conf &

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

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

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

答案1

如果您手动启动了服务,Upstart 无法停止或重新启动它。您需要更新 mongodb 的 upstart 脚本,以便它使用您所需的选项启动,然后使用 启动它service mongodb start

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

vm.zone_reclaim_mode = 0

/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

变成:

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

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

答案2

对于 ubuntu 16.04 mongod.service 文件应该类似于

[Unit]
Description=High-performance, schema-free document-oriented database
After=time-sync.target network.target

[Service]
Type=forking
User=mongod
Group=mongod
LimitNOFILE=65000
PermissionsStartOnly=true
EnvironmentFile=/etc/default/mongod
ExecStartPre=/usr/bin/percona-server-mongodb-helper.sh
ExecStart=/usr/bin/env bash -c "numactl --interleave=all /usr/bin/mongod $OPTIONS > ${STDOUT} 2> ${STDERR}"
#ExecStart=/usr/bin/env bash -c "/usr/bin/mongod $OPTIONS > ${STDOUT} 2> ${STDERR}"
PIDFile=/var/run/mongod.pid

[Install]
WantedBy=multi-user.target

您还可以使用 LimitNOFILE 参数指定无文件限制

答案3

Ubuntu MongoDB upstart 脚本现在检查numactl二进制文件是否存在并进行相应调整。

使用 Ubuntu 14.04 LTS 和 MongoDB 2.6 可以按如下方式修复 NUMA 警告:

sudo apt-get -y install numactl
sudo restart mongod

答案4

我知道问题是关于的upstart,但以防万一有人(像我一样)需要init.d解决方案:

用下面的代码 替换start_server()函数/etc/init.d/mongodb

start_server() {
    test -e "$RUNDIR" || install -m 755 -o mongodb -g mongodb -d "$RUNDIR"

    NUMACTL=$(which numactl)

    if [ ! "$NUMACTL" ]; then
        # start original
        start-stop-daemon --background --start --quiet --pidfile $PIDFILE --make-pidfile --chuid $DAEMONUSER --exec $DAEMON -- $DAEMON_OPTS
        errcode=$?
        return $errcode
    else
        # Start the process using the wrapper
        $NUMACTL --interleave=all -- start-stop-daemon --background --start --quiet --pidfile $PIDFILE --make-pidfile --chuid $DAEMONUSER --exec $DAEMON -- $DAEMON_OPTS
        errcode=$?
        return $errcode
    fi
}

相关内容