[pgsql-jp: 28367] PostgreSQLのパフォーマンス

Tamotsu Ebina ebina @ pluto.dti.ne.jp
2002年 12月 18日 (水) 17:51:38 JST


海老名@インフォテックです

以前、PostgreSQLのパフォーマンスについて
投稿しましたがデータを公表します。


> 北村@zoozee です。
> 
> > >>2)Javaアプリケーションをマルチスレッドにするとトータルの
> > >>スループットが落ちます。CPUはほとんどフルの状態です。
> > >>商用データベースではマルチスレッドにするとスループットは
> > >>上がるのですがPostgreSQLでは逆になります。
> > > 
> > > 
> > > 現状のPostgreSQLのプロトコルかJDBCドライバが、
> > > とくにスレッドを考慮した造りになっていないからでしょう。
> > > コネクションを複数用意して それらで平行アクセスすれば速くなったりしませんか?
> > 
> > 
> > コネクションはもちろんスレッド毎に作成しています。
> 
> コネクションをスレッド毎に作成するのではなく、コネクションマ
> ネージャークラス(Singletonデザインパターンのような)から、コ
> ネクションを貰う、返す、という方法にしないと、「コネクション
> を張る動作」がボトルネックになり、遅くなると思います。


スレッド毎にトランザクション管理しているので、
Singletonデザインパターンで同一コネクションの使いまわしは
できないと思います。


> それから、PostgreSQL の JDBCドライバの中の Statement クラス
> はスレッドセーフです。1つのコネクションの中で Statement を複
> 数スレッド上で動作させるだけで、速くなりますよ。
> (やってる内容によりますが)。


テストプログラムは、すべてPreparedStatemenを使用しています。
1)主となるテーブルを全件検索する。読むテーブルは各スレッドとも
 同一テーブルですがスレッド毎に対象となる行のキーが異なります。
2)上記で読んだ行のキーで別テーブルを読む。
3)該当する行が2)で見つからなければ1)の内容を別テーブルにinsertする。
4)全件処理した段階でcommitを出す。
と言った処理です。

スレッド間では処理するキーの重複は無いのでinsertするテーブルには
LOCKはかけていません。
INDEXはそれぞれのテーブルにPrimaryKeyが作成されています。


マルチスレッドだから効率が上がるわけではないのは分かりますが、
マルチスレッドだと逆に効率が下がる原因が分かりません。

スレッド数 総処理時間 総処理時間/スレッド数
1                6.109秒          6.109秒
3               12.587            4.195
14             108.042            7.171
28             331.519           11.839
42             773.773           18.423
56            1225.331           21.880
70            1831.605           26.165

スレッド数14と70を比較するとスレッド数は5倍なのに処理時間は17倍です。
厳密に言うと、総処理時間はプログラムの起動から終了までの時間で、
実際のデータベースでの処理時間ではありませんので参考値です。

概算ですが、

(総処理時間/スレッド数) = 0.34 x スレッド数 + 2.4

スレッド数に対して単位スレッド当たりの処理時間が1次関数的に増加します。

ちなみに、商用データベースでは

1               14.263            14.263
3               18.883             6.294
14              44.718             3.194
28              84.947             2.962
42             124.739             2.969
56             167.773             2.995
70             215.237             3.074

マルチスレッドの効果は出ないまでも、スレッド数増加による
影響は無く、単位スレッド当たりの処理時間は3秒前後でほぼ一定です。

3スレッドまではPosrgreSQLの方が上回っています。

プログラムはJavaで書きJDBCドライバのみ実行時に変えています。

実行環境は
DBサーバ 
 Linux 8.0 PostgreSQL 7.2.3 CPU 2.4GHz Memory 1GB 1,000RPM 72MB x 3 SCSI Raid 5
 j2sdk1.3.1_05 fsync は安全性を無視して false にしてあります。

APPLサーバ Linux8.0 j2sdk1.4.1_01 CPU 2GHz Memory 512MB IDE 7200RPM 60MB

100MB Switching HUB で接続

vmstat で見るとCPUネックになっているようです。
商用データベースと比較してCPU負荷が高いように見受けられますが
何が原因か分かりません。

海老名@インフォテック
--
office  ta.ebina @ po1.iftc.co.jp  http://www.iftc.co.jp/
private ebina @ pluto.dti.ne.jp  http://www.pluto.dti.ne.jp/~ebina/
[Amateur Radio Station JCG#11007 JA1QKK ] Tamotsu Ebina




pgsql-jp メーリングリストの案内