PROCESSLIST_INFO: NULL

MySQL Performance-Schema(一) 配置表,performanceschema

      performance-schema最早在MYSQL
5.5中出现,而现在5.6,5.7中performance-Schema又添加了更多的监控项,统计信息也更丰富,越来越有ORACLE-AWR统计信息的赶脚,真乃DBA童鞋进行性能诊断分析的福音。本文主要讲Performance-Schema中的配置表,通过配置表能大概了解performance-schema的全貌,为后续使用和深入理解做准备。

配置表

Performance-Schema中主要有5个配置表,具体如下:

[email protected]_schema
06:03:09>show tables like ‘%setup%’;
+—————————————-+
| Tables_in_performance_schema (%setup%) |
+—————————————-+
| setup_actors |
| setup_consumers |
| setup_instruments |
| setup_objects |
| setup_timers |
+—————————————-+

1.setup_actors用于配置user维度的监控,默认情况下监控所有用户线程。
[email protected]_schema
05:47:27>select * from setup_actors;
+——+——+——+
| HOST | USER | ROLE |
+——+——+——+
| % | % | % |
+——+——+——+

2.setup_consumers表用于配置事件的消费者类型,即收集的事件最终会写入到哪些统计表中。
[email protected]_schema
05:48:16>select * from setup_consumers;
+——————————–+———+
| NAME | ENABLED |
+——————————–+———+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | NO |
| events_statements_history_long | NO |
| events_waits_current | NO |
| events_waits_history | NO |
| events_waits_history_long | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+——————————–+———+
可以看到有12个consumer,如果不想关注某些consumer,可以将ENABLED设置为NO,比如events_statements_history_long设置为NO,
则收集事件不会写入到对应的表events_statements_history_long中。12个consumer不是平级的,存在多级层次关系。具体如下表:
global_instrumentation
 |– thread_instrumentation
   |– events_金沙国际平台,waits_current
     |– events_waits_history
     |– events_waits_history_long
   |– events_stages_current
     |– events_stages_history
     |– events_stages_history_long
   |– events_statements_current
     |– events_statements_history
     |– events_statements_history_long
 |– statements_digest

多层次的consumer遵从一个基本原则,只有上一层次的为YES,才会继续检查该本层为YES
or
NO。global_instrumentation是最高级别consumer,如果它设置为NO,则所有的consumer都会忽略。如果只打开global_instrumentation,而关闭所有其它子consumer(设置为NO),则只收集全局维度的统计信息,比如xxx_instance表,而不会收集用户维度,语句维度的信息。第二层次的是thread_instrumentation,用户线程维度的统计信息,比如xxx_by_thread表,另外一个是statements_digest,这个用于全局统计SQL-digest的信息。第三层次是语句维度,包括events_waits_current,events_stages_current和events_statements_current,分别用于统计wait,stages和statement信息,第四层次是历史表信息,主要包括xxx_history和xxx_history_long。

3.setup_instruments表用于配置一条条具体的instrument,主要包含4大类:idle,stage/xxx,statement/xxx,wait/xxx.
[email protected]_schema
06:25:50>select name,count(*) from setup_instruments group by
LEFT(name,5);
+———————————+———-+
| name | count(*) |
+———————————+———-+
| idle | 1 |
| stage/sql/After create | 111 |
| statement/sql/select | 170 |
| wait/synch/mutex/sql/PAGE::lock | 296 |
+———————————+———-+
idle表示socket空闲的时间,stage类表示语句的每个执行阶段的统计,statement类统计语句维度的信息,wait类统计各种等待事件,比如IO,mutux,spin_lock,condition等。从上表统计结果来看,可以基本看到每类的instrument数目,stage包含111个,statement包含170个,wait包含296个。

4.setup_objects表用于配置监控对象,默认情况下所有mysql,performance_schema和information_schema中的表都不监控。而其它DB的所有表都监控。

[email protected]_schema
06:25:55>select * from setup_objects;
+————-+——————–+————-+———+——-+
| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED |
+————-+——————–+————-+———+——-+
| TABLE | mysql | % | NO | NO |
| TABLE | performance_schema | % | NO | NO |
| TABLE | information_schema | % | NO | NO |
| TABLE | % | % | YES | YES |
+————-+——————–+————-+———+——-+

