在 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
重新启动服务器并检查 Postgres 的 ulimit 后,其为 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/ 也是空的。所以有人可以指导我吗?
答案1
@dilyin 感谢更新。
我们更新了 PostgreSQL 启动脚本中的 ulimit 值,但问题仍然存在。
最后,我们通过将max_files_per_process
默认值从 1000 减少到 200 解决了该问题。此参数在postgresql.conf
文件中,它设置了每个服务器子进程允许同时打开的最大文件数。
答案2
啊……已知问题。
通常人们开始编辑“/etc/security/limits.conf”文件,但忘记该文件仅适用于通过 pam 系统主动登录的用户。
如果您使用初始化脚本手动启动数据库,数据库进程将继承您修改的限制,但如果数据库是在启动时启动或由 systemd 之类的程序启动,则不会。
Debian 有文件“/etc/defaults/$service”,RedHat 有文件“/etc/sysconfig/$service”。这些文件在守护进程运行之前由 init 脚本获取。ulimit -s unlimited
在这些文件中添加或类似内容。限制将在 init 脚本 shell 中应用,并将影响数据库进程。
内核最大文件数 (maxfiles) 也应该设置。