setup_instruments
Instruments 是不同组件集的组合,例如wait、io、sql、binlog、file等。如果我们将这些组件组合起来,它们将成为帮助我们解决不同问题的有意义的工具。例如,wait/io/file/sql/binlog是提供有关二进制日志文件的等待和 I/O 详细信息的工具之一。Instruments从左侧读取,然后组件将添加分隔符“/”。我们添加到Instruments中的组件越多,它就会变得越复杂或越具体,即Instruments越长,它就越复杂。
以下是详细的 instru ments 分类及项目说明:
|
一级 |
二级 |
说明 |
三级 |
说明 |
|
wait : 统计各种等待事件 |
sync |
与同步相关的等待 |
mutex |
wait /sync/mutex: Mutex 是代码中使用的一种同步机制,用于强制规定在特定时间内只有一个线程可以访问某些公共资源。该资源被称为受到 mutex " 保护 " 。 当服务器中执行的两个线程(例如,同时执行查询的两个用户会话)需要访问同一资源(文件、缓冲区或某些数据)时,这两个线程会相互竞争,因此,第一个获得互斥锁的查询会导致另一个查询等待,直到第一个查询完成并解锁互斥锁。 |
|
rwlock |
普通读 / 写锁对象,用于锁定特定变量的访问,同时防止其他线程使用该变量。共享读锁可由多个线程同时获取。独占写锁每次只能由一个线程获取。 | |||
|
prlock |
一个优先级为 rwlock 的锁对象。 | |||
|
sxlock |
共享独占( SX)锁是一种 rwlock 锁对象,它提供对公共资源的写访问权限,同时允许其他线程进行不一致的读取。SX 锁可优化并发性,提高读写工作负载的可扩展性。 | |||
|
cond |
一个或者多个进程 / 线程在等待一个特定条件的发生才能继续运行。 条件是代码中的一种同步机制,用于发出特定事件已发生的信号,该信号指示等待该条件的线程可以继续工作。 目前有 以下几个 组:sql - 与复制和Advance处理任务相关的条件 mysys :与 MySQL 低级内部功能相关的条件 innodb - 与 innodb 引擎功能有关的条件,如提交、回滚等。 myisam: 与 my isam 引擎相关的条件 m ysqlx: 与 X Plugin 相关的条件 | |||
|
io |
与 IO相关的等待 |
file |
被采集 的文件 I/O 操作。对于文件,等待是指等待文件操作完成的时间(例如,调用 fwrite())。由于缓存的原因,磁盘上的物理文件 I/O 可能不会在这次调用中实际发生。如: wait/io/file/innodb/innodb_data_file | |
|
table |
被采集的表 I/O 操作。这些操作包括对持久基表或临时表的行级访问。影响行的操作包括获取、插入、更新和删除。对于视图,等待与视图引用的基础表相关联。如: wait/io/table/sql/handler | |||
|
socket |
被采集的 socket操作。 socket instrument 的名称格式为 wait/io/socket/sql/socket_type。服务器支持的每个网络协议都有一个监听 socket 。与 TCP/IP 或 Unix 套接字文件连接的监听socket相关的 instrument ,其 socket_type值分别为 server_tcpip_socket 或 server_unix_socket。 如 wait/io/socket/sql/server_tcpip_socket 和 wait/io/socket/sql/server_unix_socket 当监听 socket 检测到连接时,服务器会将连接转移到由单独线程管理的新 socket 上。新连接线程的 instrument 的 socket_type 值为 client_connection。如: wait/io/socket/sql/client_connection | |||
|
lock |
与锁相关的等待 |
table |
与TABLE 锁相关的instrument ,如: wait/lock/table/sql/handler | |
|
metadata |
与metadata_lock相关的instrument ,如 wait/lock/metadata/sql/mdl | |||
|
idle : 有关 socket连接的信息以及与线程相关的信息 |
只有一个, 空闲事件相关的instrument | |||
|
stage : 表示语句的每个执行阶段的统计 |
sql |
stage/code_area/stage_name, 其中 code_area 是一个值,如 sql 或 myisam,而 stage_name 表示语句处理的阶段,如排序结果或发送数据。阶段与 SHOW PROCESSLIST 显示的或信息模式 PROCESSLIST 表中可见的线程状态相对应。 sql表示 | ||
|
mysys |
MySQL 的低级实用程序 | |||
|
innodb |
innod b的各个阶段 | |||
|
group_rpl |
||||
|
statement : 统计语句维度的信息 |
sql |
SQL 语句操作。例如,statement/sql/create_db 和 statement/sql/select 用于 CREATE DATABASE 和 SELECT 语句。 | ||
|
abstract |
用于语句分类的早期阶段,当时还不知道确切的语句类型,当知道类型后,再改为更具体的语句工具。 | |||
|
sp |
存储程序执行的内部指令。例如,statement/sp/cfetch 和 statement/sp/freturn 用于光标获取和函数返回指令。 | |||
|
scheduler |
statement/scheduler/event:跟踪事件调度程序执行的所有事件的单一 instrument 。该 instrument 在计划事件开始执行时发挥作用。 | |||
|
com |
这些 instrument 的名称与 COM_xxx 操作相对应(参见 mysql_com.h 头文件和 sql/sql_parse.cc)。例如,statement/com/Connect 和 statement/com/Init DB 工具对应 COM_CONNECT 和 COM_INIT_DB 命令。 | |||
|
transaction : 事务相关信息
|
只有一个, 事务相关的instrument | |||
|
memory :统计在各个组件上的 内存使用情况的信息 , 名称格式为 memory/code_area/instrument_name ,其中 code_area 为诸如 sql 或 myisam 的值,instrument_name 为工具详细信息。
|
performance_schema |
performance_schema引擎占用的内存 | ||
|
sql |
SQL 语句操作占用的内存 | |||
|
client |
Clinet组件 占用的内存 | |||
|
vio |
vio占用的内存,VIO主要是用在了网络通信Socket中的数据结构的封装 | |||
|
mysys |
MySQL 的低级实用程序占用的内存 | |||
|
refcache |
reference cache 占用的内存 | |||
|
mysqld_openssl |
openssl 占用的内存 | |||
|
csv |
csv引擎占用的内存 | |||
|
innodb |
innodb 引擎占用的内存 | |||
|
myisam |
myisam 引擎占用的内存 | |||
|
memory |
memory 引擎占用的内存 | |||
|
myisammrg |
MRG _MyISAM 引擎占用的内存 | |||
|
temptable |
TempTable引擎占用的内存 | |||
|
archive |
innodb 引擎占用的内存 | |||
|
blackhole |
innodb 引擎占用的内存 | |||
|
mysqlx |
mysqlx 组件占用的内存 | |||
|
component_sys_vars |
system_variables 组件占用的内存 | |||
|
error : 与用户活动产生的 errors相关的信息 |
只有一个, 错误信息相关的instrument | |||
Setup_consumers
收集的 event 信息写入的表,修改该表实时生效,默认 history 表记录 10 个事件, history_long 表记录 10000 个事件。
setup_consumers 中的表之间的依赖关系如下:

