Назад | Перейти на главную страницу

MongoDB «слишком много файлов открыто» даже после установки ограничений

Когда MongoDB запускается, я получаю сообщение об ошибке «слишком много файлов» даже после редактирования. /etc/security/limits.conf и установив предел unlimited.

Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.199+0100 I CONTROL  [initandlisten]     distarch: x86_64
Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.199+0100 I CONTROL  [initandlisten]     target_arch: x86_64
Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.199+0100 I CONTROL  [initandlisten] options: { net: { port: 29000 }, security: { authorization: "enabled" }, storage: { dbPath: "/home/databases/mongo" }, systemLog: { quiet: true } }
Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.235+0100 I -        [initandlisten] Detected data files in /home/databases/mongo created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.236+0100 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=37G,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
Mar 09 18:29:15 ns524052 mongod[1298]: 2017-03-09T18:29:15.676+0100 E STORAGE  [initandlisten] WiredTiger (24) [1489080555:676881][1298:0x70e199ff3c80], file:collection-160--541918095290639536.wt, WT_SESSION.open_cursor: /home/databases/mongo/collection-160--541918095290639536.wt: handle-open: open: Too many open files
Mar 09 18:29:15 ns524052 mongod[1298]: 2017-03-09T18:29:15.676+0100 I -        [initandlisten] Invariant failure: ret resulted in status UnknownError: 24: Too many open files at src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp 79

Мой limits.conf содержит это

*                soft    nofile          unlimited
*                hard    nofile          unlimited
*                soft    nproc           unlimited
*                hard    nproc           unlimited

Я также пробовал использовать ulimit без везения. Не уверен, что случилось. Работает на Ubuntu 16.04.

Поскольку Ubuntu 16.04 использует systemd, вам нужно адаптировать ulimit настройки для каждой услуги. Для этого создайте файл /etc/systemd/system/mongodb.service.d/override.conf и переопределить значения по умолчанию.

root@xenial:~# sudo systemctl edit mongodb.service

Вставьте их:

[Service]
LimitNOFILE=infinity
LimitNPROC=infinity

Ctrl + O, затем Ctrl + X для выхода, и создается файл /etc/systemd/system/mongodb.service.d/override.conf

root@xenial:~# cat /etc/systemd/system/mongodb.service.d/override.conf
[Service]
LimitNOFILE=infinity
LimitNPROC=infinity

Чтобы проверить, были ли применены эти настройки, вы можете использовать systemctl show. Во-первых, давайте посмотрим, какие значения активны.

root@xenial:~# systemctl --no-pager show mongodb.service | egrep 'NOFILE|NPROC'
LimitNOFILE=1024
LimitNOFILESoft=1024
LimitNPROC=7839
LimitNPROCSoft=7839

Затем примените настройки.

root@xenial:~# systemctl daemon-reload 
root@xenial:~# systemctl --no-pager show mongodb.service | egrep 'NOFILE|NPROC'
LimitNOFILE=18446744073709551615
LimitNOFILESoft=18446744073709551615
LimitNPROC=18446744073709551615
LimitNPROCSoft=18446744073709551615

Помимо пользовательских ограничений, в ядре может быть установлен лимит открытых файлов (точнее, максимальное количество открытых файловых дескрипторов):

# sysctl -a |grep -i fs.file-max

отрегулировать это с помощью

# sysctl -w fs.file-max=<opened_file_new_limit>

Чтобы настройки ядра сохранялись после перезагрузки - добавьте файл в каталог /etc/sysctl.d, файл должен иметь расширение .conf, а содержимое должно быть следующим:

fs.file-max=<opened_file_new_limit>

Также проверьте, нет ли других файлов в каталоге /etc/sysctl.d, которые могли бы перезаписать эти настройки - есть другой файл, когда это можно установить: /etc/sysctl.conf (если файлы из /etc/systcl.d не читаются затем используйте /etc/sysctl.conf)

Это решило проблему для меня.

Документация по конфигурации sysctl: https://www.freedesktop.org/software/systemd/man/sysctl.d.html