Lorsque j'ai installé MongoDB 2.2.3 avec apt-get pour la première fois, en suivant les instructions du guide d'installation de 10gen, il se lance automatiquement au démarrage du serveur.
Cependant, après avoir suivi les instructions dans /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]
il ne démarre plus automatiquement.
Alors maintenant je dois entrer:
echo 0 > /proc/sys/vm/zone_reclaim_mode && numactl --interleave=all /usr/bin/mongod --config /etc/mongodb.conf &
manuellement à chaque fois dans un terminal pour le démarrer.
Cependant, je suppose que le faire de cette façon entraîne également l'échec de service mongodb stop/restart
. Il générera une erreur stop: Unknown instance:
.
Existe-t-il un moyen approprié de résoudre ce problème?
Upstart ne peut pas arrêter ou redémarrer votre service si vous l'avez démarré manuellement. Vous devez mettre à jour le script de démarrage pour mongodb afin qu'il commence par les options souhaitées, puis par service mongodb start
.
Tout d'abord, étant donné que le paramètre zone_reclaim_mode concerne l'ensemble du système plutôt que spécifique à mongodb, vous pouvez ajouter la ligne suivante:
vm.zone_reclaim_mode = 0
to /etc/sysctl.conf
, qui configure les variables système au démarrage.
Ensuite, vous devez mettre à jour le script que upstart utilise pour démarrer mongodb, /etc/init/mongodb.conf
, afin d’envelopper la commande normale avec la commande numactl
. Donc la ligne:
if [ "x$ENABLE_MONGODB" = "xyes" ]; then exec start-stop-daemon --start --quiet --chuid mongodb --exec /usr/bin/mongod -- --config /etc/mongodb.conf; fi
devient:
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
Vous indiquez également que les utilisateurs ne démarrant pas automatiquement ne démarrent pas au démarrage; si cela se produit toujours après avoir apporté les modifications ci-dessus, veuillez joindre un extrait complet de /var/log/mongodb/mongodb.log
d'un démarrage échoué.
pour ubuntu 16.04 le fichier mongod.service devrait ressembler à
[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
et vous pouvez également spécifier nofile limit avec LimitNOFILE param
Le script de démarrage Ubuntu MongoDB vérifie maintenant la présence du binaire numactl
et s’adapte en conséquence.
L’avertissement NUMA peut être corrigé comme suit avec Ubuntu 14.04 LTS et MongoDB 2.6:
Sudo apt-get -y install numactl
Sudo restart mongod
je sais que la question concerne upstart
, mais juste au cas où quelqu'un (comme moi) aurait besoin d'une solution init.d
:
remplacez la fonction start_server()
dans /etc/init.d/mongodb
pour le code ci-dessous
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
}