5.setup_timers表用于配置每种类型指令的统计时间单位。MICROSECOND表示统计单位是微妙,CYCLE表示统计单位是时钟周期,时间度量与CPU的主频有关,NANOSECOND表示统计单位是纳秒,关于每种类型的具体含义,可以参考performance_timer这个表。由于wait类包含的都是等待事件,单个SQL调用次数比较多,因此选择代价最小的度量单位cycle。但无论采用哪种度量单位,最终统计表中统计的时间都会装换到皮秒。

[email protected]_schema
06:29:50>select \
from setup_timers;
+———–+————-+
| NAME | TIMER_NAME |
+———–+————-+
| idle | MICROSECOND |
| wait | CYCLE |
| stage | NANOSECOND |
| statement | NANOSECOND |
+———–+————-+*

配置方式

**     
默认情况下,setup_instruments表只打开了statement和wait/io部分的指令,setup_consumer表中很多consumer也没有打开。为了打开需要的选项,可以通过update语句直接修改配置表,并且修改后可以立即生效,但这种方式必需得启动服务器后才可以修改,并且无法持久化,重启后,又得重新设置一遍。从5.6.4开始提供了my.cnf的配置方式,格式如下:

1.设置采集的instrument
performance_schema_instrument=’instrument_name=value’
(1)打开wait类型的指令
performance_schema_instrument=’wait/%’
(2)打开所有指令
performance_schema_instrument=’%=on’

2.设置consumer
performance_schema_consumer_xxx=value
(1)打开 events_waits_history consumer

performance_schema_consumer_events_waits_current=on

performance_schema_consumer_events_waits_history=on

这里要注意consumer的层次关系, events_waits_history处于第4层,因此设置它时,要确保events_statements_current,thread_instrumentation和global_instrumentation的ENABLED状态都为YES,才能生效。由于默认thread_instrumentation和global_instrumentation都是YES,因此只需要显示设置events_waits_current和events_waits_current即可。

3.设置统计表大小
所有的performance_schema表均采用PERFORMANCE_SCHEMA存储引擎,表中的所有数据只存在内存,表的大小在系统初始化时已经
固定好,因此占用的内存是一定的。可以通过配置来定制具体每个表的记录数。
performance_schema_events_waits_history_size=20
performance_schema_events_waits_history_long_size=15000

 

Performance-Schema(一)
配置表,performanceschema performance-schema最早在MYSQL
5.5中出现,而现在5.6,5.7中performance-Schema又添加了更多的监控项,统…

MySQL Performance-Schema(一) 配置表

performance-schema最早在MYSQL
5.5中出现,而现在5.6,5.7中performance-Schema又添加了更多的监控项,统计信息也更丰富,越来越有ORACLE-AWR统计信息的赶脚,真乃DBA童鞋进行性能诊断分析的福音。本文主要讲Performance-Schema中的配置表,通过配置表能大概了解performance-schema的全貌,为后续使用和深入理解做准备。

 

配置表

 

Performance-Schema中主要有5个配置表,具体如下:

 

[email protected]_schema
06:03:09>show tables like ‘%setup%’;

+—————————————-+

| Tables_in_performance_schema (%setup%) |

+—————————————-+

| setup_actors |

| setup_consumers |

| setup_instruments |

| setup_objects |

| setup_timers |

+—————————————-+

 

1.setup_actors用于配置user维度的监控,默认情况下监控所有用户线程。

[email protected]_schema
05:47:27>select * from setup_actors;

+——+——+——+

| HOST | USER | ROLE |

+——+——+——+

| % | % | % |

+——+——+——+

 

2.setup_consumers表用于配置事件的消费者类型,即收集的事件最终会写入到哪些统计表中。

[email protected]_schema
05:48:16>select * from setup_consumers;

+——————————–+———+

| NAME | ENABLED |

+——————————–+———+

| events_stages_current | NO |

| events_stages_history | NO |

| events_stages_history_long | NO |

| events_statements_current | YES |

| events_statements_history | NO |

| events_statements_history_long | NO |

| events_waits_current | NO |

| events_waits_history | NO |

| events_waits_history_long | NO |

| global_instrumentation | YES |

| thread_instrumentation | YES |

| statements_digest | YES |

+——————————–+———+

