-
Notifications
You must be signed in to change notification settings - Fork 111
Pre Filtering by instruments
- setup_instruments表列出了可用的instruments:
mysql> SELECT * FROM setup_instruments;
+------------------------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+------------------------------------------------------------+---------+-------+
...
| wait/synch/mutex/sql/LOCK_global_read_lock | YES | YES |
| wait/synch/mutex/sql/LOCK_global_system_variables | YES | YES |
| wait/synch/mutex/sql/LOCK_lock_db | YES | YES |
| wait/synch/mutex/sql/LOCK_manager | YES | YES |
...
| wait/synch/rwlock/sql/LOCK_grant | YES | YES |
| wait/synch/rwlock/sql/LOGGER::LOCK_logger | YES | YES |
| wait/synch/rwlock/sql/LOCK_sys_init_connect | YES | YES |
| wait/synch/rwlock/sql/LOCK_sys_init_slave | YES | YES |
...
| wait/io/file/sql/binlog | YES | YES |
| wait/io/file/sql/binlog_index | YES | YES |
| wait/io/file/sql/casetest | YES | YES |
| wait/io/file/sql/dbopt | YES | YES |
...
-
instruments具有树形结构的命名空间,从setup_instruments表中的NAME字段上可以看到,instruments名称的组成从左到右,最左边的是顶层instruments类型命名,最右边是一个具体的instruments名称,有一些顶层instruments没有其他层级的组件(如:transaction和idle,那么这个顶层类型既是类型又是具体的instruments),有一些顶层instruments具有下层instruments(如:wait/io/file/myisam/log),一个层级的instruments名称对应的组件数量取决于instruments的类型
-
一个给定instruments名称的含义,需要看instruments名称的左侧命名而定,例如下边两个myisam相关名称的instruments含义各不相同: 名称中给定组件的解释取决于其左侧的组件。例如,myisam显示在以下两个名称:
# 第一种instruments表示myisam引擎的文件IO相关的instruments
wait/io/file/myisam/log
# 第二种instruments表示myisam引擎的磁盘同步相关的instruments
wait/synch/cond/myisam/MI_SORT_INFO::cond
-
instruments的命名格式组成:performance_schema实现的一个前缀结构(如:wait/io/file/myisam/log中的wait+由开发人员实现的instruments代码定义的一个后缀名称组成(如:wait/io/file/myisam/log中的io/file/myisam/log)
- instruments名称前缀表示instruments的类型(如wait/io/file/myisam/log中的wait),该前缀名称还用于在setup_timers表中配置某个事件类型的定时器,也被称作顶层组件
- instruments名称后缀部分来自instruments本身的代码。后缀可能包括以下层级的组件:
- 主要组件的名称(如:myisam,innodb,mysys或sql,这些都是server的子系统模块组件)或插件名称
- 代码中变量的名称,格式为XXX(全局变量)或CCC::MMM(CCC表示一个类名,MMM表示在类CCC作用域中的一个成员对象),如:'wait/synch/cond/sql/COND_thread_cache' instruments中的COND_thread_cache,'wait/synch/mutex/mysys/THR_LOCK_myisam' instruments中的THR_LOCK_myisam,'wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_index' instruments中的MYSQL_BIN_LOG::LOCK_index
-
setup_instruments中的instruments name层级结构图如下:
-
在setup_instruments表中的instruments顶级instruments 组件分类如下:
- Idle Instrument 组件:用于检测空闲事件的instruments,该instruments没有其他层级的组件,空闲事件收集时机如下:
- 依据socket_instances表中的STATE字段而定,STATE字段有ACTIVE和IDLE两个值,如果STATE字段值为ACTIVE,则performance_schema使用与socket类型相对应的instruments跟踪活跃的socket连接的等待时间(监听活跃的socket的instruments有wait/io/socket/sql/server_tcpip_socket、wait/io/socket/sql/server_unix_socket、wait/io/socket/sql/client_connection),如果STATE字段值为IDLE,则performance_schema使用idle instruments跟踪空闲socket连接的等待时间
- 如果socket连接在等待来自客户端的请求,则此时套接字处于空闲状态,socket_instances表中处于空闲的套接字行的STATE字段会从ACTIVE变为IDLE。 EVENT_NAME列值保持不变,instruments的定时器被暂停。 并在events_waits_current表中生成一个EVENT_NAME值为idle的事件记录行
- 当套接字接收到客户端的下一个请求时,空闲事件被终止,套接字实例从空闲状态切换到活动状态,并恢复套接字instruments的定时器工作
- socket_instances表不允许使用TRUNCATE TABLE语句
- 表字段含义详见后续socket_instances表介绍章节
- transaction instrument 组件:用于检测transactions 事件的instruments,该instruments没有其他层级的组件
- Memory Instrument 组件:用于检测memorys 事件的instruments
- 默认情况下禁用了大多数memory instruments,但可以在server启动时在my.cnf中启用或禁用,或者在运行时更新setup_instruments表中相关instruments配置来动态启用或禁用。memory instruments的命名格式为:memory/code_area/instrument_name,其中code_area是一个server组件字符串值(如:sql、client、vio、mysys、partition和存储引擎名称:performance_schema、myisam、innodb、csv、myisammrg、memory、blackhole、archive等),而instrument_name是具体的instruments名称
- 以前缀'memory/performance_schema'命名的instruments显示为performance_schem内部缓冲区分配了多少内存。'memory/performance_schema' 开头的instruments'是内置的,无法在启动时或者运行时人为开关,内部始终启用。这些instruments采集的events事件记录仅存储在memory_summary_global_by_event_name表中。详细信息详见后续章节
- Stage Instrument 组件:用于检测stages事件的instruments
- stage instruments命名格式为:'stage/code_area/stage_name' 格式,其中code_area是一个server组件字符串值(与memory instruments类似),stage_name表示语句的执行阶段,如'Sorting result' 和 'Sending data'。这些执行阶段字符串值与SHOW PROCESSLIST的State列值、INFORMATION_SCHEMA.PROCESSLIST表的STATE列值类似。
- Statement Instrument 组件:用于检测statements事件的instruments,包含如下几个子类
- statement/abstract/*:statement操作的抽象 instruments。抽象 instruments用于语句没有确定语句类型的早期阶段,在语句类型确定之后使用对应语句类型的instruments代替,详细信息见后续章节
- statement/com/*:command操作相关的instruments。这些名称对应于COM_xxx操作命令(详见mysql_com.h头文件和sql/sql_parse.cc文件。例如:statement/com/Connect和statement/com/Init DB instruments分别对应于COM_CONNECT和COM_INIT_DB命令)
- statement/scheduler/event:用于跟踪一个事件调度器执行过程中的所有事件的instruments,该类型instruments只有一个
- statement/sp/*:用于检测存储程序执行过程中的内部命令的instruemnts,例如,statement/sp/cfetch和statement/sp/freturn instruments表示检测存储程序内部使用游标提取数据、函数返回数据等相关命令
- statement/sql/*:SQL语句操作相关的instruments。例如,statements/sql/create_db和statement/sql/select instruments,表示检测CREATE DATABASE和SELECT语句的instruments
- Wait Instrument 组件:用于检测waits事件的instruments,包含如下几个子类
- wait/io:用于检测I/O操作的instruments,包含如下几个子类
- 1)、wait/io/file:用于检测文件I/O操作的instruments,对于文件来说,表示等待文件相关的系统调用完成,如fwrite()系统调用。由于缓存的存在,在数据库中的相关操作时不一定需要在磁盘上做读写操作。
- 2)、wait/io/socket:用于检测socket操作的instruments,socket instruments的命名形式为:'wait/io/socket/sql/socket_type',server在支持的每一种网络通讯协议上监听socket。socket instruments监听TCP/IP、Unix套接字文件连接的socket_type有server_tcpip_socket、server_unix_socket值。当监听套接字检测到有客户端连接进来时,server将客户端连接转移到被单独线程管理的新套接字来处理。新连接线程对应的socket_type值为client_connection。使用语句select * from setup_instruments where name like 'wait/io/socket%';可以查询这三个socket_type对应的instruments
- wait/io/table/sql/handler:
- 1)、表I/O操作相关的instruments。这个类别包括了对持久基表或临时表的行级访问(对数据行获取,插入,更新和删除),对于视图来说,instruments检测时会参照被视图引用的基表访问情况
- 2)、与大多数等待事件不同,表I/O等待可以包括其他等待。例如,表I/O可能包括文件I/O或内存操作。因此,表I/O等待的事件在events_waits_current表中的记录通常有两行(除了wait/io/table/sql/handler的事件记录之外,可能还包含一行wait/io/file/myisam/dfile的事件记录)。这种可以叫做表IO操作的原子事件
- 3)、某些行操作可能会导致多个表I/O等待。例如,如果有INSERT的触发器,那么插入操作可能导致触发器更新操作。
- wait/lock:锁操作相关的instruments
- 1)、wait/lock/table:表锁操作相关的instruments
- 2)、wait/lock/metadata/sql/mdl:MDL锁操作相关的instruments
- wait/synch:磁盘同步object相关的instruments, performance_schema.events_waits_xxx表中的TIMER_WAIT时间列包括了在尝试获取某个object上的锁(如果这个对象上已经存在锁)的时候被阻塞的时长。
- 1)、wait/synch/cond:一个线程使用一个状态来向其他线程发信号通知他们正在等待的事情已经发生了。如果一个线程正在等待这个状态,那么它可以被这个状态唤醒并继续往下执行。如果是几个线程正在等待这个状态,则这些线程都会被唤醒,并竞争他们正在等待的资源,该instruments用于采集某线程等待这个资源时被阻塞的事件信息。
- 2)、wait/synch/mutex:一个线程在访问某个资源时,使用互斥对象防止其他线程同时访问这个资源。该instruments用于采集发生互斥时的事件信息
- 3)、wait/synch/rwlock:一个线程使用一个读写锁对象对某个特定变量进行锁定,以防止其他线程同时访问,对于使用共享读锁锁定的资源,多个线程可以同时访问,对于使用独占写锁锁定的资源,只有一个线程能同时访问,该instruments用于采集发生读写锁锁定时的事件信息
- 4)、wait/synch/sxlock:shared-exclusive(SX)锁是一种rwlock锁 object,它提供对公共资源的写访问的同时允许其他线程的不一致读取。sxlocks锁object可用于优化数据库读写场景下的并发性和可扩展性。
- Idle Instrument 组件:用于检测空闲事件的instruments,该instruments没有其他层级的组件,空闲事件收集时机如下:
-
要控制这些instruments的起停,将ENABLED列设置为YES或NO,要配置instruments是否收集计时器信息,将TIMED列值设置为YES或NO
-
setup_instruments表,对大多数instruments的修改会立即影响监控。但对于某些instruments,修改需要在mysql server重启才生效,运行时修改不生效。因为这些可能会影响mutexes、conditions和rwlocks,下面我们来看一些setup_instruments表修改示例:
-
禁用所有instruments,修改之后,生效的instruments修改会立即产生影响,即立即关闭收集功能:
mysql> UPDATE setup_instruments SET ENABLED = 'NO';
- 禁用所有文件类instruments,使用NAME字段结合like模糊匹配:
mysql> UPDATE setup_instruments SET ENABLED = 'NO' WHERE NAME LIKE 'wait/io/file/%';
- 仅禁用文件类instruments,启用所有其他instruments,使用NAME字段结合if函数,LIKE模糊匹配到就改为NO,没有匹配到的就改为YES:
mysql> UPDATE setup_instruments SET ENABLED = IF(NAME LIKE 'wait/io/file/%', 'NO', 'YES');
- 启用所有类型的events的mysys子系统的instruments:
mysql> UPDATE setup_instruments SET ENABLED = CASE WHEN NAME LIKE '%/mysys/%' THEN 'YES' ELSE 'NO' END;
- 禁用指定的某一个instruments:
mysql> UPDATE setup_instruments SET ENABLED = 'NO' WHERE NAME = 'wait/synch/mutex/mysys/TMPDIR_mutex';
- 切换instruments开关的状态,“翻转”ENABLED值,使用ENABLED字段值+ if函数, IF(ENABLED = 'YES', 'NO', 'YES')表示,如果ENABLED值为YES,则修改为NO,否则修改为YES:
mysql> UPDATE setup_instruments SET ENABLED = IF(ENABLED = 'YES', 'NO', 'YES') WHERE NAME = 'wait/synch/mutex/mysys/TMPDIR_mutex';
- 禁用所有instruments的计时器:
mysql> UPDATE setup_instruments SET TIMED = 'NO';
- 查找innodb存储引擎的文件相关的instruments,可以用如下语句查询
admin@localhost : performance_schema 09:16:59> select * from setup_instruments where name like 'wait/io/file/innodb/%';
+--------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+--------------------------------------+---------+-------+
| wait/io/file/innodb/innodb_data_file | YES | YES |
| wait/io/file/innodb/innodb_log_file | YES | YES |
| wait/io/file/innodb/innodb_temp_file | YES | YES |
+--------------------------------------+---------+-------+
3 rows in set (0.00 sec)
-
PS:
- 官方文档中没有找到每一个instruments具体的说明文档,官方文档中列出如下几个原因:
- instruments是服务端代码,所以代码可能经常变动
- instruments总数量有数百种,全部列出不现实
- instruments会因为你安装的版本不同而有所不同,每一个版本所支持的instruments可以通过查询setup_instruments表获取
- 一些可能常用的场景相关的设置
- metadata locks监控需要打开'wait/lock/metadata/sql/mdl' instruments才能监控,开启这个instruments之后在表performance_schema.metadata_locks表中可以查询到MDL锁信息
- profiing探针功能即将废弃,监控探针相关的事件信息需要打开语句:select * from setup_instruments where name like '%stage/sql%' and name not like '%stage/sql/Waiting%' and name not like '%stage/sql/%relay%' and name not like '%stage/sql/%binlog%' and name not like '%stage/sql/%load%' ;返回结果集中的instruments,开启这些instruments之后,可以在performance_schema.events_stages_xxx表中查看原探针相关的事件信息。
- 表锁监控需要打开'wait/io/table/sql/handler' instruments,开启这个instruments之后在表 performance_schema.table_handles中会记录了当前打开了哪些表(执行flush tables强制关闭打开的表时,该表中的信息会被清空),哪些表已经被加了表锁(某会话持有表锁时,相关记录行中的OWNER_THREAD_ID和OWNER_EVENT_ID列值会记录相关的thread id和event id),表锁被哪个会话持有(释放表锁时,相关记录行中的OWNER_THREAD_ID和OWNER_EVENT_ID列值会被清零)
- 查询语句top number监控,需要打开'statement/sql/select' instruments,然后打开events_statements_xxx表,通过查询performance_schema.events_statements_xxx表的SQL_TEXT字段可以看到原始的SQL语句,查询TIMER_WAIT字段可以知道总的响应时间,LOCK_TIME字段可以知道加锁时间(注意时间单位是皮秒,需要除以1000000000000才是单位秒)
- 官方文档中没有找到每一个instruments具体的说明文档,官方文档中列出如下几个原因:
-
有关setup_instruments字段详解,详见3.1.3小节
-
参考链接:https://dev.mysql.com/doc/refman/5.7/en/performance-schema-instrument-filtering.html
上一篇: Pre Filtering 事件配置 | 下一篇: Pre Filtering by objects
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!