web-dev-qa-db-ja.com

PostgreSQL:残りの接続スロットはレプリケーション以外のスーパーユーザー接続用に予約されていますが、クライアントが多すぎます

GolangPostgreSQL 、および sqlx (アダプター、接続プーラー)を使用するWebアプリケーションがあり、各リクエストには1〜8個のクエリが必要です。 5-8の選択と5-8の挿入クエリを持つトランザクション。

PostgreSQLのmax_connectionsは既に1024、次に4096に設定していますが、スワップが開始されるため、64に戻します(これはスワップ前の制限です)。

RAMは2GBです。PostgreSQLのworking_memを16MBに、temp_buffersを8MBに、shared_buffersを800MBに、effective_cache_sizeを1536MBに設定します(この構成はまったくスワップしません)。

毎日00:00から02:35で1秒あたり約18のリクエストがあり、1秒あたり約8つのエラーがあります。その時点で1時間あたり10トランザクションのみが成功し、その他は失敗し、エラーメッセージが表示されます。

  • 残りの接続スロットは、レプリケーション以外のスーパーユーザー接続用に予約されています
  • すでにクライアントが多すぎます

読み取り専用ページのキャッシュ(ページは1分あたり約10回更新できるため)またはマシンのアップグレード以外の方法でこの問題を解決するにはどうすればよいですか?

3
Kokizzu

max_connections = 1024?!接続プールが必要です。

アプリが組み込みのプールをサポートしていない場合は、トランザクションプールモードでPgBouncerを使用します。

小さなおもちゃのサーバーでPostgreSQLを実行しています。アクティブな接続数を少なくして、キューを順番に処理します。

max_connectionsはかなりの非効率性をもたらし、アクティブに機能する接続がたくさんあるとさらに追加されます。

5
Craig Ringer