可以看到有12个consumer,如果不想关注某些consumer,可以将ENABLED设置为NO,比如events_statements_history_long设置为NO,

则收集事件不会写入到对应的表events_statements_history_long中。12个consumer不是平级的,存在多级层次关系。具体如下表:

global_instrumentation 

 |– thread_instrumentation

   |– events_waits_current

     |– events_waits_history

     |– events_waits_history_long

   |– events_stages_current

     |– events_stages_history

     |– events_stages_history_long

   |– events_statements_current

     |– events_statements_history

     |– events_statements_history_long

 |– statements_digest

 

多层次的consumer遵从一个基本原则,只有上一层次的为YES,才会继续检查该本层为YES
or
NO。global_instrumentation是最高级别consumer,如果它设置为NO,则所有的consumer都会忽略。如果只打开global_instrumentation,而关闭所有其它子consumer(设置为NO),则只收集全局维度的统计信息,比如xxx_instance表,而不会收集用户维度,语句维度的信息。第二层次的是thread_instrumentation,用户线程维度的统计信息,比如xxx_by_thread表,另外一个是statements_digest,这个用于全局统计SQL-digest的信息。第三层次是语句维度,包括events_waits_current,events_stages_current和events_statements_current,分别用于统计wait,stages和statement信息,第四层次是历史表信息,主要包括xxx_history和xxx_history_long。

 

3.setup_instruments表用于配置一条条具体的instrument,主要包含4大类:idle,stage/xxx,statement/xxx,wait/xxx.

[email protected]_schema
06:25:50>select name,count(*) from setup_instruments group by
LEFT(name,5);

+———————————+———-+

| name | count(*) |

+———————————+———-+

| idle | 1 |

| stage/sql/After create | 111 |

| statement/sql/select | 170 |

| wait/synch/mutex/sql/PAGE::lock | 296 |

+———————————+———-+

 

idle表示socket空闲的时间,stage类表示语句的每个执行阶段的统计,statement类统计语句维度的信息,wait类统计各种等待事件,比如IO,mutux,spin_lock,condition等。从上表统计结果来看,可以基本看到每类的instrument数目,stage包含111个,statement包含170个,wait包含296个。

 

4.setup_objects表用于配置监控对象,默认情况下所有mysql,performance_schema和information_schema中的表都不监控。而其它DB的所有表都监控。

 

[email protected]_schema
06:25:55>select * from setup_objects;

+————-+——————–+————-+———+——-+

| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED |

+————-+——————–+————-+———+——-+

| TABLE | mysql | % | NO | NO |

| TABLE | performance_schema | % | NO | NO |

| TABLE | information_schema | % | NO | NO |

| TABLE | % | % | YES | YES |

+————-+——————–+————-+———+——-+

 

5.setup_timers表用于配置每种类型指令的统计时间单位。MICROSECOND表示统计单位是微妙,CYCLE表示统计单位是时钟周期,时间度量与CPU的主频有关,NANOSECOND表示统计单位是纳秒,关于每种类型的具体含义,可以参考performance_timer这个表。由于wait类包含的都是等待事件,单个SQL调用次数比较多,因此选择代价最小的度量单位cycle。但无论采用哪种度量单位,最终统计表中统计的时间都会装换到皮秒。

 

[email protected]_schema
06:29:50>select * from setup_timers;

+———–+————-+

| NAME | TIMER_NAME |

+———–+————-+

| idle | MICROSECOND |

| wait | CYCLE |

| stage | NANOSECOND |

| statement | NANOSECOND |

+———–+————-+

 

配置方式

 

默认情况下,setup_instruments表只打开了statement和wait/io部分的指令,setup_consumer表中很多consumer也没有打开。为了打开需要的选项,可以通过update语句直接修改配置表,并且修改后可以立即生效,但这种方式必需得启动服务器后才可以修改,并且无法持久化,重启后,又得重新设置一遍。从5.6.4开始提供了my.cnf的配置方式,格式如下:

 

1.设置采集的instrument

performance_schema_instrument=’instrument_name=value’

(1)打开wait类型的指令

performance_schema_instrument=’wait/%’

(2)打开所有指令

performance_schema_instrument=’%=on’

 

2.设置consumer

performance_schema_consumer_xxx=value

