[pgcluster: 909] Re: pgbench で固まってしまいます

Yoshiyuki Asaba y-asaba @ sraoss.co.jp
2006年 7月 26日 (水) 16:20:54 JST


こんにちは、浅羽です。

From: Eiichiro ITANI <emu @ ceres.dti.ne.jp>
Subject: [pgcluster: 908] Re: pgbench で固まってしまいます
Date: Wed, 26 Jul 2006 15:20:25 +0900

> >> 簡単に言えば、ロックの粒度を大きくしているので pgcluster でのデッドロッ
> >> クは避けられるが、デメリットとして同一のテーブルの更新を伴う複数のトラ
> >> ンザンクションが並行する場合に、大きくパフォーマンスが落ちる可能性があ
> >> る、という理解でよろしいでしょうか?
> >
> > はい、そうなります。またパフォーマンス以外にも(PostgreSQL の)デッドロック
> > が発生する可能性が高くなります。
> 
> なるほど… やはりロック周辺は相当難しい問題のようですね。

デッドロックするのは以下のような状況になります。

client-1)
  BEGIN;
  UPDATE t1 SET a = 3 WHERE b = 1;
  UPDATE t2 SET a = 3 WHERE b = 1;
  COMMIT;

client-2)
  BEGIN;
  UPDATE t2 SET a = 3 WHERE b = 2;
  UPDATE t1 SET a = 3 WHERE b = 2;
  COMMIT;

を実行すると、通常で更新する行が異なるのでロック待ちが発生しませんが、
現在の PGCluster ではどちらかのデッドロックによりトランザクションがア
ボートしてしまいます。


> この場合に発生しうるpostgresqlレベルのデッドロックは、deadlock_timeout
> で調整可能なのでしょうか。

はい、可能です。


> > ちなみに、INSERT するテーブルには何か制約かトリガーが設定してあります
> > でしょうか?また、トランザクションを終了させずにクライアントが接続を切
> > 断しているロジックはありますでしょうか?
> 
> 今の時点では、トリガーや(外部参照を伴うような)制約は特にありません。
> 
> クライアント側の挙動に関してはわたしの方では把握できていないので、調べ
> てみます。cgi/fcgi の物がほとんどなので、プログラムミス以外で途中切断す
> るように書かれた物はないと思います。ですがWWWクライアントから接続を切ら
> れた場合の動作によっては、途中で接続断が発生するかもしれません。

ShareRowExclusive 以上のレベルのテーブルロックを握ったままトランザクショ
ンを終了させずにクライアントが終了しますと、レプリケーションサーバがデッ
ドロックが発生する可能性がありました。1.0.10 に対するパッチを三谷さん
に送りましたが、お忙しいようなので、もしかしたらまだリリースされていな
いかもしれません。

--
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp



pgcluster メーリングリストの案内