Когда я впервые установил MongoDB 2.2.3 с помощью apt-get, следуя инструкциям из руководства по установке 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:
.
Есть ли правильный способ решить эту проблему?
Upstart не может остановить или перезапустить службу, если вы запустили ее вручную. Вам нужно обновить скрипт upstart для mongodb, чтобы он начинался с нужных вам опций, а затем запустить его с 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
неудачного запуска.
для файла 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
, и вы также можете указать ограничение nofile с помощью параметра LimitNOFILE
Скрипт Ubuntu MongoDB upstart теперь проверяет наличие двоичного файла numactl
и корректируется соответствующим образом.
Предупреждение NUMA можно исправить следующим образом с помощью Ubuntu 14.04 LTS и MongoDB 2.6:
sudo apt-get -y install numactl
sudo restart mongod
Я знаю, что вопрос о upstart
, но на всякий случай кому-то (например, мне) нужно решение init.d
:
замените функцию start_server()
в /etc/init.d/mongodb
на код ниже [ 116]
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
}