setup_instruments
表格列出可收集事件的檢測物件類別
mysql> SELECT * FROM performance_schema.setup_instruments\G
*************************** 1. row ***************************
NAME: wait/synch/mutex/pfs/LOCK_pfs_share_list
ENABLED: NO
TIMED: NO
PROPERTIES: singleton
FLAGS: NULL
VOLATILITY: 1
DOCUMENTATION: Components can provide their own performance_schema tables.
This lock protects the list of such tables definitions.
...
*************************** 410. row ***************************
NAME: stage/sql/executing
ENABLED: NO
TIMED: NO
PROPERTIES:
FLAGS: NULL
VOLATILITY: 0
DOCUMENTATION: NULL
...
*************************** 733. row ***************************
NAME: statement/abstract/Query
ENABLED: YES
TIMED: YES
PROPERTIES: mutable
FLAGS: NULL
VOLATILITY: 0
DOCUMENTATION: SQL query just received from the network.
At this point, the real statement type is unknown, the type
will be refined after SQL parsing.
...
*************************** 737. row ***************************
NAME: memory/performance_schema/mutex_instances
ENABLED: YES
TIMED: NULL
PROPERTIES: global_statistics
FLAGS:
VOLATILITY: 1
DOCUMENTATION: Memory used for table performance_schema.mutex_instances
...
*************************** 823. row ***************************
NAME: memory/sql/Prepared_statement::infrastructure
ENABLED: YES
TIMED: NULL
PROPERTIES: controlled_by_default
FLAGS: controlled
VOLATILITY: 0
DOCUMENTATION: Map infrastructure for prepared statements per session.
...
每個新增至原始碼的檢測都會為 setup_instruments
表格提供一個資料列,即使未執行檢測程式碼也是如此。當啟用並執行檢測時,將建立檢測實例,這些實例在
表格中可見,例如 xxx
_instancesfile_instances
或 rwlock_instances
。
對大部分 setup_instruments
資料列的修改會立即影響監控。對於某些檢測,修改僅在伺服器啟動時有效;在執行階段變更它們無效。這主要影響伺服器中的互斥鎖、條件與讀寫鎖,不過可能還有其他檢測也適用此情況。
如需有關 setup_instruments
表格在事件篩選中的作用的詳細資訊,請參閱 第 29.4.3 節,「事件預先篩選」。
setup_instruments
表格具有以下資料行:
NAME
檢測名稱。檢測名稱可以有多個部分並形成階層,如 第 29.6 節「Performance Schema 儀器命名慣例」中所述。從執行檢測產生的事件具有從檢測
NAME
值取得的EVENT_NAME
值。(事件實際上沒有「名稱」,但這提供了一種將事件與檢測相關聯的方式。)ENABLED
檢測是否啟用。值為
YES
或NO
。停用的檢測不會產生任何事件。可以修改此資料行,不過設定ENABLED
對於已建立的檢測沒有任何作用。TIMED
檢測是否計時。值為
YES
、NO
或NULL
。可以修改此資料行,不過設定TIMED
對於已建立的檢測沒有任何作用。TIMED
值為NULL
表示檢測不支援計時。例如,記憶體作業未計時,因此其TIMED
資料行是NULL
。將支援計時的檢測之
TIMED
設定為NULL
無效,將不支援計時的檢測之TIMED
設定為非NULL
也無效。如果已啟用的檢測未計時,則會啟用檢測程式碼,但不會啟用計時器。檢測產生的事件,其
TIMER_START
、TIMER_END
和TIMER_WAIT
計時器值為NULL
。這又會導致在計算摘要表格中的總和、最小值、最大值和平均時間值時忽略這些值。PROPERTIES
檢測屬性。此資料行使用
SET
資料類型,因此可以針對每個檢測設定以下清單中的多個旗標controlled_by_default
:預設會針對此檢測收集記憶體。global_statistics
:此儀器僅產生全域摘要。無法取得更細緻層級的摘要,例如每個執行緒、帳戶、使用者或主機的摘要。例如,大多數記憶體儀器僅產生全域摘要。mutable
:此儀器可以「變異」成更具體的儀器。此屬性僅適用於陳述式儀器。progress
:此儀器能夠報告進度資料。此屬性僅適用於階段儀器。singleton
:此儀器只有一個單一實例。例如,伺服器中大多數全域互斥鎖都是單例,因此對應的儀器也是如此。user
:此儀器直接與使用者工作負載相關(而非系統工作負載)。其中一個這樣的儀器是wait/io/socket/sql/client_connection
。
旗標
是否控制儀器的記憶體。
此旗標僅支援非全域記憶體儀器,且可以設定或取消設定。例如
SQL> UPDATE PERFORMANCE_SCHEMA.SETUP_INTRUMENTS SET FLAGS="controlled" WHERE NAME='memory/sql/NET::buff';
注意嘗試在非記憶體儀器或全域記憶體儀器上設定
FLAGS = controlled
將會無聲地失敗。變動性
儀器的變動性。變動性值範圍從低到高。這些值對應於
mysql/psi/psi_base.h
標頭檔中定義的PSI_VOLATILITY_
常數。xxx
#define PSI_VOLATILITY_UNKNOWN 0 #define PSI_VOLATILITY_PERMANENT 1 #define PSI_VOLATILITY_PROVISIONING 2 #define PSI_VOLATILITY_DDL 3 #define PSI_VOLATILITY_CACHE 4 #define PSI_VOLATILITY_SESSION 5 #define PSI_VOLATILITY_TRANSACTION 6 #define PSI_VOLATILITY_QUERY 7 #define PSI_VOLATILITY_INTRA_QUERY 8
VOLATILITY
資料行純粹是資訊性的,旨在向使用者(以及 Performance Schema 程式碼)提供一些關於儀器執行時行為的提示。變動性索引較低的儀器(PERMANENT = 1)會在伺服器啟動時建立一次,並且在正常的伺服器運作期間永遠不會銷毀或重新建立。它們僅在伺服器關閉期間銷毀。
例如,
wait/synch/mutex/pfs/LOCK_pfs_share_list
互斥鎖被定義為變動性 1,這表示它會建立一次。儀器本身可能產生的額外負擔(即互斥鎖初始化)對此儀器沒有影響。執行時的額外負擔僅在鎖定或解除鎖定互斥鎖時發生。變動性索引較高的儀器(例如 SESSION = 5)會為每個使用者連線建立和銷毀。例如,
wait/synch/mutex/sql/THD::LOCK_query_plan
互斥鎖會在每次連線時建立,並在連線中斷時銷毀。此互斥鎖對 Performance Schema 的額外負擔更加敏感,因為額外負擔不僅來自鎖定和解除鎖定儀器,還來自互斥鎖建立和銷毀儀器,這些儀器會更頻繁地執行。
變動性的另一個面向涉及對
ENABLED
資料行的更新何時以及是否實際產生影響對
ENABLED
的更新會影響後續建立的儀器物件,但對已建立的儀器沒有影響。更「易變」的儀器會更快地使用來自
setup_instruments
表格的新設定。
例如,此陳述式不會影響現有連線的
LOCK_query_plan
互斥鎖,但會影響更新之後建立的新連線UPDATE performance_schema.setup_instruments SET ENABLED=value WHERE NAME = 'wait/synch/mutex/sql/THD::LOCK_query_plan';
此陳述式實際上完全沒有影響
UPDATE performance_schema.setup_instruments SET ENABLED=value WHERE NAME = 'wait/synch/mutex/pfs/LOCK_pfs_share_list';
此互斥鎖是永久性的,並且在執行更新之前就已建立。此互斥鎖永遠不會再次建立,因此永遠不會使用
setup_instruments
中的ENABLED
值。若要啟用或停用此互斥鎖,請改用mutex_instances
表格。文件
描述儀器用途的字串。如果沒有可用的描述,則值為
NULL
。
setup_instruments
表格具有下列索引
主索引鍵為 (
NAME
)
TRUNCATE TABLE
不允許用於 setup_instruments
表格。
為了協助監控和疑難排解,Performance Schema 儀器會用於將儀器化執行緒的名稱匯出到作業系統。這讓顯示執行緒名稱的公用程式(例如偵錯工具和 Unix ps 命令)能夠顯示不同的 mysqld 執行緒名稱,而不是 「mysqld」。此功能僅在 Linux、macOS 和 Windows 上支援。
假設 mysqld 在具有支援此調用語法的 ps 版本的系統上執行
ps -C mysqld H -o "pid tid cmd comm"
如果沒有將執行緒名稱匯出到作業系統,則命令會顯示類似這樣的輸出,其中大多數 COMMAND
值為 mysqld
PID TID CMD COMMAND
1377 1377 /usr/sbin/mysqld mysqld
1377 1528 /usr/sbin/mysqld mysqld
1377 1529 /usr/sbin/mysqld mysqld
1377 1530 /usr/sbin/mysqld mysqld
1377 1531 /usr/sbin/mysqld mysqld
1377 1534 /usr/sbin/mysqld mysqld
1377 1535 /usr/sbin/mysqld mysqld
1377 1588 /usr/sbin/mysqld xpl_worker1
1377 1589 /usr/sbin/mysqld xpl_worker0
1377 1590 /usr/sbin/mysqld mysqld
1377 1594 /usr/sbin/mysqld mysqld
1377 1595 /usr/sbin/mysqld mysqld
如果將執行緒名稱匯出到作業系統,則輸出會如下所示,其中執行緒的名稱與其儀器名稱類似
PID TID CMD COMMAND
27668 27668 /usr/sbin/mysqld mysqld
27668 27671 /usr/sbin/mysqld ib_io_ibuf
27668 27672 /usr/sbin/mysqld ib_io_log
27668 27673 /usr/sbin/mysqld ib_io_rd-1
27668 27674 /usr/sbin/mysqld ib_io_rd-2
27668 27677 /usr/sbin/mysqld ib_io_wr-1
27668 27678 /usr/sbin/mysqld ib_io_wr-2
27668 27699 /usr/sbin/mysqld xpl_worker-2
27668 27700 /usr/sbin/mysqld xpl_accept-1
27668 27710 /usr/sbin/mysqld evt_sched
27668 27711 /usr/sbin/mysqld sig_handler
27668 27933 /usr/sbin/mysqld connection
同一類別中的不同執行緒實例會編號,以在可行時提供不同的名稱。由於名稱長度相對於潛在的大量連線存在限制,因此連線只會簡單地命名為 connection
。