该 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
。
FLAGS
该工具的内存是否受控。
此标志仅支持非全局内存工具,并且可以设置或取消设置。例如
SQL> UPDATE PERFORMANCE_SCHEMA.SETUP_INTRUMENTS SET FLAGS="controlled" WHERE NAME='memory/sql/NET::buff';
注意尝试在非内存工具或全局内存工具上设置
FLAGS = controlled
会静默失败。VOLATILITY
工具的波动性。波动性值范围从低到高。这些值对应于
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
表。DOCUMENTATION
描述工具用途的字符串。如果不可用,则该值为
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
。