《MySQL線程》要點:
本文介紹了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光陰 |
1 | main | 1 | 主線程 | |
2 | innodb ibuff io thread | 1 | innodb inser buff寫入和讀取線程 | 0s |
3 | innodb log io thread | 1 | innodb undo log寫入和讀取線程 | 1s |
4 | innodb read threads | innodb_read_io_threads | innodb數據庫文件read ahead線程 | 9s*8 |
5 | innodb write threads | innodb_write_io_threads | innodb數據庫文件寫入線程 | 2m*8 |
6 | lock_wait_timeout_thread | 1 | watches the timeouts for lock waits | 0.99s |
7 | srv_error_monitor_thread | 1 | warns of long semaphore waits | 33s |
8 | srv_monitor_thread | 1 | prints InnoDB monitor info | 0.15s |
9 | srv_master_thread | 1 | does purge and other utility operations | 4s |
10 | srv_purge_coordinator_thread | 1 | redo log清理 | 1h |
11 | srv_worker_thread | innodb_purge_threads – 1 | purge worker | 0 |
12 | buf_flush_page_cleaner_thread | 1 | flush page | 53m |
13 | buf_dump_thread | 1 | buffer pool dump/load thread | 0s |
14 | dict_stats_thread | 1 | dict stats gathering thread | 0.11s |
15 | fts_optimize_thread | 1 | Optimize all FTS tables | 0.15s |
16 | signal_handler | 1 | signal handler thread | 0s |
17 | slave_io | 1 | slave io | 19m |
18 | slave_sql | 1 | slave sql | 11h |
19 | connection | n | handler | 0 |
下一節,本人將分享關于使用strace跟蹤線程的操作履歷.
《MySQL線程》是否對您有啟發,歡迎查看更多與《MySQL線程》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7121.html