MySQL訪問行更新慢、使用者執行緒大量堆積竟是因為它
1 問題現象
最近,騰訊雲某內部系統不定期出現資料庫訪問行更新慢,資料庫使用者執行緒大量堆積的現象。從slow log中觀察,大量update執行時間超過10秒,甚至個別update執行時間超過百秒,這已經嚴重影響該系統的正常執行。 運維同學不得不採取殺死執行session的方式解決該問題,由於訪問資料庫的任務是離線後臺批處理任務,因此會選擇業務壓力小的時候執行該任務,比如半夜12點,因此,運維同學必須半夜採取緊急措施,這給線上執行造成極大的負擔。
2 問題分析
2.1 山重水複
2.2 峰會路轉
2.3 柳暗花明
-
233個執行緒等待lock_wait_suspend_thread中的lock_wait_table_release_slot的入口mutex上 -
181個執行緒等待lock_wait_suspend_thread本身的mutex上。
-
使用者執行緒呼叫的lock_wait_suspend_thread -
後臺執行緒:lock_wait_timeout_thread
-
每秒定時觸發 -
lock_wait_suspend_thread通知觸發,這個就是熱點行更新慢的關鍵!
3 問題解決
阻斷lock_wait_suspend_thread 對lock_wait_timeout_thread觸發,如下圖所示:
4 結果
業務模擬工具按照線上業務模型,模擬線上執行2000個業務請求同時進行,每秒每個請求更新一次,分析每個訪問的執行時間(對binlog掃面得到執行時間(exec_time)得出執行時間)
|
|
|
|
|
|
|
|
|
|
|
|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556440/viewspace-2675496/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多執行緒C++更新MYSQL執行緒C++MySql
- 請教tomcat5.0.27server狀態執行緒堆積的問題TomcatServer執行緒
- 如何利用執行緒堆疊定位問題執行緒
- c#基礎,單執行緒,跨執行緒訪問和執行緒帶引數C#執行緒
- 為什麼python執行效率低?原來因為它!Python
- Java多執行緒-程式執行堆疊分析Java執行緒
- Java多執行緒/併發12、多執行緒訪問static變數Java執行緒變數
- Control的Invoke和BeginInvoke 是相對於支線執行緒(因為一般在支線執行緒中呼叫,用來更新主執行緒ui)Invoke立即插入主執行緒中執行,而BeginInvoke 要等主執行緒結束才執行執行緒UI
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- 為何要在主執行緒上更新UI執行緒UI
- C# WinForm 執行緒間操作無效: 從不是建立控制元件的執行緒訪問它的解決辦法C#ORM執行緒控制元件
- 多執行緒訪問—限制某個方法只執行一次執行緒
- MFC多執行緒的建立,包括工作執行緒和使用者介面執行緒執行緒
- java多執行緒執行問題Java執行緒
- c#-跨執行緒控制元件訪問問題C#執行緒控制元件
- MySQL_殺mysql執行緒MySql執行緒
- MySQL 批量殺mysql執行緒MySql執行緒
- Core Data:多執行緒大量資料同步執行緒
- 執行緒問題執行緒
- JVM中的執行緒行為JVM執行緒
- 利用CheckForIllegalCrossThreadCalls=false設定跨執行緒訪問ROSthreadFalse執行緒
- 資料訪問連線池和執行緒池執行緒
- 關於多執行緒訪問靜態方法的問題執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 執行緒池管理(1)-為什麼需要執行緒池執行緒
- redis為什麼用單執行緒不用多執行緒Redis執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- 多執行緒問題執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Android中子執行緒更新主執行緒UI和ProgressBar的應用Android執行緒UI
- JVM 執行緒堆疊分析過程詳解JVM執行緒
- 多執行緒-執行緒控制之守護執行緒執行緒
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- WPF 之 呼叫執行緒必須為 STA,因為許多 UI 元件都需要執行緒UI元件
- 執行緒和執行緒池執行緒