データベースのデッドロック発生について
いつもお世話になっております。
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 - 投稿数: 1341
データベース書き込みの際にトランザクションのロック待ちでタイムアウトが発生しているのかもしれません。
まずはデータベースのパフォーマンスが適切に確保されているかどうかを確認してみてください。CPU負荷やロードアベレージが高くなっていないか、I/O待ちが多く発生していないかどうかが気になります。
あとはデータベースのロック待ちのタイムアウト設定を長くすることで解消する可能性もあると思います。
MINTIA - 投稿数: 40
ロードアベレージは0.5〜1.1程度の間を推移しています。
試しにdeadlock_timeoutを伸ばしてみたところ、無くなりはしないものの発生確率は下がった模様です。
postgresqlのチューニングを今一度試してみます。
アドバイス有難うございました。