Golang 、 PostgreSQL 、および 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回更新できるため)またはマシンのアップグレード以外の方法でこの問題を解決するにはどうすればよいですか?
max_connections = 1024
?!接続プールが必要です。
アプリが組み込みのプールをサポートしていない場合は、トランザクションプールモードでPgBouncerを使用します。
小さなおもちゃのサーバーでPostgreSQLを実行しています。アクティブな接続数を少なくして、キューを順番に処理します。
高max_connections
はかなりの非効率性をもたらし、アクティブに機能する接続がたくさんあるとさらに追加されます。