Project

General

Profile

操作問い合わせ #3556

デッドロックへの対処について

Added by Anonymous 9 months ago. Updated 21 days ago.

Status:
新規登録
Priority:
通常
Assignee:
-
Start date:
01/29/2021

Description

下記のようなトランザクションでのデッドロックが頻繁に発生いたします。
(1)insert into ja_run_value_before_table (inner_job_id, inner_jobnet_id, value_name, before_value) select ※inner_job_id, ※inner_jobnet_id, value_name, before_value from ja_value_before_jobnet_table where inner_jobnet_id = ※inner_jobnet_id
(2)insert into ja_run_value_before_table (inner_job_id, inner_jobnet_id, value_name, before_value) select ※inner_job_id, inner_jobnet_id, value_name, after_value from ja_run_value_after_table where inner_job_id = ※inner_job_id

以前問い合わせした際には、MySQLのリソースチューニングの問題ではないか確認するよう(https://www.jobarranger.info/redmine/issues/2002参照)にご案内いただきました。
理解が無く大変恐縮なのですが、リソース値とデッドロックとの関係性が見えておりません。
①、メモリの割り当てと稼働ジョブネットの数などで指標などは、ございますでしょうか。
②、(1)と(2)のトランザクションはどういった処理なのでしょうか。
③、indexの改修で処理改善を試みることはできなのでしょうか。

※下記は、最新で起きた事象のログになります。
82924:20210129:070000.713 [ERROR] [Z3005] query failed: [1213] Deadlock found when trying to get lock; try restarting transaction [insert into ja_run_value_before_table (inner_job_id, inner_jobnet_id, value_name, before_value) select 2396150, 293496, value_name, before_value from ja_value_before_jobnet_table where inner_jobnet_id = 293496]

InnoDB: transactions deadlock detected, dumping detailed information.
210129 7:00:00
  • (1) TRANSACTION:
    TRANSACTION 1E7170155, ACTIVE 0 sec inserting
    mysql tables in use 2, locked 2
    LOCK WAIT 14 lock struct(s), heap size 3112, 7 row lock(s), undo log entries 9
    MySQL thread id 24265904, OS thread handle 0x7f1d9c50c700, query id 23146129561 localhost zabbix Sending data
    insert into ja_run_value_before_table (inner_job_id, inner_jobnet_id, value_name, before_value) select 2396150, 293496, value_name, before_value from ja_value_before_jobnet_table where inner_jobnet_id = 293496
  • (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 0 page no 1536807 n bits 376 index `ja_run_value_before_fk1` of table `zabbix`.`ja_run_value_before_table` trx id 1E7170155 lock_mode X insert intention waiting
  • (2) TRANSACTION:
    TRANSACTION 1E7170158, ACTIVE 0 sec setting auto-inc lock
    mysql tables in use 2, locked 2
    18 lock struct(s), heap size 3112, 33 row lock(s), undo log entries 19
    MySQL thread id 24265903, OS thread handle 0x7f1da8089700, query id 23146129576 localhost zabbix Sending data
    insert into ja_run_value_before_table (inner_job_id, inner_jobnet_id, value_name, before_value) select 2396147, inner_jobnet_id, value_name, after_value from ja_run_value_after_table where inner_job_id = 2396146
  • (2) HOLDS THE LOCK:
    RECORD LOCKS space id 0 page no 1536807 n bits 376 index `ja_run_value_before_fk1` of table `zabbix`.`ja_run_value_before_table` trx id 1E7170158 lock_mode X
  • (2) WAITING FOR THIS LOCK TO BE GRANTED:
    TABLE LOCK table `zabbix`.`ja_run_value_before_table` trx id 1E7170158 lock mode AUTO-INC waiting
  • WE ROLL BACK TRANSACTION (1)

Updated by Anonymous 9 months ago

DBチューニングをお勧めします。
https://assets.zabbix.com/img/zabconf2019_jp/presentations/08_zabconf2019.pdf
https://blog.kodai74.net/2013/11/zabbix10000.html
ご参考ください。

以上です。

Updated by Anonymous 21 days ago

mariadbのパフォーマンスチューニングを実施いたしました。
ほぼ全てのパラメータが初期値のままの状態だったため、割り当て可能な範囲で設定値の変更を実施いたしました。

・OSメモリ
4GB

・環境情報
JobArrengerServer:3.4.0
Zabbix Server:zabbix_server (Zabbix) 3.0.5
DBバージョン:5.5.50-MariaDB
OSバージョン:CentOS Linux release 7.2.1511 (Core)

・変更パラーメータ抜粋
innodb_additional_mem_pool_size:8M⇒16M
innodb_buffer_pool_size:128M⇒1228M
read_buffer_size :128K⇒1M
read_rnd_buffer_size:256K⇒2M
sort_buffer_size:2048K⇒2M
join_buffer_size:128K⇒256K
key_buffer_size:128MB

innodb_log_buffer_size:8M
innodb_log_file_size:5MB⇒128M
innodb_log_files_in_group⇒2

innodb_file_per_table⇒OFF
innodb_file_format⇒Antelope

ですが、変更後16時間程で再発した模様です。他に改善できる点等あれば教えていただけますでしょうか。
67968:20210928:090011.910 [ERROR] [Z3005] query failed: [1213] Deadlock found when trying to get lock; try restarting transaction [insert into ja_run_value_before_table (inner_job_id, inner_jobnet_id, value_name, before_value) select 10500598, inner_jobnet_id, value_name, after_value from ja_run_value_after_table where inner_job_id = 10500596]

Also available in: Atom PDF