其中, global_instrumentation 是最高的级别的消费者。如果 global_instrumentation 设置为 "NO",则会禁用全局instrument。所有其他表的set up 都是较低级别的,不会被检查;设置为什么也无关紧要。如果 global_instrumentation 设置为 "YES", per formanc e_schema 将维护全局状态信息,并检查 thread_instrumentation 消费者。
只有当 global_instrumentation 为 " YES "时,才会检查 thread_instrumentation。否则,如果 thread_instrumentation 为 NO,则会禁用特定于线程的instrument,并忽略所有低级设置。每个线程不会保存任何信息,也不会在 current-events 或 event-history 表中收集单个事件。如果 thread_instrumentation 为 "YES",per formanc e_schema会维护特定于线程的信息,并检查 events_xxx_current 消费者。
当 global_instrumentation和 thread_instrumentation 同时设置为 “YES”时,才会继续检查下一层的消费者。以此类推。
从以上图中可以看出 event _xxx_current 是 event _xxx_ history 和 event _xxx_ history _long 的上一级。其也决定着下一层。 “ xxx ”包括wait s,stages,statements 和 transactions。
其中, events_statements_cpu,如果为 "NO",则禁止测量 CPU_TIME。如果为 " YeS ",且instrumentation已启用并计时,则会测量 CPU_TIME。
statements_digest 语句摘要消费者要求 global_instrumentation 为 " YES ",否则不会进行检查。 statements_digest 消费者不依赖于 statements_ event消费者,因此无需在 events_statements_current 中收集统计数据,就能获得每个摘要的统计数据。反之,也可以在 events_statements_current 中获取详细语句,而无需摘要(此时 DIGEST 和 DIGEST_TEXT 列为空) 。
