На сервере Ubuntu 14.04 в приложении JAVA мы получаем ошибку «Слишком много открытых файлов» для Postgres (с использованием Postgresql 9.5).
Мы устанавливаем следующее в /etc/security/limits.conf
* soft nofile 16384
* hard nofile 16384
root soft nofile 16384
root hard nofile 16384
postgres soft nofile 16384
postgres hard nofile 16384
Также установите следующее в /etc/sysctl.conf
kern.maxfiles=20480
kern.maxfilesperproc=18000
Также, пожалуйста, посмотрите следующие результаты, работая как пользователь Postgres:
-> ulimit -Hn
16384
-> ulimit -Sn
16384
-> cat /proc/sys/fs/file-max
100268
После перезапуска сервера и проверки ulimit для Postgres его 100268. Но при проверке лимита для открытых файлов в процессе postgres его все еще 1024 и 4096
# cat /proc/1072/limits
Max open files 1024 4096 files
Когда мы перезапускаем службы postgres, он изменился на
#cat /proc/1759/limits
Max open files 16384 16384 files
Но, похоже, это не повлияло, потому что мы по-прежнему получаем ошибку «Слишком много открытых файлов».
Также на сервере каталоги /etc/security/limits.d/ и /etc/security/conf.d/ и пустые. Так может ли кто-нибудь помочь мне?
Ах ... Известная проблема.
Обычно люди начинают редактировать файл "/etc/security/limits.conf", но забывают, что этот файл применяется только к пользователям, активно вошедшим в систему через систему pam.
Если вы запустите базу данных вручную с помощью сценария инициализации, процесс базы данных унаследует ваши измененные ограничения, но если база данных запускается при загрузке или запускается чем-то вроде systemd, этого не произойдет.
Существуют файлы «/ etc / defaults / $ service для Debian и» / etc / sysconfig / $ service для RedHat. Эти файлы создаются сценарием инициализации перед запуском демона. Добавить ulimit -s unlimited
или что-то подобное в эти файлы. Ограничения будут применены в оболочке сценария инициализации и повлияют на процесс базы данных.
Также должны быть установлены maxfiles ядра.
@dilyin Спасибо за обновление.
Мы обновили значение ulimit в сценарии запуска PostgreSQL, но проблема все равно осталась.
Наконец, мы исправили проблему, уменьшив max_files_per_process
на 200 по умолчанию 1000. Этот параметр находится в postgresql.conf
file, и это устанавливает максимальное количество одновременно открытых файлов, разрешенное для каждого подпроцесса сервера.