Когда 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