ablog

不器用で落着きのない技術者のメモ

PostgreSQL で "Too many open files in system" が発生する

事象

以下のエラーがログに出力される。

Too many open files in system

考察

Linuxカーネルパラメータ fs.file-max はシステム全体でオープンできるファイルディスクリプタ数、つまり PostgreSQL 以外がオープンするファイルディスクリプタも含まれる。
PostgreSQL がオープンするファイルディスクリプタ数は max_files_per_process でサーバ子プロセスごとにオープンできる上限を設定できる。ソケットを使うときもファイルディスクリプタをオープンするので max_connections の数もファイルのディスクリプタ数に関係する。

参考

max_files_per_process (integer)
それぞれのサーバ子プロセスが同時にオープンできるファイル数の最大値をセットします。 デフォルトは1000ファイルです。 もしもカーネルがプロセス毎の安全制限を強要している場合、この設定を気にかける必要はありません。 しかし、いくつかのプラットフォーム(特にほとんどのBSDシステム)では、もし多くのプロセス全てがそれだけ多くのファイルを開くことを試みたとした場合、実際にサポートできるファイル数より多くのファイルを開くことを許しています。もしも「Too many open files」エラーが発生した場合、この設定を削減してみてください。 このパラメータはサーバ起動時にのみ設定可能です。

19.4. 資源の消費

3.2.1. カーネルパラメータ
Linux カーネルのパラメータ設定により、PostgreSQL が使用するシステムのリソースの制限を変更することができます。システム全体でオープン可能なファイル数や接続数に応じたセマフォの全体数、共有メモリサイズなど、規模に応じたシステムリソース容量の設定を行います。カーネルパラメータの設定値については、マニュアル9を参考にしてください。

カーネルパラメータ 説明 関連する PostgreSQL のパラメータ
fs.file-max システム全体で使用可能なファイルディスクリプタ数を指定する。PostgreSQL のバックエンドプロセスが同時にオープンするファイル数の設定と最大接続数から、PostgreSQL が要求するファイルディスクリプタ数を確認することができる。 max_files_per_process
バックエンドプロセスが要求する最大ファイルディスクリプタ数。
max_connections
DB への最大接続数。
https://www.pgecons.org/wp-content/uploads/PGECons/2013/WG2/11_PerformanceTuning.pdf