mysql的worker 线程_MySQL线程
當MySQL服務器本身遇到性能問題的時候,一般可以通過slow log來找到耗時比較多的SQL語句,并且進一步通過explain來優化和改進SQL執行速度。這種方法有這幾方面的限制:首先,并不是所有的問題都是因為異常SQL造成的,當大量SQL請求時間比較長,但不到slow log閾值的時候(通常線上無法將slow log閾值設置的較小),MySQL服務器負載也會很高;其次,MySQL服務器本身的狀態會影響SQL的執行,有一些沒有問題的SQL語句在MySQL負載較高時,也會進入slow log。
另外一種方法是通過MySQL的Performance Schema、Innodb status以及MySQL status等MySQL統計信息來定位問題;這通常需要對MySQL的實現有相當的了解;并且定位問題不是非常直接。
本人認為除了以上兩種辦法之外,可以通過strace MySQL的線程來定位性能瓶頸。這種方法可以定位出因為系統IO(包括網絡)、內存、線程同步(MySQL鎖使用錯誤)等造成的問題;也就是說,如果能確定MySQL Server不存在大量需要在用戶態進行的計算(例如浮點運算、字符串處理等),都可以嘗試使用此方法。
下面將介紹MySQL線程相關的一些信息,以MySQL5.6.29為例,MySQL5.7會有一些不一樣。
1、多線程程序
MySQL只有一個進程,使用多線程實現并發。使用InnoDB作為存儲引擎的情況下,主要關注MySQL和InnoDB創建的線程。
可以使用MySQL的Performance Schema.threads表來查看MySQL的線程。這個表含所有MySQL創建并活躍的線程以及部分InnoDB線程。
2、線程池
每次和MySQL Server建立連接,MySQL服務器都會創建或分配一個線程處理對應的請求。
MySQL會維護一個線程池管理這些工作線程。只有當工作線程的正在響應請求時,才會進入Performance Schema.threads表。可以通過向MySQL進程發送SIGHUP信號來釋放所有的線程并創建一個只有一個線程的線程池。
3、InnoDB線程
InnoDB會創建很多功能線程(都是運行期間常駐線程),用于處理異步任務。但也許InnoDB有很多代碼是臨時工寫的,有部分線程沒有使用MySQL提供的Performance Schema機制注冊到threads表中。
4、線程對應
由于threads表中沒有包含線程的系統id,甚至由于第2點和第3點的原因(部分線程不會出現在threads)表中,因此無法通過threads表將MySQL的線程對應到系統線程。
以下表為本人梳理的線程創建順序及數量,可以通過將MySQL服務器按照線程ID進行排序,然后一一對應上。(注:由于MySQL在啟動過程中需要創建一些臨時線程,因此MySQL的線程ID并不是連續的)
下表所列CPU時間為本人的線上環境的某一個從庫的時間。
創建順序線程名稱線程數量線程作用CPU時間
1main1主線程
2innodb ibuff io thread1innodb inser buff寫入和讀取線程0s
3innodb log io thread1innodb undo log寫入和讀取線程1s
4innodb read threadsinnodb_read_io_threadsinnodb數據庫文件read ahead線程9s*8
5innodb write threadsinnodb_write_io_threadsinnodb數據庫文件寫入線程2m*8
6lock_wait_timeout_thread1watches the timeouts for lock waits0.99s
7srv_error_monitor_thread1warns of long semaphore waits33s
8srv_monitor_thread1prints InnoDB monitor info0.15s
9srv_master_thread1does purge and other utility operations4s
10srv_purge_coordinator_thread1redo log清理1h
11srv_worker_threadinnodb_purge_threads – 1purge worker0
12buf_flush_page_cleaner_thread1flush page53m
13buf_dump_thread1buffer pool dump/load thread0s
14dict_stats_thread1dict stats gathering thread0.11s
15fts_optimize_thread1Optimize all FTS tables0.15s
16signal_handler1signal handler thread0s
17slave_io1slave io19m
18slave_sql1slave sql11h
19connectionnhandler0
下一節,本人將分享關于使用strace跟蹤線程的操作經驗。
總結
以上是生活随笔為你收集整理的mysql的worker 线程_MySQL线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 烟花烟花满天飞是哪首歌啊?
- 下一篇: java mysql 是否插入 成功_您