罗晓波沃曲科技高级数据库技术专家
沃曲科技出品
IT工作多年,先后担任运维工程师、高级运维工程师、运维经理、数据库工程师。曾参与版本发布系统、轻量级监控系统、运维管理平台、数据库管理平台的设计和编写。熟悉MySQL架构和Innodb存储引擎,喜欢专攻开源技术,追求完美。
|简介
如何配置和使用performance_schema在前一篇文章“第一次见面| performance _ schema全方位介绍”中已经大致介绍过了。相信大家已经初步了解了performance_schema能为我们提供什么样的性能数据。今天带领大家踏上系列第二章的征程(全系7章)。本期我们将全面讲解performance _ schema的配置模式以及各个配置表的功能。接下来,请跟随我们开始performance_schema系统的学习之旅。
基本概念
Instruments: producer,用于收集MySQL中各种操作产生的事件信息。相应配置表中的配置项可以称为监控和采集配置项,下面提到的生产者统称为仪器
消费者:消费者。相应的消费者表用于存储从仪器收集的数据。相应配置表中的配置项可以称为消耗存储配置项。下面提到的消费者统称为消费者
友情提示:以下内容可能很烧脑,阅读时间长。建议你坐好板凳,坐下来,点根烟,认真读一读。这也是你在学习performance_schema的路上要经过的一座燃烧的山。坚持下去,“翻过这座山,就能看到大海!”
|编译时配置
以前我们觉得自己编译安装MySQL的性能比政府编译的二进制包和rpm包要好。早期版本的MySQL可能就是这种情况,但是随着MySQL版本的迭代,业内很多人已经亲自测试确认,目前的MySQL版本不具备比官方编译的二进制包更高的自编译安装性能。所以一般情况下,我们不建议花几十分钟编译安装MySQL,因为在大规模部署场景下,这是浪费时间(需要通过编译安装来精简模块的场景除外)
您可以使用cmake的编译选项来决定MySQL实例是否支持performance_schema的某个等待事件类别,如下所示:
shell>。cmake。
-DDISABLE_PSI_STAGE=1 #关闭STAGE事件监视器
-DDISABLE_PSI_STATEMENT=1 #关闭语句事件监视器
注意:虽然我们可以通过cmake的编译选项关闭performance_schema的一些功能模块,但是我们通常不建议这样做,除非你非常清楚这些功能模块以后不能使用,如果你想使用以后编译时关闭的模块,需要重新编译。
当我们接管别人安装的MySQL数据库服务器时,或者当你不确定你安装的MySQL版本是否支持performance_schema时,我们可以检查MySQL命令是否支持Performance Schema。
#如果找到performance_schema开头的几个选项,说明目前MyQLD支持performance_schema。如果没有找到与performance_schema相关的选项,则表示当前数据库版本不支持performance_schema。您可能需要升级mysql版本:
shell>。mysqld - verbose -帮助
...
-性能_架构
启用性能模式。
-performance _ schema _ events _ waits _ history _ long _ size = #
inevents_waits_history_long的行数。
您还可以登录MySQL实例,并使用SQL命令查看是否支持performance_schema:
# Support列中的值“是”表示数据库支持,否则您可能需要升级mysql版本:
mysql>。显示引擎
...
admin@localhost:(无)12:54:00 & gt;展示引擎;
*************************** 6.行* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
引擎:性能_模式
支持:是
注释:性能模式
交易:否
夏:不
保存点:否
9行一组(0.00秒)
注意:在MyQLD选项或show engines语句的输出结果中,如果看到与performance_schema相关的信息,并不意味着performance_schema已经启用,而仅仅意味着数据库支持。如果需要启用,需要在服务器启动时使用系统参数Performance _ Schema = ON(默认关闭5.7之前的MySQL版本)。
|启动时的配置
performance_schema中的配置存储在内存和易失性存储器中,这意味着当MySQL实例停止时,存储在performance_schema配置表(将在本章后面讨论)中的所有配置项都将丢失。因此,如果要持久化配置项,需要使用MySQL配置文件中的启动选项来持久化配置项,这样MySQL每次重启都会自动加载配置项,而不是每次重启都重新配置。
(1)启动选项
performance_schema有哪些启动选项?我们可以通过以下命令行命令查看它:
[root @ localhost ~]# MySQL-verbose-help | grep performance-schema | grep-v '-' | sed ' 1d ' | sed '/[0-9]+/d '
......
性能-模式-消费者-事件-阶段-当前错误
性能-模式-消费者-事件-阶段-历史假
性能-模式-消费者-事件-阶段-历史-长假
性能-模式-消费者-事件-陈述-当前为真
性能-模式-消费者-事件-陈述-历史真实
性能-模式-消费者-事件-语句-历史-长假
性能-模式-消费者-事件-事务-当前错误
性能-模式-消费者-事件-交易-历史假
性能-模式-消费者-事件-交易-历史-长假
性能-模式-消费者-事件-等待-当前为假
性能-模式-消费者-事件-等待-历史假
性能-模式-消费者-事件-等待-历史-长假
性能-模式-消费者-全局-检测真
性能-模式-消费者-声明-摘要真
性能模式消费者线程检测真
性能模式工具
......
以下将对这些启动选项进行简要描述(这些启动选项用于指定MySQL启动时是否打开消费者和仪器的配置项。它们被称为启动选项,因为它们需要在MyQLD启动时由命令行或my.cnf指定,但在启动后不能由show variables命令查看,因为它们不属于系统变量)
performance_schema_consumer_events_statements_current=TRUE是在mysql服务器启动时启动events_statements_current表的记录功能(此表记录当前语句事件信息),还是在启动后使用setup_consumers表中的UPDATE语句动态更新setup_consumers配置表中的events_statements_current配置项,默认值为真
performance_schema_consumer_events_statements_history=TRUE它类似于performance _ schema _ consumer _ events _ statements _ current选项,但用于配置是否记录语句事件的短历史信息,默认值为TRUE
performance_schema_consumer_events_stages_history_long=FALSE它类似于performance _ schema _ consumer _ events _ statements _ current选项,但用于配置是否记录语句事件的长历史信息,默认值为FALSE
除了statement(语句)事件之外,还支持:wait(等待)事件、state(阶段)事件、transaction(事务)事件,他们与statement事件一样都有三个启动项分别进行配置,但这些等待事件默认未启用,如果需要在MySQL Server启动时一同启动,则通常需要写进my.cnf配置文件中performance_schema_consumer_global_instrumentation=TRUE打开全局表(如mutex _ instances、rwlock _ instances、cond _ instances、file _ instances、用户、主机计数、socket_summary_by_event_name、File_summary_by_instance等全局对象计数统计和事件汇总统计表)。启动后,还可以使用setup_consumers表中的UPDATE语句来动态更新全局配置项
默认值为真
performance_schema_consumer_statements_digest=TRUEMySQL Server启动时是开启events _ statements _ summary _ by _ digest表的记录功能,还是使用setup_consumers表中的UPDATE语句在启动后动态更新摘要配置项
默认值为真
performance_schema_consumer_thread_instrumentation=TRUEMySQL服务器启动时打开了吗
事件_ XXX _ summary _ by _ yyy _ by _ event _ name表的记录功能也可以用来在启动后动态更新setup_consumers表中的线程配置项
默认值为真
performance_schema_instrument[=name]MySQL Server启动时是否启用部分采集器,由于仪器配置项数千,此配置项支持键值模式,也支持% number进行一般分配等。,如下所示:
#[=名称]可以指定为特定的乐器名称(但是,如果要指定多个乐器,您需要多次使用此选项),或者您可以使用通配符,您可以为乐器指定相同的前缀+通配符,或者您可以使用%来表示所有乐器。
# #指定打开单个仪器
-性能-模式-仪器= '仪器_名称=值'
# #使用通配符指定要打开的多个乐器
-性能-模式-仪器= '等待/同步/秒/% =计数'
# #切换所有仪器
-性能-模式-仪器= ' % =开启'
-性能-模式-仪器= ' % =关闭'
请注意,这些启动选项生效的先决条件是将performance_schema设置为“开”。另外,虽然这些启动选项不能用show variables语句来查看,但是我们可以通过setup_instruments和setup_consumers表来查询这些选项指定的值。
(2)系统变量
可以使用以下语句查看与performance_schema相关的系统变量。这些变量用于限制消费者表的存储限制。都是只读变量,需要在MySQL启动前设置这些变量的值。
root@ localhost: (none) 11: 43: 29 >显示变量,如“% performance _ schema %”;
.....
42 rowsinset(0 .01sec)
下面我们简单说明一下这些系统变量中的一部分(以下简称变量)(大部分是-1值,也就是说会自动调整,不用太在意。此外,在大多数情况下,大于-1的变量就足够了。如果没有特殊要求,不建议调整,调整这些参数会增加内存使用量)
performance_schema=ON 控制performance_schema功能的开关,要使用MySQL的performance_schema,需要在mysqld启动时启用,以启用事件收集功能 该参数在5.7.x之前支持performance_schema的版本中默认关闭,5.7.x版本开始默认开启 注意:如果mysqld在初始化performance_schema时发现无法分配任何相关的内部缓冲区,则performance_schema将自动禁用,并将performance_schema设置为OFFperformance_schema_digests_size=10000 控制events_statements_summary_by_digest表中的最大行数。如果产生的语句摘要信息超过此最大值,便无法继续存入该表,此时performance_schema会增加状态变量performance_schema_events_statements_history_long_size=10000 控制events_statements_history_long表中的最大行数,该参数控制所有会话在events_statements_history_long表中能够存放的总事件记录数,超过这个限制之后,最早的记录将被覆盖 全局变量,只读变量,整型值,5.6.3版本引入 * 5.6.x版本中,5.6.5及其之前的版本默认为10000,5.6.6及其之后的版本默认值为-1,通常情况下,自动计算的值都是10000 * 5.7.x版本中,默认值为-1,通常情况下,自动计算的值都是10000performance_schema_events_statements_history_size=10 控制events_statements_history表中单个线程(会话)的最大行数,该参数控制单个会话在events_statements_history表中能够存放的事件记录数,超过这个限制之后,单个会话最早的记录将被覆盖 全局变量,只读变量,整型值,5.6.3版本引入 * 5.6.x版本中,5.6.5及其之前的版本默认为10,5.6.6及其之后的版本默认值为-1,通常情况下,自动计算的值都是10 * 5.7.x版本中,默认值为-1,通常情况下,自动计算的值都是10除了statement(语句)事件之外,wait(等待)事件、state(阶段)事件、transaction(事务)事件,他们与statement事件一样都有三个参数分别进行存储限制配置,有兴趣的同学自行研究,这里不再赘述performance_schema_max_digest_length=1024 用于控制标准化形式的SQL语句文本在存入performance_schema时的限制长度,该变量与max_digest_length变量相关(max_digest_length变量含义请自行查阅相关资料) 全局变量,只读变量,默认值1024字节,整型值,取值范围0~1048576,5.6.26和5.7.8版本中引入performance_schema_max_sql_text_length=1024 控制存入events_statements_current,events_statements_history和events_statements_history_long语句事件表中的SQL_TEXT列的最大SQL长度字节数。 超出系统变量performance_schema_max_sql_text_length的部分将被丢弃,不会记录,一般情况下不需要调整该参数,除非被截断的部分与其他SQL比起来有很大差异 全局变量,只读变量,整型值,默认值为1024字节,取值范围为0~1048576,5.7.6版本引入 降低系统变量performance_schema_max_sql_text_length值可以减少内存使用,但如果汇总的SQL中,被截断部分有较大差异,会导致没有办法再对这些有较大差异的SQL进行区分。 增加该系统变量值会增加内存使用,但对于汇总SQL来讲可以更精准地区分不同的部分。|运行时配置
MySQL启动后,我们不能使用启动选项来切换相应的消费者和仪器。这时候如何根据自己的需要灵活切换performance_schema中收集的信息?(比如很多配置项在默认配置中没有打开,我们可能需要马上修改配置。比如在高并发场景下,大量线程连接到MySQL,执行各种SQL时会产生大量的事件信息,我们只想看到某个会话产生的事件信息,可能需要马上修改配置。)我们可以通过修改performance_schema下的几个配置表中的配置项来实现这一点
这些配置表中的配置项之间存在相关性,可以按照配置影响的顺序排序如下图(此表仅代表个人理解):
(1)性能_计时器表
performance_timers表记录了服务器中哪些事件计时器可用(注意:该表中的配置项不支持添加、删除和修改,并且是只读的。当前版本支持哪些定时器),并且setup_timers配置表中的配置项引用该表中的定时器
与每个定时器的精度和数量相关的特征值是不同的。您可以通过以下查询语句查看performance_timers表中记录的计时器和相关特性信息:
mysql>。选择*从性能_计时器;
+ - + - + - + - +
|定时器_名称|定时器_频率|定时器_分辨率|定时器_开销
+ - + - + - + - +
|CYCLE | 2389029850 |1| 72
| NANCE | 1000000000 | 1 | 112
|微秒| 1000000 |1| 136
|毫秒|1036| 1 |168|
|TICK | 105 |1| 2416
+ - + - + - + - +
performance_timers表中的字段具有以下含义:
TIMER_NAME:表示可用计时器名称,CYCLE是指基于CPU(处理器)周期计数器的定时器。在setup_timers表中可以使用performance_timers表中列值不为null的计时器(如果performance_timers表中有某字段值为NULL,则表示该定时器可能不支持当前server所在平台)TIMER_FREQUENCY:表示每秒钟对应的计时器单位的数量(即,相对于每秒时间换算为对应的计时器单位之后的数值,例如:每秒=1000毫秒=1000000微秒=1000000000纳秒)。对于CYCLE计时器的换算值,通常与CPU的频率相关。对于performance_timers表中查看到的CYCLE计时器的TIMER_FREQUENCY列值 ,是根据2.4GHz处理器的系统上获得的预设值(在2.4GHz处理器的系统上,CYCLE可能接近2400000000)。NANOSECOND 、MICROSECOND 、MILLISECOND 计时器是基于固定的1秒换算而来。对于TICK计时器,TIMER_FREQUENCY列值可能会因平台而异(例如,某些平台使用100个tick/秒,某些平台使用1000个tick/秒)TIMER_RESOLUTION:计时器精度值,表示在每个计时器被调用时额外增加的值(即使用该计时器时,计时器被调用一次,需要额外增加的值)。如果计时器的分辨率为10,则其计时器的时间值在计时器每次被调用时,相当于TIMER_FREQUENCY值+10TIMER_OVERHEAD:表示在使用定时器获取事件时开销的最小周期值(performance_schema在初始化期间调用计时器20次,选择一个最小值作为此字段值),每个事件的时间开销值是计时器显示值的两倍,因为在事件的开始和结束时都调用计时器。注意:计时器代码仅用于支持计时事件,对于非计时类事件(如调用次数的统计事件),这种计时器统计开销方法不适用PS:对于performance_timers表,不允许使用TRUNCATE TABLE语句(2)setup_timers表
当前使用的事件计时器信息记录在setup_timers表中(注意:该表不支持添加或删除记录,只支持修改和查询)
您可以更改列设置定时器的值。通过UPDATE语句为不同的事件类别选择不同的计时器。列setup_timers的有效值。定时器名称来自性能定时器一栏。定时器_名称值。
对setup_timers表的修改会立即影响监控。正在执行的事件可以使用修改前的计时器作为开始时间,但是可以使用修改后的新计时器作为结束时间。为了避免计时器更改后时间信息收集的不可预测的结果,请在performance_schema中使用修改后的TRUNCATE TABLE语句重置相关表中的统计信息。
mysql>。选择*从设置_定时器;
+ - + - +
|名称|计时器_名称
+ - + - +
|空闲|微秒|
|等待|循环
| stage | NANCE |
|语句|纳秒|
|事务| NANCE |
+ - + - +
setup_timers表的字段具有以下含义:
NAME:计时器类型,对应着某个事件类别(事件类别详见 3.3.4 节)TIMER_NAME:计时器类型名称。此列可以修改,有效值参见performance_timers.TIMER_NAME列值PS:对于setup_timers表,不允许使用TRUNCATE TABLE语句(3) setup_consumers表Setup_consumers表列出了使用者的可配置列表项(注意:该表不支持添加或删除记录,只支持修改和查询),如下所示:
mysql>。从设置消费者中选择*;
+ - + - +
|名称|已启用
+ - + - +
|事件_阶段_当前|否|
|事件_阶段_历史|否
|事件_阶段_历史_长|否|
| events_statements_current |YES
|事件_语句_历史|是|
| events _ statements _ history _ long | NO
|事件_交易_当前|否|
|事件_交易_历史|否|
|事件_交易_历史_长|否|
|事件_等待_当前|否
|事件_等待_历史|否
|事件_等待_历史_长|否|
|全局_检测|是|
|线程_检测|是|
|语句_摘要|是
+ - + - +
对setup_consumers表的修改将立即影响监控,setup_consumers字段的含义如下:
NAME:consumers配置名称ENABLED:consumers是否启用,有效值为YES或NO,此列可以使用UPDATE语句修改。如果需要禁用consumers就设置为NO,设置为NO时,server不会维护这些consumers表的内容新增和删除,且也会关闭consumers对应的instruments(如果没有instruments发现采集数据没有任何consumers消费的话)PS:对于setup_consumers表,不允许使用TRUNCATE TABLE语句setup_consumers表中的使用者配置项具有从高层到低层的层次关系。按照优先级顺序,可以列为如下层次结构(可以根据这种层次结构关闭可能不需要的下级消费者,有助于节省性能开销,便于以后查看收集到的事件信息时进行过滤):
从上图中的信息可以看出,在setup_consumers表的消费者配置层次结构中:
global_instrumentation处于顶级位置,优先级最高。 * 当global_instrumentation为YES时,会检查setup_consumers表中的statements_digest和thread_instrumentation的配置,会附带检查setup_instruments、setup_objects、setup_timers配置表 * 当global_instrumentation为YES时(无论setup_consumers表中的statements_digest和thread_instrumentation如何配置,只依赖于global_instrumentation的配置),会维护全局events输出表:mutex_instances、rwlock_instances、cond_instances、file_instances、users、hostsaccounts、socket_summary_by_event_name、file_summary_by_instance、file_summary_by_event_name、objects_summary_global_by_type、memory_summary_global_by_event_name、table_lock_waits_summary_by_table、table_io_waits_summary_by_index_usage、table_io_waits_summary_by_table、events_waits_summary_by_instance、events_waits_summary_global_by_event_name、events_stages_summary_global_by_event_name、events_statements_summary_global_by_event_name、events_transactions_summary_global_by_event_name * 当global_instrumentation为NO时,不会检查任何更低级别的consumers配置,不会维护任何events输出表(memory_%开头的events输出表除外,这些表维护只受setup_instruments配置表控制)statements_digest和thread_instrumentation处于同一级别,优先级次于global_instrumentation,且依赖于global_instrumentation为YES时配置才会被检测 * 当statements_digest为YES时,statements_digest consumers没有更低级别的配置,依赖于global_instrumentation为YES时配置才会被检测,会维护events输出表:events_statements_summary_by_digest * 当statements_digest为NO时,不维护events输出表:events_statements_summary_by_digest * 当thread_instrumentation为YES时,会检查setup_consumers表中的events_xxx_current配置(xxx表示:waits、stages、statements、transactions),会附带检查setup_actors、threads配置表。会维护events输出表 events_xxx_summary_by_yyy_by_event_name,其中: xxx含义同上; yyy表示:thread、user、host、account * 当thread_instrumentation为NO时,不检查setup_consumers表中的events_xxx_current配置,不维护events_xxx_current及其更低级别的events输出表events_xxx_current系列(xxx含义同上)consumers处于同一级别。且依赖于thread_instrumentation为YES时配置才会被检测 * 当events_xxx_current为YES时,会检测setup_consumers配置表中的events_xxx_history和events_xxx_history_long系列 consumers配置,会维护events_xxx_current系列表 * 当events_xxx_current为NO时,不检测setup_consumers配置表中的events_xxx_history和events_xxx_history_long系列 consumers配置,不维护events_xxx_current系列表events_xxx_history和events_xxx_history_long系列(同events_xxx_current中的xxx)consumers处于同一级别,优先级次于events_xxx_current 系列consumers(xxx含义同上),依赖于events_xxx_current 系列consumers为YES时才会被检测 * 当events_xxx_history为YES时,没有更低级别的conosumers配置需要检测,但会附带检测setup_actors、threads配置表中的HISTORY列值,会维护events_xxx_history系列表,反之不维护 * 当events_xxx_history_long为YES时,没有更低级别的conosumers配置需要检测,但会附带检测setup_actors、threads配置表中的HISTORY列值,会维护events_xxx_history_long系列表,反之不维护注意:
events 输出表 events_xxx_summary_by_yyy_by_event_name的开关由global_instrumentation控制,且表中是有固定数据行,不可清理,truncate或者关闭相关的consumers时只是不统计相关的instruments收集的events数据,相关字段为0值如果performance_schema在对setup_consumers表做检查时发现某个consumers配置行的ENABLED 列值不为YES,则与这个consumers相关联的events输出表中就不会接收存储任何事件记录高级别的consumers设置不为YES时,依赖于这个consumers配置为YES时才会启用的那些更低级别的consumers将一同被禁用ci修改示例:
#打开events _ waits _ current表,记录当前的等待事件
mysql>。UPDATE setup _ consumers SET ENABLED = ' NO ' where NAME = ' events _ waits _ current ';
#关闭历史事件记录功能
mysql>。UPDATE setup _ consumers SET ENabled = ' NO '其中名称如' % history % ';
#其中条件ENABLED ='YES '是打开相应记录表的功能
......
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配置行修改会立即影响监控,但对于某些仪器,运行时修改不会生效(配置表可以修改,但不会生效),只会在启动前生效(使用系统变量写入配置文件)。无效的工具主要包括互斥体、条件和读写锁
setup_instruments表的字段说明如下:
NAME:instruments名称,instruments名称可能具有多个部分并形成层次结构(详见下文)。当instruments被执行时,产生的事件名称就取自instruments的名称,事件没有真正的名称,直接使用instruments来作为事件的名称,可以将instruments与产生的事件进行关联ENABLED:instrumetns是否启用,有效值为YES或NO,此列可以使用UPDATE语句修改。如果设置为NO,则这个instruments不会被执行,不会产生任何的事件信息TIMED:instruments是否收集时间信息,有效值为YES或NO,此列可以使用UPDATE语句修改,如果设置为NO,则这个instruments不会收集时间信息对于内存仪器,setup_instruments中的timed列将被忽略(如果使用update语句将timed列设置为YES,则可以成功执行,但执行update后会发现这些仪器的TIMED列仍然为NO),因为内存操作没有计时器信息。
如果仪器的启用设置为是(表示仪器已启用),但计时栏未设置为是(表示计时器功能已禁用),仪器将生成事件信息,但事件信息对应的计时器_开始、计时器_结束和计时器_等待的计时器值均为空。在后续汇总表中计算总和、最小值、最大值和平均时间值时,将忽略这些空值
PS: setup _ instruments表中不允许截断表语句
setup_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语句的instrumentsWait 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对应的instrumentswait/io/table/sql/handler:
1).与输入输出操作相关的表格工具。此类别包括对持久基表或临时表的行级访问(数据行获取、插入、更新和删除)。对于视图,仪器在检测时会参考视图引用的基表的访问情况
2).与大多数等待事件不同,表输入/输出等待可以包括其他等待。例如,表输入/输出可能包括文件输入/输出或内存操作。因此,表I/O等待事件通常在events_waits_current表中有两行记录(除了wait/io/table/sql/handler的事件记录外,还可能包含wait/io/file/myisam/dfile的一行事件记录)。这种原子事件可以称为表IO操作
3).某些行操作可能会导致多个表输入/输出等待。例如,如果存在用于插入的触发器,插入操作可能会导致触发器更新操作。
等待/锁定:与锁定操作相关的仪器
1).等待/锁定/工作台:与工作台锁定操作相关的仪器
2).等待/锁定/元数据/SQL/MDL:与MDL锁定操作相关的工具
等待/同步:与磁盘同步对象相关的仪器。performance _ schema中的TIMER_WAIT time列。events _ waits _ xxx表包括尝试获取对象锁时的阻塞时间(如果该对象上已经存在锁)。
1).wait/synch/cond:一个线程使用一个状态来通知其他线程他们正在等待的事情已经发生。如果一个线程正在等待这个状态,它可以被这个状态唤醒并继续执行。如果有几个线程在等待这种状态,这些线程就会醒来,争夺它们所等待的资源。该工具用于收集线程在等待该资源时被阻塞的事件信息。
2).等待/同步/互斥:当一个线程访问一个资源时,它使用互斥对象来防止其他线程同时访问该资源。该仪器用于在互斥发生时收集事件信息
3).wait/synch/rwlock:线程使用读写锁对象来锁定特定变量,以防止其他线程同时访问。对于被共享读锁锁定的资源,多个线程可以同时访问,对于被独占写锁锁定的资源,只有一个线程可以同时访问。该仪器用于在发生读写锁定时收集事件信息。
4).wait/synch/sxlock:Shared-exclusive(sx)锁是一个rwlock锁对象,它提供对公共资源的写访问,同时允许其他线程进行不一致的读取。Sxlocks对象可以用来优化数据库读写场景的并发性和可伸缩性。
要控制这些仪器的启动和停止,请将启用列设置为是或否。要配置仪器是否收集计时器信息,请将计时列值设置为是或否
Setup_instruments表,对大多数仪器的修改会立即影响监控。但是对于某些仪器,修改要等到mysql服务器重启后才生效,运行时修改才生效。因为这些可能会影响互斥体、条件和读写锁,让我们看看setup_instruments表的一些修改示例:
#禁用所有仪器。修改后,有效的仪器修改会产生即时影响,即立即关闭采集功能:
mysql>。更新设置_仪器设置启用= '否';
#禁用所有文件类别仪器,并使用名称字段结合相似模糊匹配:
mysql>。UPDATE setup _ instruments SET ENABLED = ' NO ' where NAME LIKE ' wait/io/file/% ';
#仅禁用同类仪器,启用所有其他仪器,使用“名称”字段结合“如果”功能,如果模糊匹配,将其更改为“否”,如果不匹配,将其更改为“是”:
mysql>。UPDATE setup _ instruments SET ENABLED = IF(NAME LIKE ' wait/io/file/% ',' NO ',' YES ');
#启用所有类型事件的mysys子系统仪器:
mysql>。UPDATE setup _ instruments SET ENABLED = CASE WHEN NAME LIKE“%/mysys/%”THEN ' YES ' else ' NO ' end;
#禁用指定的仪器之一:
mysql>。UPDATE setup _ instruments SET ENABLED = ' NO ' where NAME = ' wait/synch/mutex/mysys/TMPDIR _ mutex ';
#切换仪器开关的状态,“翻转”启用值,使用启用字段值+如果功能,如果(启用= '是','否','是')表示如果启用值为是,则更改为否,否则更改为是:
mysql>。更新设置_仪器设置启用=如果(启用= '是','否','是'),其中名称= '等待/同步/互斥/我的系统/TMPDIR _互斥';
#禁用所有仪器的计时器:
mysql>。更新设置_仪器设置时间=“否”;
要查找与innodb存储引擎文件相关的仪器,您可以使用以下语句进行查询:
admin @ localhost:performance _ schema 09:16:59 & gt;从setup_instruments中选择*名称,如“wait/io/file/innodb/% ”;
+ - + - + - +
|名称|启用|定时
+ - + - + - +
| 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右侧插图(0。00秒)
PS:
官方文档中没有找到每一个instruments具体的说明文档,官方文档中列出如下几个原因: * instruments是服务端代码,所以代码可能经常变动 * instruments总数量有数百种,全部列出不现实 * instruments会因为你安装的版本不同而有所不同,每一个版本所支持的instruments可以通过查询setup_instruments表获取一些可能常用的场景相关设置:
*元数据锁监控需要打开‘等待/锁/元数据/SQL/MDL’仪器进行监控。打开这个工具后,可以在performance _ schema表中找到MDL锁信息。元数据_锁
* profiing probe函数将很快被放弃。与监视探测器相关的事件信息需要打开以下语句:从setup _ instruments中选择*,其中名称类似“% stage/SQL%”、名称不像“% stage/SQL/waiting%”、名称不像“% stage/SQL/ %relay%”、名称不像“%stage/sql/%binlog%”、名称不像“% stage/SQL/% load %”;回到结果集中的仪器。打开这些仪器后,您可以在performance _ schema . events _ stages _ XXX表中查看与原始探测器相关的事件信息。
*表锁监控需要打开' wait/io/table/SQL/handler '仪器,当前打开的表将记录在table performance _ schema中。打开此仪器后的表处理程序(当刷新表强制关闭打开的表时,此表中的信息将被清除空),哪些表已被锁定(当会话持有表锁时,相关记录行中的所有者_线程_标识和所有者_事件_标识列值将记录相关线程标识和事件标识),哪个会话持有表锁(当释放表锁时,相关记录行中的所有者_线程_标识和所有者)。
*查询语句顶号监控,需要打开'语句/SQL/select '仪器,然后打开events_statements_xxx表,通过查询performance _ schema的SQL_TEXT字段可以看到原来的SQL语句。events _ statements _ XXX表,查询TIMER_WAIT字段可以知道总响应时间,查询LOCK_TIME字段可以知道锁定时间(注意时间单位是皮秒,需要除以10000000000000)
有关setup_instruments字段详解(5)setup_actors表Setup_actors用于配置是否为新的前台服务器线程(与客户端连接相关联的线程)启用监视和历史事件日志记录。默认情况下,该表的最大行数为100。您可以使用系统变量performance _ schema _ setup _ actors _ size在服务器启动前更改此表的最大配置行数
对于每个新的前台server线程,perfromance_schema会匹配该表中的User,Host列进行匹配,如果匹配到某个配置行,则继续匹配该行的ENABLED和HISTORY列值,ENABLED和HISTORY列值也会用于生成threads配置表中的行INSTRUMENTED和HISTORY列。如果用户线程在创建时在该表中没有匹配到User,Host列,则该线程的INSTRUMENTED和HISTORY列将设置为NO,表示不对这个线程进行监控,不记录该线程的历史事件信息。对于后台线程(如IO线程,日志线程,主线程,purged线程等),没有关联的用户, INSTRUMENTED和HISTORY列值默认为YES,并且后台线程在创建时,不会查看setup_actors表的配置,因为该表只能控制前台线程,后台线程也不具备用户、主机属性setup_actors表的初始内容是匹配任何用户和主机,因此所有前台线程默认启用监视和历史事件收集功能,如下所示:
mysql>。选择*从设置_演员;
+ - + - + - + - + - +
|主机|用户|角色|已启用|历史记录
+ - + - + - + - + - +
| % | % | % |是|是
+ - + - + - + - + - +
setup_actors表的字段具有以下含义:
HOST:与grant语句类似的主机名,一个具体的字符串名字,或使用“%”表示“任何主机”USER:一个具体的字符串名称,或使用“%”表示“任何用户”ROLE:当前未使用,MySQL 8.0中才启用角色功能ENABLED:是否启用与HOST,USER,ROLE匹配的前台线程的监控功能,有效值为:YES或NOHISTORY:是否启用与HOST, USER,ROLE匹配的前台线程的历史事件记录功能,有效值为:YES或NOPS:setup_actors表允许使用TRUNCATE TABLE语句清空表,或者DELETE语句删除指定行修改setup_actors表只影响修改后新创建的前台线程,对修改前创建的前台线程没有影响。如果要修改已创建的前台线程的监视和历史事件记录功能,可以修改线程表行中“已检测”和“历史”列的值:
当前台线程启动到mysql服务器的连接时,performance_schema将查询表setup_actors,找到表中的每个配置行,首先尝试使用USER和HOST列(未使用ROLE)找到匹配的配置行,然后找到最佳匹配行,并读取匹配行的ENABLE和HISTORY列值,这些值用于填充线程表中的ENABLE和HISTORY列值。
示例,假如setup_actors表中有如下HOST和USER值: * USER ='literal' and HOST ='literal' * USER ='literal' and HOST ='%' * USER ='%' and HOST ='literal' * USER ='%' and HOST ='%'匹配顺序很重要,因为不同的匹配行可能具有不同的USER和HOST值(mysql中对于用户帐号是使用user@host进行区分的),根据匹配行的ENABLED和HISTORY列值来决定对每个HOST,USER或ACCOUNT(USER和HOST组合,如:user@host)对应的线程在threads表中生成对应的匹配行的ENABLED和HISTORY列值 ,以便决定是否启用相应的instruments和历史事件记录,类似如下: * 当在setup_actors表中的最佳匹配行的ENABLED = YES时,threads表中对应线程的配置行中INSTRUMENTED列值将变为YES,HISTORY 列同理 * 当在setup_actors表中的最佳匹配行的ENABLED = NO时,threads表中对应线程的配置行中INSTRUMENTED列值将变为NO,HISTORY 列同理 * 当在setup_actors表中找不到匹配时,threads表中对应线程的配置行中INSTRUMENTED和HISTORY值值将变为NO * setup_actors表配置行中的ENABLED和HISTORY列值可以相互独立设置为YES或NO,互不影响,一个是是否启用线程对应的instruments,一个是是否启用线程相关的历史事件记录的consumers默认情况下,所有新的前台线程启用instruments和历史事件收集,因为setup_actors表中的预设值是host='%',user='%',ENABLED='YES',HISTORY='YES'的。如果要执行更精细的匹配(例如仅对某些前台线程进行监视),那就必须要对该表中的默认值进行修改,如下:#首先,使用UPDATE语句禁用默认配置行
UPDATEsetup _ actors set enabled = ' NO ',HISTORY = ' NO ' where host = ' % ' ANDUSER = ' % ';
#插入对应于用户joe@'localhost '的配置行,其中“ENABLED”和“HISTORY YES”
INSERTINTOsetup_actors (HOST,USER,ROLE,ENABLED,HISTORY)值(' localhost ',' joe ',' % ',' YES ',' YES ');
#插入对应于用户Joe @ Hosta . example . com的配置行,其中ENABLED=YES,HISTORY=NO
INSERTINTOsetup_actors (HOST,USER,ROLE,ENABLED,HISTORY)VALUES(' Hosta . example . com ',' joe ',' % ',' YES ',' NO ');
#插入对应于用户sam@'% '的配置行,其中ENABLED=NO,HISTORY=YES
INSERTINTOsetup_actors (HOST,USER,ROLE,ENABLED,HISTORY)值(' % ',' sam ',' % ',' NO ',' YES ');
#此时,线程表中相应用户的前台线程配置行的INSTRUMENTED和HISTORY列的有效值如下
# #当joe从localhost连接到mysql服务器时,连接符合第一个insert语句中插入的配置行,threads表中相应配置行的INSTRUMENTED和HISTORY列的值变为YES
# #当joe从hosta.example.com连接到mysql服务器时,连接符合第二个insert语句中插入的配置行。线程表中相应配置行的已检测列值为是,历史列值为否
# #当joe从任何其他主机连接到mysql服务器时(%匹配localhost和hosta.example.com以外的主机),连接符合第三个insert语句中的配置行InserT,threads表中相应配置行的INSTRUMENTED和HISTORY列的值变为No。
# #当sam从任何主机(%匹配)连接到mysql服务器时,连接符合第三个INSERT语句中插入的配置行,线程表中相应配置行的INSTRUMENTED列的值变为NO,HISTORY列的值为YES
# #当除joe和sam之外的任何用户从任何主机连接到mysql服务器时,它在第一条UPDATE语句更新后匹配默认配置行,线程表中相应配置行的INSTRUMENTED和HISTORY列的值变为NO。
# #如果UPDATE语句被更改为DELETE,以便未指定的用户在setup_actors表中找不到任何匹配的行,则threads表中相应配置行的INSTRUMENTED和HISTORY列的值将变为No。
对于后台线程,对setup_actors表的修改不会生效。如果您想干扰后台线程的默认设置,您需要查询线程表以找到相应的线程,然后使用UPDATE语句直接修改线程表中INSTRUMENTED和HISTORY列的值。
当performance_schema在setup_objects表中执行匹配检测时,它将首先尝试找到最具体(准确)的匹配。例如,在匹配db1.t1表时,它将首先从setup_objects表中找到“db1”和“t1”的匹配项,然后是“db1”和“%”,然后是“%”和“%”。匹配的顺序很重要,因为不同的匹配行可能具有不同的“启用”和“定时”列值
如果用户对表有INSERT和DELETE权限,他可以删除表中的配置行并插入新的配置行。对于现有的配置行,如果用户对该表具有“更新”权限,则可以修改“启用”和“定时”列。有效值为是和否
setup_objects表列的含义如下:
OBJECT_TYPE:instruments类型,有效值为:“EVENT”(事件调度器事件)、“FUNCTION”(存储函数)、“PROCEDURE”(存储过程)、“TABLE”(基表)、“TRIGGER”(触发器),TABLE对象类型的配置会影响表I/O事件(wait/io/table/sql/handler instrument)和表锁事件(wait/lock/table/sql/handler instrument)的收集OBJECT_SCHEMA:某个监视类型对象涵盖的数据库名称,一个字符串名称,或“%”(表示“任何数据库”)OBJECT_NAME:某个监视类型对象涵盖的表名,一个字符串名称,或“%”(表示“任何数据库内的对象”)ENABLED:是否开启对某个类型对象的监视功能,有效值为:YES或NO。此列可以修改TIMED:是否开启对某个类型对象的时间收集功能,有效值为:YES或NO,此列可以修改PS:对于setup_objects表,允许使用TRUNCATE TABLE语句setup_objects配置表中的默认配置规则不允许监控mysql、INFORMATION_SCHEMA和performance_schema数据库下的对象(ENABLED和TIMED列都为“否”)
当performance_schema在setup_objects表中执行查询匹配时,如果它发现一个OBJECT_TYPE列值有多行,它将尝试匹配更多的配置行,如下所示(performance_schema按以下顺序检查):
OBJECT_SCHEMA ='literal' and OBJECT_NAME ='literal'OBJECT_SCHEMA ='literal' and OBJECT_NAME ='%'OBJECT_SCHEMA ='%' and OBJECT_NAME ='%'例如,要匹配表对象db1.t1,performance_schema在setup_objects表中先查找“OBJECT_SCHEMA = db1”和“OBJECT_NAME = t1”的匹配项,然后查找“OBJECT_SCHEMA = db1”和“OBJECT_NAME =%”,然后查找“OBJECT_SCHEMA = %”和“OBJECT_NAME = %”。匹配顺序很重要,因为不同的匹配行中的ENABLED和TIMED列可以有不同的值,最终会选择一个最精确的匹配项关于与表对象相关的事件,仪器是否有效取决于设置_对象和设置_仪器两个表中配置内容的组合。确定仪器和定时器功能是否启用(例如:I/O事件:wait/io/table/SQL/Handler Instrument和table lock事件:wait/lock/table/SQL/Handler Instrument,在setup_instruments配置表中也有明确的配置选项);
只有在Setup_instruments和setup_objects中的ENABLED列都为YES时,表的instruments才会生成事件信息只有在Setup_instruments和setup_objects中的TIMED列都为YES时,表的instruments才会启用计时器功能(收集时间信息)例如:要监视db1.t1、db1.t2、db2.%、db3.%这些表,setup_instruments和setup_objects两个表中有如下配置项# setup_instruments表
admin @ localhost:performance _ schema 03:06:01 & gt。从setup_instruments中选择*名称,如“%/table/%”;
+ - + - + - +
|名称|启用|定时
+ - + - + - +
|等待/io/表/SQL/处理程序|是|是
|等待/锁定/表/SQL/处理程序|是|是
+ - + - + - +
2右侧插图(0。00秒)
#设置_对象表
+ - + - + - + - + - +
|对象_类型|对象_模式|对象_名称|启用|定时
+ - + - + - + - + - +
| TABLE | db1 | t1 |是|是
|表| db1 | t2 |否|否
| TABLE |db2 | % |YES | YES
| TABLE |db3 | % |NO | NO
|表格| % | % |是|是
+ - + - + - + - + - +
#以上两个表中的配置项集成后,只有db1.t1、db2的仪器。%,%.% table对象将被启用,但db1.t2和db3。%将不会被启用,因为setup_objects配置表中这两个对象的enabled和TIMED字段为no。
对于与存储的程序对象相关的事件,performance_schema只需要从setup_objects表中读取配置项的ENABLED和TIMED列值。因为存储的程序对象在setup_instruments表中没有相应的配置项
如果持久表和临时表具有相同的名称,当在setup_objects表中匹配时,这两种类型的表的匹配规则将同时生效(一个表将不被启用进行监视,另一个表将不被启用)
#关闭除当前连接之外的所有前台线程的事件集合
root @ localhost:performance _ schema 05:47:44 & gt;更新线程集检测= '否'哪里进程列表标识!= connection _ id();
查询正常,2条曲线受影响(0.00秒)
匹配的行:2已更改:2警告:0
#打开除当前连接之外的所有前台线程的事件集合
root @ localhost:performance _ schema 05:48:32 & gt;更新线程集检测= '是'哪里进程列表标识!= connection _ id();
查询正常,2条曲线受影响(0.00秒)
匹配的行:2已更改:2警告:0
#当然,如果你想用后台线程操作,带条件PROCESSLIST_ID isNULL。
更新...wherePROCESSLIST_ID!=connection_id()或PROCESSLIST _ ID isNULL
本文到此结束。如果看完本章后仍然对performance_schema感到困惑,建议按照以下步骤看一看:
使用命令行命令 mysqld --verbose --help |grep performance-schema |grep -v '--' |sed '1d' |sed '/[0-9]+/d'; 查看完整的启动选项列表登录到数据库中使用 show variables like '%performance_schema%';语句查看完整的system variables列表登录到数据库中使用 use performance_schema;语句切换到schema下,然后使用show tables;语句查看一下完整的table列表,并手工执行show create table tb_xxx;查看表结构,select * from xxx;查看表中的内容performance_schema的配置是整个performance_schema的难点。为了以后更好的学习performance_schema,建议初学者把这一章读两遍。
下一篇文章将分享“事件记录全方位介绍| performance_schema”。谢谢大家看了。我们要么在那里,要么原地踏步!
1.《schema 配置详解 | performance_schema全方位介绍(二)》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《schema 配置详解 | performance_schema全方位介绍(二)》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/caijing/862032.html