mutex_instances
表格列出伺服器執行時 Performance Schema 所看到的所有互斥鎖。互斥鎖是程式碼中使用的一種同步機制,用於強制在給定時間只有一個執行緒可以存取某些共用資源。該資源被稱為受互斥鎖「保護」。
當在伺服器中執行的兩個執行緒(例如,同時執行查詢的兩個使用者工作階段)需要存取相同的資源(檔案、緩衝區或某些資料片段)時,這兩個執行緒會相互競爭,因此第一個取得互斥鎖鎖定的查詢會導致另一個查詢等待,直到第一個查詢完成並解除互斥鎖。
在持有互斥鎖時執行的工作稱為在「臨界區段」中,多個查詢會以序列化方式(一次一個)執行此臨界區段,這是一個潛在的瓶頸。
mutex_instances
表格具有以下欄位
NAME
與互斥鎖相關聯的工具名稱。
OBJECT_INSTANCE_BEGIN
檢測互斥鎖的記憶體位址。
LOCKED_BY_THREAD_ID
當執行緒目前鎖定互斥鎖時,
LOCKED_BY_THREAD_ID
是鎖定執行緒的THREAD_ID
,否則為NULL
。
mutex_instances
表格具有以下索引
主索引鍵位於 (
OBJECT_INSTANCE_BEGIN
)索引位於 (
NAME
)索引位於 (
LOCKED_BY_THREAD_ID
)
TRUNCATE TABLE
不允許用於 mutex_instances
表格。
對於程式碼中檢測的每個互斥鎖,Performance Schema 會提供以下資訊。
setup_instruments
表格列出檢測點的名稱,前綴為wait/synch/mutex/
。當某些程式碼建立互斥鎖時,會在
mutex_instances
表格中新增一列。OBJECT_INSTANCE_BEGIN
欄位是一個可唯一識別互斥鎖的屬性。當執行緒嘗試鎖定互斥鎖時,
events_waits_current
表格會顯示該執行緒的一列,指出它正在等待互斥鎖(在EVENT_NAME
欄位中),並指出正在等待哪個互斥鎖(在OBJECT_INSTANCE_BEGIN
欄位中)。當執行緒成功鎖定互斥鎖時
events_waits_current
顯示互斥鎖的等待已完成(在TIMER_END
和TIMER_WAIT
欄位中)完成的等待事件會新增至
events_waits_history
和events_waits_history_long
表格mutex_instances
顯示互斥鎖現在由執行緒擁有(在THREAD_ID
欄位中)。
當執行緒解除鎖定互斥鎖時,
mutex_instances
會顯示該互斥鎖目前沒有擁有者(THREAD_ID
欄位為NULL
)。當互斥鎖物件被銷毀時,對應的資料列會從
mutex_instances
中移除。
透過查詢以下兩個資料表,監控應用程式或 DBA 可以偵測到執行緒之間涉及互斥鎖的瓶頸或死鎖
events_waits_current
,以查看執行緒正在等待哪個互斥鎖mutex_instances
,以查看目前哪個執行緒擁有互斥鎖