我正在尝试让mongodb作为守护进程在NUMA计算机上启动。我跑的时候
numactl --interleave=all mongod &
Mongo启动并正常运行,但所有输出仍然显示。 (例如,Fri Jun 22 12:10:29 [initandlisten]连接从127.0.1.1:51837接受)
然而,当我自己启动mongo时(如下所示),它失败了(记录如下):
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中包装时启动正常。理想情况下,我想在start_server()函数中使用numactl,如下所示:
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
}
最重要的是,如何让mongo作为NUMA机器上的守护进程启动?
答案 0 :(得分:5)
原来我的问题是numa和权限问题的组合。谢谢,@ Mark的帮助。要在NUMA设置中将mongodb作为守护进程启动,请将/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
}
答案 1 :(得分:3)
我认为你知道关于'mongo& amp;的通常警告(http://www.mongodb.org/display/DOCS/NUMA)。 numa'所以我不会继续谈论他们。
以下是mongodb的示例新手配置文件,其中包含numa - 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
答案 2 :(得分:1)
表示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
答案 3 :(得分:0)
上面的两个解决方案对我来说没有用,所以下面是我的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
}
答案 4 :(得分:0)
对于ubuntu 14
# apt-get -y install numactl
添加到/etc/sysctl.conf行vm.zone_reclaim_mode = 0
# sysctl -p
# service mongod restart