Postgresql pgbenchがめちゃくちゃ遅い

投稿者: | 2016年1月17日

お遊びのアプリケーション用のサーバーの話。
ある程度アプリが動作するようになったので現在デバッグで使用しているVMWare上のubuntu12.04+Postgresqlを実サーバーへと移行しようと思い、Intel(R) Xeon(R) CPU E31225 @ 3.10GHz+mem16GBのちょっとしたサーバーにubuntu14.04+Postgreql9.3を導入した。
ドライブはHDDだ。一応RAID1。
今まではVMだったので速さはあまりに気にしていなかったのだが、物理サーバーになったのでどれほど速くなったかとpgbenchで測定してみることにした。

pg_benchのインストール

ubuntuの場合は
sudo apt-get install postgresql-contrib
で、サクッと導入

ベンチ用テーブルの作成など

createdb -h localhost -U postgres bench_table
pgbench -h localhost -U postgres -i bench_table

ベンチマーク実行

pgbench -h localhost -U postgres -c 10 -t 1000 bench_table
としてベンチマークを起動すると暫くしてベンチマーク結果が表示されます。

で、結果は

~$ pgbench -h localhost -U postgres -c 10 -t 1000 bench_table
starting vacuum…end.
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 65.534905 (including connections establishing)
tps = 65.584925 (excluding connections establishing)

嘘だろー、VMより遅せぇぞ。
確かVMは1100前後、VMのOSもpostgresqlなど初期設定値でチューニングなどしてないし。
バージョンがubuntu12.04,postgresql9.1だから完全一致じゃないけ断然速くなることを予想していただけになんで?ガッカリって感じ。
バージョン違いで計測法も変わったとか?

※VMはepsonのcorei7 3.4GHzmem8GBを搭載した普通のPCでHostOS CentOS6.6にVMwareでubuntu12.04をguest OSとして動かしている。

と、ここまでが序章
原因を探るべく色々試した結果

1.OSやPostgresqlの設定でないことが分かった

何でかって言うとpgbenchの結果が速いPCにHDDを接続し替えると速くなる。
速いスコアをたたき出すPCはCore2Duo3.0GHzのPCでも1000tps越えだった。

2.遅いと思われたPCでも接続するSATAポートを変更すると速くなる事がある

1000tpsはいかないにしても、接続するSATAポートで速くなる。
hdparmなどではあまり差が出ないがpgbenchだと倍以上スコアが変わる。

以上のことから現時点では接続するSATAポートによりpgbench性能が変わる。
特に書き込み速度が著しく変わる?
新しいサーバーでベンチマークをselect onlyにすると

~$ pgbench -h localhost -U postgres -S -c 10 -t 1000 bench_table
starting vacuum…end.
transaction type: SELECT only
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 19852.535367 (including connections establishing)
tps = 25562.633565 (excluding connections establishing)

including connections establishingの値が約303倍
対するCore2Duoの良いスコアを出すPCの場合、通常モードでは

~$ pgbench -h localhost -U postgres -c 10 -t 1000 bench_table starting vacuum…end.
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 1158.143713 (including connections establishing)
tps = 1170.804994 (excluding connections establishing)

select onlyにすると

~$ pgbench -h localhost -U postgres -S -c 10 -t 1000 bench_table
starting vacuum…end.
transaction type: SELECT only
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 13829.192873 (including connections establishing)
tps = 15931.304216 (excluding connections establishing)

別の何かがボトルネックになるのかわからないが約12倍程度。

このような結果になった。
SATAポートを替える方法がすべてのM/Bに適用できるかわからない。
私のしようしているM/BはSATAポートが6つあり、うち2つが6Gノコリ4つが3Gだ。
当然6GのポートにHDDは接続している。
SATAに接続しているデバイスは此れだけで光学ドライブは無い。
大容量のデータをコピーするような場合だと6Gの方が速いようだが、pgbenchに関しては6Gが速いとか3Gが速いとかでは無いようでポートにより違う。
ランダムアクセスの書き込みが遅いって事だと思うけどもしかしてirqとかそっち系なのか??
ちなみに私の知識の範囲では設定類(kernel shared memoryやpostgres.confなど)をいじっても遅くなることはあっても速くなることはありませんでした。

この問題は一旦保留にして何か別のベンチマークで同様の傾向になるかを調べたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です