(1)打开 events_waits_history consumer

 

performance_schema_consumer_events_waits_current=on

 

performance_schema_consumer_events_waits_history=on

 

这里要注意consumer的层次关系,
events_waits_history处于第4层,因此设置它时,要确保events_statements_current,thread_instrumentation和global_instrumentation的ENABLED状态都为YES,才能生效。由于默认thread_instrumentation和global_instrumentation都是YES,因此只需要显示设置events_waits_current和events_waits_current即可。

 

3.设置统计表大小

所有的performance_schema表均采用PERFORMANCE_SCHEMA存储引擎,表中的所有数据只存在内存,表的大小在系统初始化时已经

固定好,因此占用的内存是一定的。可以通过配置来定制具体每个表的记录数。

performance_schema_events_waits_history_size=20

performance_schema_events_waits_history_long_size=15000

Performance-Schema(一) 配置表
performance-schema最早在MYSQL
5.5中出现,而现在5.6,5.7中performance-Schema又添加了更多的监控项,统计信息也更丰富…

performance_schema=ON

注意:虽然我们可以通过cmake的编译选项关闭掉某些performance_schema的功能模块,但是,通常我们不建议这么做,除非你非常清楚后续不可能使用到这些功能模块,否则后续想要使用被编译时关闭的模块,还需要重新编译。

1).
表I/O操作相关的instruments。这个类别包括了对持久基表或临时表的行级访问(对数据行获取,插入,更新和删除),对于视图来说,instruments检测时会参照被视图引用的基表访问情况

当performance_schema在setup_objects表中进行匹配检测时,会尝试首先找到最具体(最精确)的匹配项。例如,在匹配db1.t1表时,它会从setup_objects表中先查找“db1”和“t1”的匹配项,然后再查找“db1”和“%”,然后再查找“%”和“%”。匹配的顺序很重要,因为不同的匹配行可能具有不同的ENABLED和TIMED列值

| wait/synch/mutex/sql/LOCK_lock_db |YES | YES |

|stage | NANOSECOND |

#
以上两个表中的配置项综合之后,只有db1.t1、db2.%、%.%的表对象的instruments会被启用,db1.t2和db3.%不会启用,因为这两个对象在setup_objects配置表中ENABLED和TIMED字段值为NO

instruments具有树形结构的命名空间,从setup_instruments表中的NAME字段上可以看到,instruments名称的组成从左到右,最左边的是顶层instruments类型命名,最右边是一个具体的instruments名称,有一些顶层instruments没有其他层级的组件(如:transaction和idle,那么这个顶层类型既是类型又是具体的instruments),有一些顶层instruments具有下层instruments(如:wait/io/file/myisam/log),一个层级的instruments名称对应的组件数量取决于instruments的类型。

PROCESSLIST_USER: NULL

#
如果发现performance_schema开头的几个选项,则表示当前mysqld支持performance_schema,如果没有发现performance_schema相关的选项,说明当前数据库版本不支持performance_schema,你可能需要升级mysql版本:

+————————————–+———+——-+

# 第二种instruments表示myisam引擎的磁盘同步相关的instruments

下面将对这些启动选项进行简单描述(这些启动选项是用于指定consumers和instruments配置项在MySQL启动时是否跟随打开的,之所以叫做启动选项,是因为这些需要在mysqld启动时就需要通过命令行指定或者需要在my.cnf中指定,启动之后通过show
variables命令无法查看,因为他们不属于system variables)

TYPE: FOREGROUND

3).
wait/synch/rwlock:一个线程使用一个读写锁对象对某个特定变量进行锁定,以防止其他线程同时访问,对于使用共享读锁锁定的资源,多个线程可以同时访问,对于使用独占写锁锁定的资源,只有一个线程能同时访问,该instruments用于采集发生读写锁锁定时的事件信息

是否在MySQL Server启动时就开启

| wait/synch/mutex/sql/LOCK_global_system_variables |YES | YES |

(1) performance_timers表

  • NAME:consumers配置名称
  • ENABLED:consumers是否启用,有效值为YES或NO,此列可以使用UPDATE语句修改。如果需要禁用consumers就设置为NO,设置为NO时,server不会维护这些consumers表的内容新增和删除,且也会关闭consumers对应的instruments(如果没有instruments发现采集数据没有任何consumers消费的话)
  • PS:对于setup_consumers表,不允许使用TRUNCATE TABLE语句
  • 示例,假如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’的。如果要执行更精细的匹配(例如仅对某些前台线程进行监视),那就必须要对该表中的默认值进行修改,如下:

