[MySQL 5.6] Performance Schema 之 PS配置项(1)

尽管Performance Schema(以下简称PS)在5.5中已经出现,但一直没有使用过,并且相比5.6,5.5的PS表要少很多。 以下从一个初学者的角度,阅读PS的官方文档,做一些简单的笔记

官方文档见:http://dev.mysql.com/doc/refman/5.6/en/performance-schema.html

目录: 

  1. 1.开启PS
  2. 2.配置PS
  3. 2.1 setup_timers表决定了不同的instrument使用的timer类型
  4. 2.2setup_instruments 
  5. 2.3 setup_consumers表 列出了事件信息的消费者类型
  6. 2.4.setup_objects
  7. 2.5.setup_actors

1.开启PS

首先需要强调一点,开启PS是有性能开销的,在一个性能测试场景上,我对比了阿里内部版本的Percona Server 5.5.18与官方MySQL5.6.10,发现在同等压力下,5.6版本有明显的更高的CPU开销(大约高了10~20%)

确认是否开启:

编译阶段:-DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON    

默认是ON,可以设为OFF来在编译阶段关闭Performance Schema

也可以在启动mysqld时,关闭选项performance_schema

如果你在error log中看到类似错误的PS表结构或者PS表找不到之类的错误,在开启实例后,可以执行一下mysql_upgrade

[ERROR] Native table 'performance_schema'.'events_waits_history' has the wrong structure [ERROR] Native table 'performance_schema'.'events_waits_history_long' 

has the wrong structure 

2.配置PS

Performance Schema可以通过配置setup表来在运行时配置PS,包括以下几个表:

mysql> show tables like ‘%setup%';

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

| Tables_in_performance_schema (%setup%) |

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

| setup_actors                           |

| setup_consumers                        |

| setup_instruments                      |

| setup_objects                          |

| setup_timers                           |

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

5 rows in set (0.00 sec) 

事件的计数设置有两个相关的表:

performance_timers 列出了可用的时间计数器(timer)及其特征 

mysql> SELECT * FROM performance_timers;

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

| TIMER_NAME  | TIMER_FREQUENCY | TIMER_RESOLUTION | TIMER_OVERHEAD |

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

| CYCLE       |      2490706467 |                1 |             38 |

| NANOSECOND  |      1000000000 |                1 |            128 |

| MICROSECOND |         1000000 |                1 |            135 |

| MILLISECOND |            1036 |                1 |            150 |

| TICK        |             103 |                1 |            450 |

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

其中CYCLE由CPU  cycle counter 来决定timer

TIMER_FREQUENCY表示每秒内的计数次数,对于CYCLE类型和CPU的速度相关。

TICK取决于不同的平台,例如,在我的机器上,每秒103个tick,tick表示每发生一次timer interrupt的时间间隔,tick的一些概念可以参考网上找到的这篇文章:http://www.360doc.com/content/11/1201/09/1317564_168810003.shtml

TIMER_RESOLUTION表示每次增加计数的单元,如果为10的话,就表示每次值加10

TIMER_OVERHEAD:the minimal number of cycles of overhead to obtain one timing with the given timer

2.1 setup_timers表决定了不同的instrument使用的timer类型

mysql> SELECT * FROM setup_timers;

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

| NAME      | TIMER_NAME  |

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

| idle      | MICROSECOND |

| wait      | CYCLE       |

| stage     | NANOSECOND  | 

| statement | NANOSECOND  |

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

setup_timers 可以配置每种instrument 使用哪种timer, timer必须是performance_timers表中的某一列,可以通过update语句来进行更新 

对于wait类型,最重要的是减少OVERHEAD,所以选择CYCLE类型,相应的代价是损失计时精度

statement或者stage的执行时间总的来说,相比wait要高一个数量级。为了给statement计时,最重要的是原则是要有一个精确的衡量,并且不受处理器频率影响,因此默认的为NANOSECOND,其额外的‘OVERHEAD’相比CYCLE TIMER并不明显,因为调用一个timer两次的开销(一次是statement开始,一次是statement结束)相比statement执行本身的CPU时间要小很多个数量级。如果使用CYCLE,只有坏处,没有好处。

cycle计数器的精度依赖于CPU的速度,使用CYCLE 计数器实际上比使用标准gettimeofday的开销要小,后者的一次调用可能产生上百次cycle。

修改 setup_timers 表会立刻生效,所以可能一个事件的开头和结束使用了两个不同的timer

2.2setup_instruments 

setup_instruments 表中包含了上述四种类型(idle,wait, stage,statement)对应的的instrument,对象可以通过更新ENABLED和TIMED列来决定是否收集对应事件的信息 

mysql> select count(*) from  setup_instruments;

+———-+

| count(*) |

+———-+

|      545 |

+———-+

1 row in set (0.00 sec)

mysql> desc setup_instruments;

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

