為什麼MySQL死鎖檢測會嚴重降低TPS

2022-04-29 01:12:06 字數 1324 閱讀 6908

在大量的客戶端,更新資料表的同一行時,會造成資料庫的吞吐量大幅降低。

很多資料庫的前輩和同行分別通過實驗和原始碼的方法,定位到了罪魁禍首----mysql死鎖檢測

實驗方式:

原始碼方式:

請大家尤其注意這段**

lock_mutex_enter();

ut_ad(lock_table_has(thr_get_trx(thr), index->table, lock_ix));

err = lock_rec_lock(true, lock_x | lock_rec_not_gap,

block, heap_no, index, thr);

monitor_inc(monitor_num_reclock_req);

lock_mutex_exit();

可以看出,mysql在試圖獲取鎖期間,會有lock_mutex_enter 和lock_mutex_exit保護。

在一般情況下,lock_rec_lock執行速度很快,所以不成問題。

但是如果有大量鎖等待的情況,比如多個客戶端試圖更新同一行,則這個過程非常緩慢。因此整個innodb層就由並行變成了序列,大幅降低tps。

解決辦法:

讓鎖等待盡量少,可以通過在資料庫層設定等待佇列達到這個效果,而onesql內建了這個方案。     

測試用例:

update miaosha set mount=mount+1 where id=1;

測試環境

mysql和onesql的關鍵引數配置如下,且均未開啟binlog

資料庫innodb_flush_log_at_trx_commit

innodb_log_file_size

innodb_buffer_pool_size

onesql

11000m

8gmysql

11000m

8g硬體環境 

記憶體cpu

磁碟32g

8c 每個core上有兩個超執行緒

intel(r) xeon(r) cpu

e5620  @ 2.40ghz

2塊raid0

7500r

測試結果:      

在512個執行緒情況下,tps為500/s

我實際測試,同樣的環境下使用onesql,tps可以達到15682/s,效能提公升達30倍左右。

什麼是死鎖,為什麼會產生死鎖?

死鎖 每個人都擁有其他人需要的資源,同時又等待其他人擁有的資源,並且每個人在獲得所有需要的資源之前都不會放棄已經擁有的資源。當多個執行緒完成功能需要同時獲取多個共享資源的時候可能會導致死鎖。死鎖的條件 1兩個以上的執行緒 2至少兩個鎖以上 3同步中巢狀同步 男孩 public class boyex...

mysql 死鎖是什麼 mysql死鎖是什麼意思

mysql死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資源,從而導致惡性迴圈。innodb儲存引擎能檢測到死鎖的迴圈依賴並立即返回乙個錯誤。只有部分或完全回滾其中乙個事務,才能打破死鎖。什麼是死鎖?它是如何產生的?死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資...

為什麼會出現死鎖

今天在閱讀 我在思考乙個 如何可以抵擋得住大的迸發量,我先羅列我應該會設計的方案,然後再分析其中實現應該注意的地方 首先如果資料量很大的話,我們是要分散請求的,也就是需要伺服器來聯合作戰,當然這裡我們就需要有乙個好的輪詢的演算法,不然會出現資料無法保持一致而導致程式中隱藏bug,所以說,考慮的方面不...