pgpoolベンチマーク

#　概要
pgpoolをWebサーバー、DBサーバーどちらに設置したらよいかテストして決める
コネクションプーリングのみ使用する想定

## 参考URL

>pgpool-IIの接続性能の改善
http://lets.postgresql.jp/documents/technical/pgpool-II-tcp-tuning/1/

>pgbenchの使いこなし(※ソースからのインストール部分は内容が古いので読み飛ばす)
http://lets.postgresql.jp/documents/technical/contrib/pgbench/

## マシンスペックおよびパラメータを表示　
どんなマシンでベンチを取ったか記録しておく

- OSバージョン、クロック、コア数、メモリ
<pre>
echo "OS: $(cat /etc/redhat-release) / kernel: $(uname -r)" ; \
cat /proc/cpuinfo |grep "model name"|uniq ; \
echo core $(cat /proc/cpuinfo |grep processor |wc -l) ; \
cat /proc/meminfo |grep MemTotal
</pre>

#### ServerA spec
OS: CentOS release 6.7 (Final) / kernel: 2.6.32-573.1.1.el6.x86_64
model name      : Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz
core 6
MemTotal:        3924040 kB
#### ServerB spec
OS: CentOS release 6.7 (Final) / kernel: 2.6.32-573.1.1.el6.x86_64
model name      : Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz
core 8
MemTotal:       16333576 kB

- pgpool,postgresのバージョン
<pre>
pgpool -v
pgpool-II version 3.4.3 (tataraboshi)
rpm -qa |grep postgres
postgresql94-server-9.4.5-1PGDG.rhel6.x86_64
</pre>

- pgpool(web)の設定
<pre>
diff -ub /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org |grep ^-
	-listen_addresses = '*'
	-port = 5432
	-backend_hostname0 = 'db'
	-backend_port0 = 9999
	-backend_data_directory0 = '/var/lib/pgsql/9.4/data'
	-pool_passwd = ''
	-num_init_children = 60
</pre>

- pgpool(db)の設定
<pre>
diff -ub /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org |grep ^-
	-listen_addresses = '*'
	-port = 5432
	-backend_port0 = 9999
	-backend_data_directory0 = '/var/lib/pgsql/9.4/data'
	-pool_passwd = ''
	-num_init_children = 60
	-debug_level = 1
</pre>

- Postgresの設定
<pre>
diff -ub /var/lib/pgsql/9.4/data/postgresql.conf /var/lib/pgsql/9.4/data/postgresql.conf.org |grep ^-
-listen_addresses = '*'         # what IP address(es) to listen on;
-port = 9999                            # (change requires restart)
-max_connections = 250                  # (change requires restart)
-shared_buffers = 4096MB                        # min 128kB
-work_mem = 16MB                                # min 64kB
-maintenance_work_mem = 160MB           # min 1MB
-log_filename = 'postgresql-%Y%m%d.log' # log file name pattern,
-log_min_duration_statement = 3000      # -1 is disabled, 0 logs all statements
-log_line_prefix =  '%t [%p]'           # special values:
-escape_string_warning = off
</pre>

### pgbench実施に当たって石井さんのコメント
http://d.hatena.ne.jp/veryberry_cafe/20061208/1165587186

pgbench -Sで実行されるような単純SELECTNではクエリキャッシュは
逆効果です．OFFにして測定してみてください．
それから，pgbenchをこのように使ってもコネクションプーリングの
効果はわかりません．pgbenchはデフォルトではpostmasterに接続しっぱなし
にするからです．
毎回pgbenchに接続するオプション -C を付ければコネクションプーリングの
効果が分かるはずです．
あと，言うまでもないと思いますが，1台のマシンで
pgpoolとpostmasterを複数動かしても性能検証には
あまりなりません．
最低でもマルチCPU，できればマシンを複数使わないと，並列動作できませんから．

### pgbenchのマニュアル
https://www.postgresql.jp/document/9.4/html/pgbench.html

マシンスペックを変えた場合、-j オプションの数値をいじってみる。

### pgbenchを順番に実行してみる
●A(pgpool)→B(postgres)
●A→B(pgpool)→B(postgres)
●A→B(postgres)
●other→A(pgpool)→B(postgres)

<pre>
/usr/local/pgsql/bin/pgbench -C -j 30 -c 60 -t 100 test -N -p 5432 -h localhost -U postgres ; \
/usr/local/pgsql/bin/pgbench -C -j 30 -c 60 -t 100 test -N -p 5432 -h db -U postgres ; \
/usr/local/pgsql/bin/pgbench -C -j 30 -c 60 -t 100 test -N -p 9999 -h db -U postgres ; \
/usr/local/pgsql/bin/pgbench -C -j 30 -c 60 -t 100 test -N -p 5432 -h web -U postgres

	starting vacuum...end.
	transaction type: Update only pgbench_accounts
	scaling factor: 1
	query mode: simple
	number of clients: 60
	number of threads: 30
	number of transactions per client: 100
	number of transactions actually processed: 6000/6000
	latency average: 0.000 ms
	tps = 290.598035 (including connections establishing)
	tps = 293.758237 (excluding connections establishing)

	starting vacuum...end.
	transaction type: Update only pgbench_accounts
	scaling factor: 1
	query mode: simple
	number of clients: 60
	number of threads: 30
	number of transactions per client: 100
	number of transactions actually processed: 6000/6000
	latency average: 0.000 ms
	tps = 3393.592219 (including connections establishing)
	tps = 9318.489187 (excluding connections establishing)

	starting vacuum...end.
	transaction type: Update only pgbench_accounts
	scaling factor: 1
	query mode: simple
	number of clients: 60
	number of threads: 30
	number of transactions per client: 100
	number of transactions actually processed: 6000/6000
	latency average: 0.000 ms
	tps = 1591.020703 (including connections establishing)
	tps = 8438.154353 (excluding connections establishing)

	starting vacuum...end.
	transaction type: Update only pgbench_accounts
	scaling factor: 1
	query mode: simple
	number of clients: 30
	number of threads: 1
	number of transactions per client: 100
	number of transactions actually processed: 3000/3000
	latency average: 0.000 ms
	tps = 798.809029 (including connections establishing)
	tps = 4101.745156 (excluding connections establishing)
</pre>

postgresと同居させるのが一番早いのか・・?