MYSQL connector/.NET 預設的 show variables 引起的執行緒mutex鎖爭用
1)檢查當時的主機資源狀態,其cpu 記憶體,磁碟IO 負載實際都並不高。 複查主機資源發現當時的load avage指標異常,1分鐘平均負載量達到100以上,5分鐘平均負載量達到90以上,10分鐘平均負載量達到60以上,說明當時cpu的執行佇列出現排隊現象。
2)當時的thread cache size 分別出現兩次耗盡情況,大量的執行緒處於running的狀態。
3)從後臺慢日誌看,show variables 語句每次執行都超過了10秒鐘,該sql正常情況執行時間為不到0.1秒鐘,這是非正常現象。
4)從當時的processlists來看,將近90%的活動會話在執行show variables 語句,其狀態主要是在Sending data (約70%) 和preparing (約15%)上。
關於 sending data解析:
sending data 是指在儲存引擎和伺服器上層之間進行資料交換,不只是在向客戶端傳送任何資料階段。當伺服器執行一個查詢時,這主要發生在兩個層面。 它發生在 SQL Server 層,在那裡解析查詢,檢索資料, 然後可以做進一步的處理( filter 、 sort 、 group 、 join ),再將結果返回給客戶機以及儲存引擎( InnoDB , MyISAM )層等一系列階段。 |
在 MYSQL 5.7環境模擬了大量併發的會話執行"show variables"的操作,同樣可以看到大量會話堵塞在Sending data狀態,透過跟蹤執行緒堆疊資訊,發現大量的show variables 語句在Sending data狀態都是在申請執行緒mutex鎖時發生了鎖等待。因此可以說明大量併發的show variables 語句執行時,會因為大量的執行緒mutex鎖爭用,而引起會話阻塞堆積。從上面的主機資源情況也可以看出,cpu並不高,但是load avage 比較高是因為執行緒的鎖申請等待引起的排隊。
測試結果 :
+--------------+------+-------------------+-----------+---------+------+--------------+----------------+ | THREAD_OS_ID | user | host | db | command | time | state | info | +--------------+------+-------------------+-----------+---------+------+--------------+----------------+ | 26089 | root | ACS-SCN-DB1:48088 | employees | Query | 0 | Sending data | SHOW VARIABLES | 《《《《《《《 ====== 處於 Sending data 狀態
Thread 187 (Thread 0x7fa8149c6700 ( LWP 26089)): #0 0x00007fa8dadb354d in __lll_lock_wait () from /lib64/libpthread.so.0 《《《《《《《 ====== 鎖等待 #1 0x00007fa8dadaeed1 in _L_lock_1093 () from /lib64/libpthread.so.0 《《《《《《《 ====== L_lock_1093 () #2 0x00007fa8dadaee72 in pthread_mutex_lock () from /lib64/libpthread.so.0 《《《《《《《 ====== 執行緒互斥鎖 #3 0x00000000011df234 in native_mutex_lock (mutex=<optimized out>) at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/include/thr_mutex.h:91 #4 my_mutex_lock (mp=<optimized out>) at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/include/thr_mutex.h:189 #5 inline_mysql_mutex_lock (src_line=80, src_file=0x17f10f0 "/export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/storage/perfschema/table_session_variables.cc", that=<optimized out>) at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/include/mysql/psi/mysql_thread.h:722 #6 table_session_variables::get_row_count () at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/storage/perfschema/table_session_variables.cc:80 #7 0x0000000001185fdf in ha_perfschema::info (this=0x7fa6c806a000, flag=<optimized out>) at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/storage/perfschema/ha_perfschema.cc:400 #8 0x0000000000d8f125 in make_join_readinfo (join=0x7fa7ec0707d0, no_jbuf_after=<optimized out>) at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/sql/sql_select.cc:2222 。。。。。。 (thd=0x7fa7ec037630, com_data=0x7fa8149c5da0, command=COM_QUERY) at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/sql/sql_parse.cc:1491 #20 0x0000000000d529e4 in do_command (thd=0x7fa7ec037630) at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/sql/sql_parse.cc:1032 #21 0x0000000000e24dcc in handle_connection (arg=<optimized out>) at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/sql/conn_handler/connection_handler_per_thread.cc:313 #22 0x0000000001188c74 in pfs_spawn_thread (arg=0x7d25480) at /export/home/pb2/build/sb_0-37309218-1576676677.02/mysql-5.7.29/storage/perfschema/pfs.cc:2197 #23 0x00007fa8dadacea5 in start_thread () from /lib64/libpthread.so.0 #24 0x00007fa8d98658cd in clone () from /lib64/libc.so.6
|
5)關於SHOW VARIABLES 的來源,SHOW VARIABLES是MYSQL connector/.NET 預設帶上的,它在每次連線時都會發起一次查詢SHOW VARIABLES去獲取需要的相關資訊。當前的mysql資料庫在高峰期的短連線量較大,隨之而來的是大量的SHOW VARIABLES查詢。
針對 SHOW VARIABLES官方是可以建議關閉該屬性,描述及方法如下:
Configure MySQL Connector/.NET to Avoid Executing SHOW VARIABLES Command with Each New MySQL Connection (Doc ID 2106146.1)
SOLUTION With following connection string parameter new connections will not execute SHOW VARIABLES command : CacheServerProperties=true Also waiting for the feature request to be implemented:
REFERENCES https://dev.mysql.com/doc/connector-net/en/connector-net-connection-options.html
|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29863023/viewspace-2719546/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- C++11多執行緒程式設計(二)——互斥鎖mutex用法C++執行緒程式設計Mutex
- 執行緒的互斥鎖執行緒
- .NET中各種執行緒同步鎖執行緒
- 多執行緒引起的效能問題分析執行緒
- ObjC 多執行緒簡析(一)-多執行緒簡述和執行緒鎖的基本應用OBJ執行緒
- 執行緒中的死鎖執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 純Mutex實現多執行緒交替列印Mutex執行緒
- 執行緒鎖(四)執行緒
- 多執行緒_鎖執行緒
- java執行緒的狀態+鎖分析Java執行緒
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- C#多執行緒(4):程式同步Mutex類C#執行緒Mutex
- 執行緒和鎖,鎖升級執行緒
- python之執行緒鎖Python執行緒
- 【Swift】iOS 執行緒鎖SwiftiOS執行緒
- Linux多執行緒的使用一:互斥鎖Linux執行緒
- 第15篇 執行緒鎖的問題執行緒
- iOS開發基礎——執行緒安全(執行緒鎖)iOS執行緒
- 執行緒安全引起的錄音雜音電流音問題執行緒
- Java多執行緒程式設計—鎖優化Java執行緒程式設計優化
- 多執行緒併發程式設計“鎖”事執行緒程式設計
- Java併發程式設計:執行緒和鎖的使用與解析Java程式設計執行緒
- 多執行緒程式設計進階——Java類庫中的鎖執行緒程式設計Java
- 執行緒池中的最大執行緒數、核心執行緒數和佇列大小的合理設定執行緒佇列
- 多執行緒,執行緒類三種方式,執行緒排程,執行緒同步,死鎖,執行緒間的通訊,阻塞佇列,wait和sleep區別?執行緒佇列AI
- 故障分析 | show processlist 引起的效能問題
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- MySQL 配置InnoDB的併發執行緒MySql執行緒
- Java多執行緒的悲觀鎖與樂觀鎖及各自適用場景Java執行緒
- 執行緒狀態和鎖執行緒
- Linux之執行緒互斥鎖Linux執行緒
- Java 執行緒安全 與 鎖Java執行緒
- MySQL_殺mysql執行緒MySql執行緒
- Java多執行緒-鎖的區別與使用Java執行緒