web-dev-qa-db-ja.com

Postgresのオープンファイルエラーが多すぎる

Javaアプリケーション上のUbuntu 14.04サーバーで、PostgresのToo many Open filesエラーが発生しています(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

しかし、まだ "Too many Open files"エラーが発生しているため、影響はないようです。

また、サーバーのディレクトリ/etc/security/limits.d/および/etc/security/conf.d/は空です。だから誰でも私を案内してください。

4
Geo

@dilyin更新ありがとうございます。

PostgreSQLの起動スクリプトのulimit値を更新しましたが、まだ問題がありました。

最後に、max_files_per_processからデフォルトの1000まで200。このパラメーターはpostgresql.confファイル。これは、各サーバーサブプロセスに許可される同時に開くファイルの最大数を設定します。

4
Geo

あ...既知の問題。

通常、人々は「/etc/security/limits.conf」ファイルの編集を開始しますが、このファイルは、pamシステムを介してアクティブにログインしているユーザーにのみ適用されることを忘れてください。

Initスクリプトを使用してデータベースを手動で起動した場合、データベースプロセスは変更された制限を継承しますが、データベースが起動時に起動された場合、またはsystemdなどによって起動された場合は、継承されません。

Debianの場合は「/ etc/defaults/$ service」、RedHatの場合は「/ etc/sysconfig/$ service」ファイルがあります。これらのファイルは、デーモンが実行される前にinitスクリプトによって供給されます。追加 ulimit -s unlimitedまたはこのようなものをこれらのファイルに挿入します。制限はinitスクリプトシェルで適用され、データベースプロセスに影響します。

カーネルmaxfilesも設定する必要があります。

4
Dilyin