performance_schema_events_statements_history_long_size=10000

| wait/io/table/sql/handler |YES | YES |

+———————————-+———+

## 当joe从localhost连接到mysql
server时,则连接符合第一个INSERT语句插入的配置行,threads表中对应配置行的INSTRUMENTED和HISTORY列值变为YES

Query OK, 2rows affected(0.00sec)

performance-schema-consumer-events-statements-history TRUE

wait/synch/cond/myisam/MI_SORT_INFO::cond

| wait/lock/table/sql/handler |YES | YES |

| EVENT |performance_schema | % |NO | NO |

setup_objects表控制performance_schema是否监视特定对象。默认情况下,此表的最大行数为100行。要更改表行数大小,可以在server启动之前修改系统变量performance_schema_setup_objects_size的值。

–performance-schema-instrument= ‘instrument_name=value’

mysql> SELECT * FROM performance_timers;

mysql>UPDATE setup_instruments SET ENABLED = IF(NAME LIKE
‘wait/io/file/%’, ‘NO’, ‘YES’);

3rows inset ( 0. 00sec)

友情提示:以下内容阅读起来可能比较烧脑,内容也较长,建议大家端好板凳,坐下来,点上一支烟,细细品读,这也是学习performance_schema路上不得不过的火焰山,坚持下去,”翻过这座山,你就可以看到一片海!”

大多数setup_instruments配置行修改会立即影响监控,但对于某些instruments,运行时修改不生效(配置表可以修改,但不生效),只有在启动之前修改才会生效(使用system
variables写到配置文件中),不生效的instruments主要有mutexes, conditions,
and rwlocks

4).
wait/synch/sxlock:shared-exclusive(SX)锁是一种rwlock锁
object,它提供对公共资源的写访问的同时允许其他线程的不一致读取。sxlocks锁object可用于优化数据库读写场景下的并发性和可扩展性。

*************************** 6. row
***************************

  • NAME:计时器类型,对应着某个事件类别(事件类别详见 3.3.4 节)
  • TIMER_NAME:计时器类型名称。此列可以修改,有效值参见performance_timers.TIMER_NAME列值
  • PS:对于setup_timers表,不允许使用TRUNCATE TABLE语句

instruments的命名格式组成:performance_schema实现的一个前缀结构(如:wait/io/file/myisam/log中的wait+由开发人员实现的instruments代码定义的一个后缀名称组成(如:wait/io/file/myisam/log中的io/file/myisam/log)

| wait/io/file/sql/casetest |YES | YES |

setup_timers表中记录当前使用的事件计时器信息(注意:该表不支持增加和删除记录,只支持修改和查询)

关于线程类对象,前台线程与后台线程还有少许差别

mysql> SHOW ENGINESG

performance-schema-consumer-events-waits-history- longFALSE

performance-schema-consumer-thread-instrumentation TRUE

| NAME |TIMER_NAME |

与performance_schema_consumer_events_statements_current选项类似,但该选项是用于配置是否记录语句事件短历史信息,默认为TRUE

+———————————-+———+

setup_objects表列含义如下:

|events_stages_history_long | NO |

# 开启除了当前连接之外的所有前台线程的事件采集

+————-+—————–+——————+—————-+

+————-+—————+————-+———+——-+

THREAD_ID: 43

instruments:生产者,用于采集MySQL
中各种各样的操作产生的事件信息,对应配置表中的配置项我们可以称为监控采集配置项,以下提及生产者均统称为instruments

performance-schema-consumer-global-instrumentation TRUE

1).
wait/synch/cond:一个线程使用一个状态来向其他线程发信号通知他们正在等待的事情已经发生了。如果一个线程正在等待这个状态,那么它可以被这个状态唤醒并继续往下执行。如果是几个线程正在等待这个状态,则这些线程都会被唤醒,并竞争他们正在等待的资源,该instruments用于采集某线程等待这个资源时被阻塞的事件信息。

# 关闭除了当前连接之外的所有前台线程的事件采集

