Как мне запустить MongoDB на машине NUMA?

Когда я впервые установил 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:.

Есть ли правильный способ решить эту проблему?

6
задан 16 May 2013 в 14:38

4 ответа

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 неудачного запуска.

0
ответ дан 16 May 2013 в 14:38

для файла 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

0
ответ дан 16 May 2013 в 14:38

Скрипт Ubuntu MongoDB upstart теперь проверяет наличие двоичного файла numactl и корректируется соответствующим образом.

Предупреждение NUMA можно исправить следующим образом с помощью Ubuntu 14.04 LTS и MongoDB 2.6:

sudo apt-get -y install numactl
sudo restart mongod
0
ответ дан 16 May 2013 в 14:38

Я знаю, что вопрос о 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
}
0
ответ дан 16 May 2013 в 14:38

Другие вопросы по тегам:

Похожие вопросы: