Documentation Home

27.12.2.3 setup_instruments 表

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_instances 表中可见,例如file_instancesrwlock_instances

对大多数 setup_instruments行的修改会立即影响监控。对于某些仪器,修改仅在服务器启动时有效;在运行时更改它们没有效果。这主要影响服务器中的互斥体、条件和 rwlocks,尽管可能有其他工具也是如此。

有关 setup_instruments表在事件过滤中的作用的更多信息,请参阅 第 27.4.3 节,“事件预过滤”

setup_instruments表有以下列:

  • NAME

    仪器名称。仪器名称可能有多个部分并形成一个层次结构,如 第 27.6 节“性能模式仪器命名约定”中所述。执行工具产生的事件具有 EVENT_NAME从工具值中获取的NAME值。(事件并没有真正的名称,但这提供了一种将事件与乐器相关联的方法。)

  • ENABLED

    仪器是否启用。值为 YESNO。禁用的仪器不会产生任何事件。此列可以修改,但设置ENABLED对已创建的工具没有影响。

  • TIMED

    仪器是否定时。值为 YESNONULL。此列可以修改,但设置TIMED对已创建的工具没有影响。

    TIMED表示 NULL仪器不支持计时。比如内存操作是不定时的,所以他们的TIMED列是 NULL

    对于支持计时的仪器设置TIMEDNULL无效,对于不支持计时的仪器设置 TIMED为非NULL 也是如此。

    如果已启用的仪器未计时,则仪器代码已启用,但定时器未启用。仪器产生的事件具有NULLTIMER_STARTTIMER_END定时器 TIMER_WAIT值。这反过来会导致在汇总表中计算总和、最小值、最大值和平均时间值时忽略这些值。

  • PROPERTIES

    仪器属性。此列使用 SET数据类型,因此可以为每个仪器设置以下列表中的多个标志:

    • controlled_by_default:本仪器默认收集内存。

    • global_statistics: 该仪器仅生成全局摘要。更精细级别的摘要不可用,例如每个线程、帐户、用户或主机。例如,大多数记忆仪器只产生全局摘要。

    • mutable:仪器可以 变异成更具体的仪器。此属性仅适用于报表工具。

    • progress:仪器能够报告进度数据。此属性仅适用于舞台乐器。

    • singleton:仪器有一个实例。比如服务器端的全局互斥锁大部分都是单例的,对应的instruments也是。

    • 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

    工具的波动性。波动值范围从低到高。这些值对应 于头文件 中定义的常量 :PSI_VOLATILITY_xxxmysql/psi/psi_base.h

    #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列纯粹是信息性的,为用户(和性能模式代码)提供一些关于仪器运行时行为的提示。

    具有低波动率指数(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';

    这个互斥锁是永久的,并且在执行更新之前就已经创建了。永远不会再次创建互斥量,因此永远不会使用ENABLED中的值 。setup_instruments要启用或禁用此互斥锁,请改用该 mutex_instances表。

  • DOCUMENTATION

    描述仪器用途的字符串。该值是 NULL如果没有可用的描述。

setup_instruments表具有以下索引:

  • NAME( ) 上的主键

TRUNCATE TABLE不允许用于setup_instruments表。

从 MySQL 8.0.27 开始,为了协助监控和故障排除,性能模式检测用于将检测线程的名称导出到操作系统。这使显示线程名称的实用程序(例如调试器和 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.