+————-+————-+

| PROCEDURE |% | % |YES | YES |

##
当joe从其他任意主机(%匹配除了localhost和hosta.example.com之外的主机)连接到mysql
server时,则连接符合第三个INSERT语句插入的配置行,threads表中对应配置行的INSTRUMENTED和HISTORY列值变为NO

consumers:消费者,对应的消费者表用于存储来自instruments采集的数据,对应配置表中的配置项我们可以称为消费存储配置项,以下提及消费者均统称为consumers

## 开关所有的instruments

INSTRUMENTED: YES

#
[=name]可以指定为具体的Instruments名称(但是这样如果有多个需要指定的时候,就需要使用该选项多次),也可以使用通配符,可以指定instruments相同的前缀+通配符,也可以使用%代表所有的instruments

# 插入用户joe@’hosta.example.com’对应ENABLED=YES、HISTORY=NO的配置行

setup_instruments 表列出了instruments
列表配置项,即代表了哪些事件支持被收集:

Query OK, 2rows affected(0.00sec)

| events_stages_history |NO |

performance-schema-consumer-events-waits-history FALSE

-DDISABLE_PSI_STATEMENT=1 #关闭STATEMENT事件监视器

+————-+—————+————-+———+——-+

–performance-schema-instrument= ‘wait/synch/cond/%=COUNTED’

| wait/synch/rwlock/sql/LOGGER::LOCK_logger |YES | YES |

## 当joe从hosta.example.com连接到mysql
server时,则连接符合第二个INSERT语句插入的配置行,threads表中对应配置行的INSTRUMENTED列值为YES,HISTORY列值为NO

| wait |CYCLE |

mysql>UPDATE setup_consumers SET ENABLED =’NO’WHERE NAME
=’events_waits_current’;

performance-schema-consumer-events-stages-history- longFALSE

performance-schema-consumer-events-statements-history- longFALSE

PROCESSLIST_ID: 1

wait/synch:磁盘同步object相关的instruments,
performance_schema.events_waits_xxx表中的TIMER_WAIT时间列包括了在尝试获取某个object上的锁(如果这个对象上已经存在锁)的时候被阻塞的时长。

setup_actors表字段含义如下:

  • performance_schema_consumer_events_statements_history=TRUE

| EVENT |% | % |YES | YES |

root@localhost : performance_schema 05:47:08> update threads
setINSTRUMENTED= ‘YES’whereTYPE= ‘BACKGROUND’;

–performance_schema_events_waits_history_long_size= #

默认值为TRUE

+—————————–+———+——-+

HISTORY: YES

PROCESSLIST_STATE: Suspending

performance_schema_events_statements_history_size=10

关闭与开启除了当前连接之外的所有线程的事件采集(不包括后台线程)

可以使用cmake的编译选项来自行决定你的MySQL实例是否支持performance_schema的某个等待事件类别,如下:

#关闭历史事件记录功能

# 关闭所有后台线程的事件采集

#打开events_waits_current表当前等待事件记录功能

PROCESSLIST_DB: NULL

当performance_schema初始化时,它根据当时存在的线程每个线程生成一行信息记录在threads表中。此后,每新建一个线程在该表中就会新增一行对应线程的记录

| HOST |USER | ROLE |ENABLED | HISTORY |

threads表对于每个server线程生成一行包含线程相关的信息,例如:显示是否启用监视,是否启用历史事件记录功能,如下:

对于后台线程,对setup_actors表的修改不生效,如果要干预后台线程默认的设置,需要查询threads表找到相应的线程,然后使用UPDATE语句直接修改threads表中的INSTRUMENTED和HISTORY列值。

新线程信息的INSTRUMENTED和HISTORY列值由setup_actors表中的配置决定。有关setup_actors表的详细信息参见3.3.5.

(2)**setup_timers**表

| 基本概念

Transactions: NO

  • 控制events_statements_summary_by_digest表中的最大行数。如果产生的语句摘要信息超过此最大值,便无法继续存入该表,此时performance_schema会增加状态变量

| NAME |ENABLED | TIMED |

PROCESSLIST_COMMAND: Daemon

mysql>UPDATE setup_instruments SET ENABLED = ‘NO’WHERE NAME LIKE
‘wait/io/file/%’;

