通过numactl作为守护进程启动mongodb
我试图让mongodb作为守护进程在NUMA机器上启动。当我运行时通过numactl作为守护进程启动mongodb
numactl --interleave=all mongod &
Mongo启动并正常运行,但所有的输出仍显示出来。 (例如,星期五06月22 12时10分29秒[initandlisten]从127.0.1.1:51837接受的连接)
然而,当我自行启动蒙戈(如下文),它失败(下面原木):
service mongodb start
我获取日志中的以下
Fri Jun 22 12:08:41 [initandlisten] MongoDB starting : pid=3348 port=27017 dbpath=/var/lib/mongodb 64-bit host=beckett
Fri Jun 22 12:08:41 [initandlisten]
Fri Jun 22 12:08:41 [initandlisten] ** WARNING: You are running on a NUMA machine.
Fri Jun 22 12:08:41 [initandlisten] ** We suggest launching mongod like this to avoid performance problems:
Fri Jun 22 12:08:41 [initandlisten] ** numactl --interleave=all mongod [other options]
Fri Jun 22 12:08:41 [initandlisten]
Fri Jun 22 12:08:41 [initandlisten] db version v2.0.6, pdfile version 4.5
Fri Jun 22 12:08:41 [initandlisten] git version: e1c0cbc25863f6356aa4e31375add7bb49fb05bc
Fri Jun 22 12:08:41 [initandlisten] build info: Linux ip-10-110-9-236 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41
Fri Jun 22 12:08:41 [initandlisten] options: { auth: "true", command: [ "run" ], config: "/etc/mongodb.conf", dbpath: "/var/lib/mongodb", logappend: "true", logpath: "/var/log/mongodb/mongodb.log" }
Fri Jun 22 12:08:41 [initandlisten] journal dir=/var/lib/mongodb/journal
Fri Jun 22 12:08:41 [initandlisten] recover : no journal files present, no recovery needed
Fri Jun 22 12:08:42 [initandlisten] couldn't open /var/lib/mongodb/admin.ns errno:13 Permission denied
Fri Jun 22 12:08:42 [initandlisten] error couldn't open file /var/lib/mongodb/admin.ns terminating
Fri Jun 22 12:08:42 dbexit:
Fri Jun 22 12:08:42 [initandlisten] shutdown: going to close listening sockets...
Fri Jun 22 12:08:42 [initandlisten] shutdown: going to flush diaglog...
Fri Jun 22 12:08:42 [initandlisten] shutdown: going to close sockets...
Fri Jun 22 12:08:42 [initandlisten] shutdown: waiting for fs preallocator...
Fri Jun 22 12:08:42 [initandlisten] shutdown: lock for final commit...
Fri Jun 22 12:08:42 [initandlisten] shutdown: final commit...
Fri Jun 22 12:08:42 [initandlisten] shutdown: closing all files...
Fri Jun 22 12:08:42 [initandlisten] closeAllFiles() finished
Fri Jun 22 12:08:42 [initandlisten] journalCleanup...
Fri Jun 22 12:08:42 [initandlisten] removeJournalFiles
Fri Jun 22 12:08:42 [initandlisten] shutdown: removing fs lock...
Fri Jun 22 12:08:42 dbexit: really exiting now
我不知道该怎么admin.ns可能有权限问题,而我作为root运行,或为什么包裹在numactl的时候就OK启动。理想情况下,我想使用numactl的在START_SERVER()函数,就像这样:
start_server(){
/usr/bin/numactl --interleave=all -- \
start-stop-daemon --background --start --quiet --pidfile $PIDFILE \
--make-pidfile --chuid $DAEMONUSER \
--exec $DAEMON -- $DAEMON_OPTS
errcode=$?
return $errcode
}
底线,我怎么能得到蒙戈开始为NUMA机器上的后台?
原来我的问题是的NUMA和权限问题的组合。谢谢@Mark的帮助。要启动MongoDB的作为一个NUMA设置一个守护进程,用以下替换/etc/init.d/mongodb的START_SERVER()函数:
start_server() {
# check for numactl
NUMACTL=$(which numactl)
if [ -n "$NUMACTL" ]; then
DAEMON_OPTS="--interleave=all ${DAEMON} ${DAEMON_OPTS}"
DAEMON="$NUMACTL"
fi
# Start the process using the wrapper
/usr/bin/numactl --interleave=all -- \
start-stop-daemon --background --start --quiet --pidfile $PIDFILE \
--make-pidfile --chuid $DAEMONUSER \
--exec $DAEMON -- $DAEMON_OPTS
errcode=$?
return $errcode
}
我' m没有运行NUMA系统AFAIK,所以这对于OP来说可能是无关紧要的,但是如果它对任何人都有帮助......至少在Ubuntu上,MongoDB数据目录中所有文件的所有权(在Ubuntu上默认的数据目录是/ var/lib/mongodb)应该是mongodb:nogroup。不知怎的,我的设置为root:root(可能是因为我手动运行mongod来测试某些内容);更改所有权使'sudo start mongodb'(和'sudo service start mongodb '')再次正常工作 –
所以,这是一个修复它的命令:'sudo chown -R mongodb:nogroup/var/lib/mongodb/*'注意/ var/lib/mongodb是Ubuntu的默认设置,可能不是其他发行版的设置; MongoDB自己的默认数据目录i s/data/db。 –
我认为你知道关于'mongo & numa'的常见警告(http://www.mongodb.org/display/DOCS/NUMA),所以我不会继续谈论它们。
下面是一个numa样本upstart配置文件 - https://gist.github.com/1364716。
在此基础上Google Group thread,以下行添加到在init脚本START_SERVER功能,它是成功的 -
start_server() {
# check for numactl
NUMACTL=$(which numactl)
if [ -n "$NUMACTL" ]; then
DAEMON_OPTS="--interleave=all ${DAEMON} ${DAEMON_OPTS}"
DAEMON="$NUMACTL"
fi
# Start the process using the wrapper
这是我在帖子中找到start_service函数的组,但是我得到了“无法打开/ var/lib/mongodb/admin。ns errno:13权限被拒绝“错误当我尝试”服务mongodb启动“与”检查numactl“和”启动过程使用包装“代码位包括 – Libby
很酷,很高兴听到它的所有工作:) –
两个以上的解决方案为我所做的没有工作,所以这里如下什么让我的MongoDB的运行:
更换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
}
Ubuntu的14
# apt-get -y install numactl
添加到/etc/sysctl.conf线vm.zone_reclaim_mode = 0
# sysctl -p
# service mongod restart
的Ubuntu 16.04
[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
参见http://unix.stackexchange.com/questions/ 187474 /,它考虑了近几年对MongoDB软件包的一些更改。 – JdeBP