当我第一次使用 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
}