Postgres 出现“打开文件过多”错误

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

重新启动服务器并检查 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) 也应该设置。

相关内容