PROCESSLIST_TIME: 27439

除了statement(语句)事件之外,wait(等待)事件、state(阶段)事件、transaction(事务)事件,他们与statement事件一样都有三个参数分别进行存储限制配置,有兴趣的同学自行研究,这里不再赘述

wait/lock:锁操作相关的instruments

本篇内容到这里就接近尾声了,如果阅读了本章内容之后,感觉对performance_schema仍然比较迷糊,那么建议按照如下步骤动动手、看一看:

2 rows in set (0.00 sec)

[root@localhost ~] # mysqld –verbose –help |grep performance-schema
|grep -v ‘–‘ |sed ‘1d’ |sed ‘/[0-9]+/d’

责任编辑:

Savepoints: NO

mysql>UPDATE setup_instruments SET ENABLED = ‘NO’WHERE NAME =
‘wait/synch/mutex/mysys/TMPDIR_mutex’;

#仅禁用文件类instruments,启用所有其他instruments,使用NAME字段结合if函数,LIKE模糊匹配到就改为NO,没有匹配到的就改为YES:

setup_consumers表中的consumers配置项具有层级关系,具有从较高级别到较低级别的层次结构,按照优先级顺序,可列举为如下层次结构(你可以根据这个层次结构,关闭你可能不需要的较低级别的consumers,这样有助于节省性能开销,且后续查看采集的事件信息时也方便进行筛选):

| TABLE |db1 | t1 |YES | YES |

默认配置中开启监视的对象不包含mysql,INFORMATION_SCHEMA和performance_schema数据库中的所有表(从上面的信息中可以看到这几个库的enabled和timed字段都为NO,注意:对于INFORMATION_SCHEMA数据库,虽然该表中有一行配置,但是无论该表中如何设置,都不会监控该库,在setup_objects表中information_schema.%的配置行仅作为一个缺省值)

注意:在mysqld选项或show
engines语句输出的结果中,如果看到有performance_schema相关的信息,并不代表已经启用了performance_schema,仅仅只是代表数据库支持,如果需要启用它,还需要在服务器启动时使用系统参数performance_schema=on(MySQL
5.7之前的版本默认关闭)显式开启

CONNECTION_TYPE: NULL

| wait/synch/mutex/sql/LOCK_manager |YES | YES |

  • 对threads表的访问不需要互斥体,对server性能影响最小。
    而使用INFORMATION_SCHEMA.PROCESSLIST和SHOW
    PROCESSLIST查询线程信息的方式会损耗一定性能,因为他们需要互斥体
  • threads表为每个线程提供附加信息,例如:它是前台还是后台线程,以及与线程相关联的server内部信息
  • threads表提供有关后台线程的信息,而INFORMATION_SCHEMA.PROCESSLIST和SHOW
    PROCESSLIST不能提供
  • 可以通过threads表中的INSTRUMENTED字段灵活地动态开关某个线程的监视功能、HISTORY字段灵活地动态开关某个线程的历史事件日志记录功能。要控制新的前台线程的初始INSTRUMENTED和HISTORY列值,通过setup_actors表的HOST、
    USER对某个主机、用户进行配置。要控制已创建线程的采集和历史事件记录功能,通过threads表的INSTRUMENTED和HISTORY列进行设置
  • 对于INFORMATION_SCHEMA.PROCESSLIST和SHOW
    PROCESSLIST,需要有PROCESS权限,对于threads表只要有SELECT权限就可以查看所有用户的线程信息

默认值为TRUE

mysql>UPDATE setup_consumers SET ENABLED =’NO’wherename like
‘%history%’;

  • 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

3).
某些行操作可能会导致多个表I/O等待。例如,如果有INSERT的触发器,那么插入操作可能导致触发器更新操作。

可以通过UPDATE语句来更改setup_timers.TIMER_NAME列值,以给不同的事件类别选择不同的计时器,setup_timers.TIMER_NAME列有效值来自performance_timers.TIMER_NAME列值。

PARENT _THREAD_ID: 1

原标题:配置详解 | performance_schema全方位介绍(二)

默认值为TRUE

  • 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语句

| events_transactions_history |NO |

Support: YES

|events_transactions_history_long | NO |

| TABLE |db2 | % |YES | YES |

相关文章