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

Ошибка получения слишком большого количества открытых файлов для Postgres

На сервере 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, и это устанавливает максимальное количество одновременно открытых файлов, разрешенное для каждого подпроцесса сервера.