开发者社区> zhaiwx_yinfeng> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

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

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 

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

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。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何在Ubuntu上安装Apache,MySQL,PHP,Nginx,HAProxy,以及如何在docker上安装LAMP
如何在Ubuntu上安装Apache,MySQL,PHP,Nginx,HAProxy,以及如何在docker上安装LAMP   在Ubuntu上安装LAMP: https://help.
2102 0
CentOS 7 安装MySQL
由于MySQL被Oracle收购以后,CentOS默认yum库内置的数据库由原来的MySQL改为了MariaDB。  为了安装MySQL,我们需要将MySQL官方的Repo加到CentOS的repo里面。
821 0
安装MySQL Enterprise Monitor
    MySQL Enterprise Monitor是专门为MySQL数据库而设计的一款企业级监控,能非常好地与MySQL各方面特性相结合,包括:MySQL的关键性能指标、主机、磁盘、备份、新特性相关以及各种场景下的架构配置,并支持从单节点到海量节点部署的环境。
1080 0
linux 设置代理 安装jdk mysql tomcat redis hadoop
 1.修改linux用户名和密码 前提进入root用户  原用户名 XX,改成用户名 YY         执行 usermod -l YY XX  修改用户 YY 的密码,如果你在root权限下 执行 passwd YY  useradd -d /home/usr/baoyou -m...
1256 0
多实例mysql的安装和管理
多实例mysql的安装和管理 http://blog.chinaunix.net/uid-20639775-id-3438560.html mysql的多实例有两种方式可以实现,两种方式各有利弊。第一种是使用多个配置文件启动不同的进程来实现多实例,这种方式的优势逻辑简单,配置简单,缺点是管理起来不太方便。
741 0
MySQL 5.6.21下载安装之安装篇(二)
  mysql安装   1.1 Linux之下MySQL安装的三种方案的比较 具体内容参考这篇blog: http://blog.
1134 0
linux上mysql安装与卸载
以下步骤运行环境是centos6.5   1、查找以前是否装有mysql命令:rpm -qa|grep -i mysql2、删除mysql删除命令:rpm -e --nodeps 包名3、删除老版本mysql的开发头文件和库命令:rm -rf /usr/lib/mysql4.
917 0
openwrt挂载U盘和安装python和mysql
最近在openwrt上安装python时,老出现/overlay空间不足的错误,如下图所示: 不过用命令查看时,其空间确实挺小的: 看了这篇文章之后,想到了用闪存卡来扩容。由于我的系统内部已经有了相关usb驱动模块,所以一插上闪存卡就能识别了 基本想法很简单,先格式化,再挂载,再配置opkg.conf使软件安装到其上。 格式化 挂载到/mnt/usb目录
3339 0
mysql:yum安装以及开启远程连接权限
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/41343939 前言:如果你的mysql服务需要安装在centos上,centos一般情况下都可以通过yum命令进行软件的安装。
752 0
+关注
zhaiwx_yinfeng
MySQL内核开发者, 《高性能MySQL 第三版》译者之一,活跃于MySQL社区,BugList,etc...
文章
问答
文章排行榜
最热
最新
相关电子书
更多
PostgresChina2018_张启程_为什么我们抛弃MongoDB和MySQL,选择PgSQL
立即下载
MySQL 5.7让优化更轻松
立即下载
从理论到实践,深度解析MySQL Group Replication
立即下载