PostgreSQLで以下のログを出力した場合、バックエンド・プロセスをforkできていません。
2019-05-26 19:58:26.308 JST [20730] LOG: could not fork new process for connection: Resource temporarily unavailable 2019-05-26 19:58:27.313 JST [20730] LOG: could not fork new process for connection: Resource temporarily unavailable 2019-05-26 19:58:27.315 JST [20730] LOG: could not fork new process for connection: Resource temporarily unavailable 2019-05-26 19:58:28.026 JST [20730] LOG: could not fork new process for connection: Resource temporarily unavailablepgpoolを使用している場合、pgpool側では以下のログが出力されます。 ※PostgreSQLへのヘルスチェック機能を有効にしている場合に出力されると思います。
May 26 19:58:27 erogamescape13 pgpool[1696]: [159-1] 2019-05-26 19:58:27: pid 1696: ERROR: failed to authenticate May 26 19:58:27 erogamescape13 pgpool[1696]: [159-2] 2019-05-26 19:58:27: pid 1696: DETAIL: invalid authentication message response type, Expecting 'R' and received 'E'ヘルスチェックのリトライが指定の回数失敗すると、フェイルバック機能が動きます。
May 26 19:58:28 erogamescape13 pgpool[26104]: [9-1] 2019-05-26 19:58:28: pid 26104: LOG: health check failed on node 0 (timeout:0) May 26 19:58:28 erogamescape13 pgpool[26104]: [10-1] 2019-05-26 19:58:28: pid 26104: LOG: received degenerate backend request for node_id: 0 from pid [26104]
バックエンド・プロセスをfork出来ない理由は、ErogameScapeの場合、プロセス数の上限に達してしまって、プロセスを生成できないことが原因でした。
プロセス数の上限は以下のコマンドで確認可能です。
[root@erogamescape13 ap2]# su - postgres -bash-4.1$ ulimit -u 1024
postgresユーザーのプロセス上限数が知りたかったので、postgresユーザーでulimitを実行しています。
今、動いているpostmasterのpostgresユーザーのプロセス数の上限を知りたい場合は、まずpostmasterのプロセスIDを調べ
[ap2@erogamescape14 ~]$ ps aux | grep postmaster
ap2 5692 0.0 0.0 103336 900 pts/2 S+ 20:45 0:00 grep postmaster
postgres 27012 0.1 0.9 4595684 158676 ? S 20:11 0:03 /usr/pgsql-11/bin/postmaster -D /var/lib/pgsql/11/data
cat /proc/プロセスID/limitsを見ます。
[root@erogamescape14 ap2]# cat /proc/27012/limits Limit Soft Limit Hard Limit Units Max processes 2048 63695 processes Max open files 1024 4096 files
ErogameScapeのOSはCentOS6です。
CentOS6のデフォルトのMax processesの上限は1024です。
PostgreSQLのmax_connectionsの数だけ、バックエンドプロセスが生成されれる可能性があります。
ErogameScapeではmax_connectionsを1200に設定しているのですが、いろいろありまして、postgresユーザーのプロセスが1024を超えてしまい、バックエンドプロセスが生成できずcould not fork new process for connectionを出力していました。
Max processesの上限を変更するため、以下の通り/etc/security/limits.d/90-nproc.confを書き換えて、postgreSQLを再起動しました。
※この方法だと他のユーザーも全部書き換わってしまうので…おそらく /etc/init.d/postgresql-11にulimitコマンドで上限を変更するコマンドを追加するのが妥当な気もするのですが、セオリーが分かりませんでした…
# emacs /etc/security/limits.d/90-nproc.conf - * soft nproc 1024 + * soft nproc 2048