データベースサーバーへのピーク時にトラフィックを処理できません。ハードウェアの改善を検討しています(その点についてはこの質問をご覧ください)が、プーリング構成とサーバーの調整にも取り組みたいと考えています。
私たちが取り組んでいるアプリケーションは、スマートフォン向けのターンベースのマルチプレイヤーゲームです。バックエンドは、ユニコーンとPostgreSQL 9.1をデータベースとするRailsで構成されています。現在、登録ユーザーは60万人で、ゲームの状態はデータベースに保存されているため、数秒ごとに数千の書き込みが行われます。PgBadgerを使用してPostgreSQLのログファイルを分析しましたが、重要な時間帯に大量の
FATAL: remaining connection slots are reserved for non-replication superuser connections
この問題に対処するための単純な解決策は、postgresql.confのmax_connections(現在は100) を増やすことです。私はhttp://wiki.postgresql.org/wiki/Number_Of_Database_Connectionsを読みましたが、これはこれが正しいことではないかもしれないことを示しています。前述の記事では、max_connectionsとpool sizeの間のスイートスポットを見つけることに言及しています。
このスイートスポットを見つけるために何ができますか?max_connectionsとプールサイズの異なる値のI / Oパフォーマンスを測定するための優れたツールはありますか?
現在の設定では4台のゲームサーバーがあり、各サーバーにはユニコーンワーカーが16人、プールサイズが5です。
以下は、使用しているデフォルト以外のpostgres-settingsです。
version | PostgreSQL 9.1.5 on x86_64-unknown-linux-gnu,compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
checkpoint_completion_target | 0.9
checkpoint_segments | 60
checkpoint_timeout | 6min
client_encoding | UTF8
effective_cache_size | 2GB
lc_collate | en_US.UTF-8
lc_ctype | en_US.UTF-8
log_destination | csvlog
log_directory | pg_log
log_filename | postgresql-%Y-%m-%d_%H%M%S.log
log_line_prefix | %t
log_min_duration_statement | 200ms
log_rotation_age | 1d
log_rotation_size | 10MB
logging_collector | on
max_connections | 100
max_stack_depth | 2MB
server_encoding | UTF8
shared_buffers | 1GB
ssl | on
TimeZone | localtime
wal_buffers | 16MB
work_mem | 8MB
INSERT
?スキーマはどのようなものですか?パーティション化されていますか?何explain analyze
いくつかのサンプルクエリの?チェックポイントの頻度と所要時間はどれくらいですか?(チェックポイントロギングオプションを参照)。そして真剣に、あなたのPostgreSQLのバージョンは何ですか?(更新:ここにハードウェアをリストしているようです:dba.stackexchange.com/questions/28061/…)
synchronous_commit = off
synchronous_commit = off
またはを使用していcommit_delay
ますか?