| Field   | Type             | Null | Key | Default | Extra |

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

| NAME    | varchar(128)     | NO   |     | NULL    |       |

| ENABLED | enum(‘YES’,’NO’) | NO   |     | NULL    |       |

| TIMED   | enum(‘YES’,’NO’) | NO   |     | NULL    |       |

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

目前5.6.10的版本有545个instrument可以来做配置。其中ENABLED列表示是否为该instrument收集事件,TIMED列表示是否为该instrument计时;如果TIMED列的值被关闭,就不会去为对应的事件生成TIMER_STARTTIMER_END, 以及 TIMER_WAIT的值

事件的事件被转换为纳秒来统计,不管是使用哪种timer;这主要是为了使用一个统一的时间单位。

2.3 setup_consumers表 列出了事件信息的消费者类型

mysql> SELECT * FROM setup_consumers;

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

| NAME                           | ENABLED |

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

| events_stages_current          | YES     |

| events_stages_history          | YES     |

| events_stages_history_long     | YES     |

| events_statements_current      | YES     |

| events_statements_history      | YES     |

| events_statements_history_long | YES     |

| events_waits_current           | YES     |

| events_waits_history           | YES     |

| events_waits_history_long      | YES     |

| global_instrumentation         | YES     |

| thread_instrumentation         | YES     |

| statements_digest              | YES     |

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

12 rows in set (0.00 sec) 

如果你不关注某个consumer,可以关闭掉,这样服务器就不会去花费时间来维护。例如,如果你不想使用历史事件统计,就可以把几个history事件关闭。主要包括以下几种consumer:

Global and Thread Consumers

a.global_instrumentation是最高层次的consumer,如果将其设置为NO,就会关闭全局instrumentation,其他的consumer都会被忽略掉,不管他们被设置成YSE或者NO。 当global_instrumentation被设置为YES时,就会去维护全局状态,同样也会去检查thread_instrumentation

如果只打开了global_instrumentation而关闭其他consumer,维护的全局状态表包括:

b.只有global_instrumentation为YES时才会去检查thread_instrumentation。 如果thread_instrumentation为NO,他会禁止线程级别或者独立事件收集信息。如果设置为YES,则会维护线程级别的信息,同时也会检查 events_xxx_current consumer 

线程级别的信息所对应的表包括:

events_waits_summary_by_thread_by_event_name

Statement Digest Consumer

需要将global_instrumentation设置为YES,否则statements_digest会被忽略掉。它不依赖于 Statement Event consumer,这意味着你可以在每个digest中获得统计信息而无需在 events_statements_current中收集信息,这有利于减少开销


Wait Event Consumers

这些consumer需要global_instrumentation和thread_instrumentation同时设置为YES.包括以下几个:

a.events_waits_current,如果设置为NO,则不为 events_waits_current表收集独立的等待事件。如果为YES,就会开启 events_waits_current表的信息收集,同时检查events_waits_history和events_waits_history_long这两个consumer。

b.events_waits_history,前提是打开events_waits_current,该consumer用于控制表events_waits_history中是否收集信息。

c.events_waits_history_long,前提是打开events_waits_current,该consumer用于控制表events_waits_history_long中是否收集信息。


Stage Event Consumers

这些consumer需要global_instrumentation和thread_instrumentation同时设置为YES.包括以下几个: 

层次关系和Wait Event Consumer类似

events_stages_current , 对应 events_stages_current

events_stages_history, 对应events_stages_history

events_stages_history_long,对应events_stages_history_long 

Statement Event Consumers

events_statements_current,对应events_statements_current

events_statements_history, 对应events_statements_history

events_statements_history_long,对应events_statements_history_long 

综上,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决定是否去检查低级别的consumer

2.4.setup_objects

setup_objects用于决定哪些对象可以被监控,当前只能控制表对象,该表默认最大可以插入100行记录,但可以通过参数performance_schema_setup_objects_size来调整其大小 

默认状态下,该表的数据包括:

mysql> 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   |

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

默认情况下,监控的表对象排除mysql/PS/IS库下的表,其中IS库下的表,不管是否开启,都不会去监控。PS会根据 setup_objects 和setup_instruments来决定是否开启一个instrument并为其计时。对于在setup_objects中的表对象,必须在两个表中都ENABLED才会收集事件信息,如果需要计时,则两者的TIEMD列都必须为YES。

2.5.setup_actors

setup_actors 用于决定新的前台线程的初始监控状态,默认情况下包括所有用户:

mysql> select * from  setup_actors;

+——+——+——+

| HOST | USER | ROLE |

+——+——+——+

| %    | %    | %    |

+——+——+——+

1 row in set (0.00 sec)


该表中的记录可以决定需要对哪些用户线程进行监控,在threads 表中记录了所有的前台/后台线程状态(有点跟PROCESSLIST表类似),并记录其是否被监控。为了让threads生效,需要打开 setup_consumers表中的thread_instrumentation。

