2012-06-22 46 views
5

我试图让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机器上的后台?

+0

参见http://unix.stackexchange.com/questions/ 187474 /,它考虑了近几年对MongoDB软件包的一些更改。 – JdeBP

回答

5

原来我的问题是的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 
} 
+0

我' m没有运行NUMA系统AFAIK,所以这对于OP来说可能是无关紧要的,但是如果它对任何人都有帮助......至少在Ubuntu上,MongoDB数据目录中所有文件的所有权(在Ubuntu上默认的数据目录是/ var/lib/mongodb)应该是mongodb:nogroup。不知怎的,我的设置为root:root(可能是因为我手动运行mongod来测试某些内容);更改所有权使'sudo start mongodb'(和'sudo service start mongodb '')再次正常工作 –

+0

所以,这是一个修复它的命令:'sudo chown -R mongodb:nogroup/var/lib/mongodb/*'注意/ var/lib/mongodb是Ubuntu的默认设置,可能不是其他发行版的设置; MongoDB自己的默认数据目录i s/data/db。 –

3

我认为你知道关于'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 
+0

这是我在帖子中找到start_service函数的组,但是我得到了“无法打开/ var/lib/mongodb/admin。ns errno:13权限被拒绝“错误当我尝试”服务mongodb启动“与”检查numactl“和”启动过程使用包装“代码位包括 – Libby

+0

很酷,很高兴听到它的所有工作:) –

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 
} 
0

Ubuntu的14

# apt-get -y install numactl 

添加到/etc/sysctl.conf线vm.zone_reclaim_mode = 0

# sysctl -p

# service mongod restart

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