データベースのデッドロック発生について

いつもお世話になっております。

OS : gentoo
DB : postgresql-8.4.5
zabbix: 1.8.3

上記の環境にて監視を行っております。

監視中にzabbix_server.logに下記のエラーが出力されるようになりました。

[Z3005] Query failed: [0] PGRES_FATAL_ERROR:ERROR: deadlock detected

もしくは

[Z3005] Query failed: [0] PGRES_FATAL_ERROR:ERROR: current transaction is aborted, commands ignored until end of transaction block

一度これが発生すると、zabbixとpostgresを再起動するまで延々ログに出力され続け、あっという間にログがGサイズになってしまう事も有ります。

発動した時の状況を調べたところ、ログ監視が引き金になっている模様です。
全てのサーバで同時刻に動いているcronが有るのですが、その時にログに情報が出ます。
それが同時にzabbix-serverに送られてDBに取り込む際にdeadlockが発生している模様です。

試しにサービスサーバにスクリプトで一斉にsshを行って、/var/log/secureにログイン・ログアウト情報を
出したところ、同じ状況が発生しました。

deadlockが発生しているので、データ登録の仕方に問題が有るのかと思いますが、何かアドバイス等有りましたら
ご教授よろしくお願い致します。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー kodai の写真

データベース書き込みの際にトランザクションのロック待ちでタイムアウトが発生しているのかもしれません。

まずはデータベースのパフォーマンスが適切に確保されているかどうかを確認してみてください。CPU負荷やロードアベレージが高くなっていないか、I/O待ちが多く発生していないかどうかが気になります。

あとはデータベースのロック待ちのタイムアウト設定を長くすることで解消する可能性もあると思います。

ユーザー MINTIA の写真

ロードアベレージは0.5〜1.1程度の間を推移しています。

試しにdeadlock_timeoutを伸ばしてみたところ、無くなりはしないものの発生確率は下がった模様です。
postgresqlのチューニングを今一度試してみます。

アドバイス有難うございました。