私は 5000 接続で pgbouncer のストレス テストを行っています。テストの目的は、pgbouncer を使用して接続を多重化することです。つまり、5000 クライアント接続を 500 db 接続に多重化します。
しかし、アクティブ500接続マークの目標を達成できません。
私のセットアップはかなり簡単です
(pgbenchで設定したクライアント) ----->pgbouncer + psql
|______複数の箱______||______1箱__________|
pgbouncer と postgres は同じボックスに含まれています。
pgbouncer=1コア(想定)
postgres = 15 コア (予想)
マシン構成:
16コア
ulimit -n 10000
Postgres 構成:
最大接続数 = 500
共有バッファ = 1GB
work_mem = 100kB
pgbouncer 構成:
pool_mode = トランザクション
server_lifetime=6000
server_idle_timeout=2000
server_connect_timeout=30
default_pool_size=500
プールサイズ=500
pkt_buf=4096
server_login_retry=2
クライアント構成(各 8 コアの 8 ボックス):
各クライアント ボックスは、pgbench を使用するクライアント用のセットとして模倣します 8 コア ボックスの場合、クエリを実行するために 16 のスレッドを設定します
pgbench -h -p 6541 -c -j 16 -d -f pgbench_Script.sql -T 360 -U postgres テスト
pgbench_Script.sql
\setrandom delta 0 100000 insert into t4.emplog values(nextval('t4.employeeSeq'),:delta);
postgres でのアクティブなクエリ:
select count(*) from pg_stat_activity where state like 'active';
count
-------
40
私の期待では、接続プーラーを介してデータベースへのアクティブな接続が 500 近くあると予想されます。 問題: 一握りの接続しか表示されない ~ 40 のアクティブな接続
観測: 複数の postgres プロセスが「アイドル」状態になっているのが見えますが、pgbouncer にはすべてのクライアントがサービスされています。pgbouncer が最高のパフォーマンスを発揮できないことを示唆しています。ただし、正確なボトルネックを特定することはできません。
潜在的なボトルネック:
クライアントの要求: pgbench は各スレッドを接続上のセットのマスターにします。アクティブな同時接続の大規模なセットをどのように模倣できますか?
pgbouncer : pgbouncerの構成に問題がありますか?
postgres : postgresの私の構成は大規模な接続を処理できませんか?