时间: 2024-09-14 03:06:54

[MySQL 5.6] Performance Schema 之 PS配置项(1)的相关文章

[MySQL 5.6] Performance Schema 表类型纵览 (3)

前面已经提到过了部分Performance Schema表,这里再总结下,PS库下主要分为几类表 1.SETUP table配置表 文档点击,上一篇博客已经介绍过,这里不再展开描述 2.CURRENT EVENT table 最近的事件表,例如 events_waits_current包含每个线程最近的事件 2.1.events_waits_current 该表列出了当前线程正在等待的事件,主要包括以下几列: THREAD_ID:线程ID EVENT_ID:当前线程的事件ID,和THREAD_I

[MySQL 5.6 ] Performance Schema学习:命名规范、状态变量及其他(2)

PS Instrument命名规范   PS instrument的命名类似于树形结构,最高层次的是instrument的类型,总共四种:idle/wait/stage/statement;再下一层的命名可能是一个子模块名(例如sync,io)等,再往下一层,例如sync,又可以划分成mutex/cond/rwlock,之后也许就是具体的某个同步锁对象,或者下一层的模块. 1.1.idle: idle对象表示socket空闲信息,在setup_instrument表里只包含一列,名字就是idle

MySQL5.7新增Performance Schema表

在前面有几篇博客我们已经介绍过MySQL5.6的Performance Schema,详细可点击博客1,博客2,博客3.在MySQL5.6里这些PS表已经包含了足够丰富的信息,帮助我们来分析MySQL的内部运行状态:另外由MySQL官方开发人员写的ps_helper是一组相当好用的ps配套工具,就算对Performance Schema不熟悉的同学,也能读懂其中的信息,感兴趣的同学可以自行谷歌下载. 当然本文的重点不在Performance Schema的使用上,主要是记录下MySQL5.7里新

MySQL 5.7 SYS SCHEMA

 MySQL 5.7 SYS SCHEMA 官方地址:https://dev.mysql.com/doc/refman/5.7/en/sys-schema.html 1.performance schema:介绍 在MySQL5.7中,performance schema有很大改进,包括引入大量新加入的监控项.降低占用空间和负载,以及通过新的sys schema机制显著提升易用性.在监控方面,performance schema有如下功能: ①:元数据锁: 对于了解会话之间元数据锁的依赖关系至关

高性能的MySQL(4)Schema设计

一.设计中的陷阱 1.太多的列 MySQL的存储引擎API工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码为各个列.这是一个代价很高的操作,转换的代价依赖于列的数量,列太多的话,转换代价就会很高. 2.太多的关联 一个粗略的经验法则,如果希望查询和并发行好,单个查询不要超过10个表的关联. 3.过度的枚举 修改一个枚举列的值时,需要alter table的阻塞操作,代价很高. 4.避免不可能的值 CREATE TABLE date_test( dt DAT

mysql profile及其对应表使用

--mysql的profile可用于查看一个sql的具体消耗 show profile all for query 1\G; --profiling has a default value of 0 (OFF) mysql> SELECT @@profiling; +-------------+ | @@profiling | +-------------+ | 0 | +-------------+ mysql> SET profiling = 1; --profile 的查询id可能通过如

MySQL5.6 Performance_schema 深入浅出

目录结构 22.1 performance Schema 快速入门 22.2 Performance Schema 配置 22.2.1 mysql编译的时候 修改Performance Schema配置 22.2.2 mysql启动的时候 修改Performance Schema配置 22.2.3 mysql运行过程中 修改Performance Schema配置 22.3 Performance Schema 查询 22.4 Performance Schema Instrument Nami

Percona Live 2016 PPT整理

前言 PS1: 写在前面:最近比较忙,这篇参会总结一直拖到现在才完成,主要大概把感兴趣的slide按照不同的公司做了个分门别类,方便自己有空再深入的学习阅读. PS2: 有极个别PPT的链接挂了,过一段时间再刷刷看 一年一度的Percona Live会议如期在美国Santa Clara会展中心举行,这里聚集了最全面的MySQL社区最前沿的Topic,大量MySQL社区的大神参与该会议.与往年不同,本年度的Percona Live会议全名为"Percona Live Data Performanc

网易这样用sys schema优雅提升MySQL易用性

本文详细地介绍了MySQL 5.7新引入的sys schema.首先,本文概要地介绍了sys schema的作用和定位:其次,分别介绍了sys schema中的视图.函数和存储过程:接下来,通过两个例子来演示sys schema的用法,便于大家理解sys schema带来的实实在在的好处:最后讨论了sys schema还可以增加的内容.   1sys schema的介绍   sys schema是MySQL 5.7.7中引入的一个系统库,包含了一系列视图.函数和存储过程, 该项目专注于MySQL