zoukankan      html  css  js  c++  java
  • PERFORMANCE_SCHEMA 详解

    http://keithlan.github.io/2015/07/17/22_performance_schema/

    http://www.markleith.co.uk/

    http://www.cnblogs.com/cchust/p/5022148.html?utm_source=tuicool&utm_medium=referral

    MYSQL 是否支持 PERFORMANCE_SCHEMA 引擎

    mysql> SELECT * FROM INFORMATION_SCHEMA.ENGINES ;
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | ENGINE             | SUPPORT | COMMENT                                                        | TRANSACTIONS | XA   | SAVEPOINTS |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
    | CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
    | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
    | MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
    | ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
    | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
    | FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    9 rows in set (0.00 sec)

    mysql服务器起用 performance_schema

    my.cnf文件中
    [mysqld]
    performance_schema=ON
    mysql> SHOW VARIABLES LIKE 'performance_schema';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | performance_schema | ON    |
    +--------------------+-------+
    1 row in set (0.11 sec)
    Performance Schema Instrument命名规则

    最上层的instrument    组件

    • idle
    • stage
    • statement
    • wait
    
    
    idle instrument      组件
    
    idle event描述来自:socket_instances.STATE 列: Section 22.9.3.5, “The socket_instances Table”.
    stage instrument     组件
    组成形式: stage
    /code_area/stage_name , code_area 一般是sql or myisam。 stage name 一般来自: SHOW PROCESSLIST,如:Sorting result ,Sending data
    Statement instrument 组件
    
    statement/abstract/* : 一般都是早期的stage,在抽象sql都还没来得及解析的时候。
    statement/com: SQL 命令操作 如:statement/com/Connect
    statement/sql: SQL语句操作 如:statement/sql/create_db
    Wait Instrument      组件
    
    wait/io       : IO 等待事件
    wait/io/file  : 文件IO等待事件。等待文件操作完成的时间如:fwrite().但是物理IO有可能因为缓存的原因调用fwrite时不会写磁盘。
    wait/io/socket: socket相关的IO等待
    wait/io/table : 表相关的IO等待。一般对于记录rows来说有fetch,insertupdate,delete四种操作。
                     不像其他等待事件,table I/O 还包含了其他的等待事件。
    比如:table io可能包含了文件IO和内存IO。因为读取table rows的时候,有可能会去从文件读取数据。 * wait/lock: * wait/lock/table : 表操作的锁等待事件 * wait/synch: * wait/synch/cond :condition就是线程与线程之间的信号。 * wait/synch/mutex : mutex主要用来锁住一块共享资源。 * wait/synch/rwlock : 读写锁
    收集所有的事件:
    instrument 和 consumer 都会被enable , 所以一开始他们不会收集所有的事件。
    为了让他们都enable 或者 enable event timing。

    执行以下两条语句:
    mysql> UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES'; Query OK, 338 rows affected (0.12 sec)
    mysql
    > UPDATE setup_consumers SET ENABLED = 'YES'; Query OK, 8 rows affected (0.00 sec)

    events_waits_history & events_waits_history_long 记录了每个thread最近10条和10000条event。

    SELECT
    EVENT_ID, EVENT_NAME, TIMER_WAIT FROM events_waits_history WHERE THREAD_ID =21 ORDER BY EVENT_ID;
    summary 表提供了整个时间段的一些统计信息。他们统计事件的处理方式和之前都不一样。
    如果想知道某个instrument 被执行的最频繁,或者发生的频率非常高,
    可以通过排序 events_waits_summary_global_by_event_name表,根据 COUNT_STAR 或者 SUM_TIMER_WAIT列。



    mysql> SELECT EVENT_NAME, COUNT_STAR FROM events_waits_summary_global_by_event_name ORDER BY COUNT_STAR DESC LIMIT 10; +--------------------------------------+------------+ | EVENT_NAME | COUNT_STAR | +--------------------------------------+------------+ | wait/io/file/sql/FRM | 1682 | | wait/io/file/innodb/innodb_data_file | 596 | | idle | 204 | | wait/io/file/sql/binlog | 170 | | wait/io/file/myisam/kfile | 110 | | wait/io/file/myisam/dfile | 90 | | wait/io/file/sql/binlog_index | 47 | | wait/io/file/innodb/innodb_log_file | 18 | | wait/io/file/sql/dbopt | 14 | | wait/io/file/sql/casetest | 10 | +--------------------------------------+------------+ 10 rows in set (0.31 sec)
    mysql> SELECT EVENT_NAME, SUM_TIMER_WAIT FROM events_waits_summary_global_by_event_name ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
    +--------------------------------------+-------------------+
    | EVENT_NAME                           | SUM_TIMER_WAIT    |
    +--------------------------------------+-------------------+
    | idle                                 | 20173041031000000 |
    | wait/io/file/innodb/innodb_data_file |      666638377892 |
    | wait/io/file/sql/dbopt               |      177140672226 |
    | wait/io/file/sql/FRM                 |       91152018924 |
    | wait/io/file/sql/binlog              |       43352476474 |
    | wait/io/file/innodb/innodb_log_file  |       35962857780 |
    | wait/io/file/sql/binlog_index        |       20679496964 |
    | wait/io/file/myisam/kfile            |       16840088732 |
    | wait/io/file/sql/ERRMSG              |        8064330196 |
    | wait/io/file/myisam/dfile            |        4785274304 |
    +--------------------------------------+-------------------+
    10 rows in set (0.03 sec)
    setup表用来配置和显示监控信息的。 例如:什么样的timer 被使用,
    请查询setup_timers

    mysql> SELECT * FROM setup_timers; +-----------+-------------+ | NAME | TIMER_NAME | +-----------+-------------+ | idle | MICROSECOND | | wait | CYCLE | | stage | NANOSECOND | | statement | NANOSECOND | +-----------+-------------+ 4 rows in set (0.00 sec)

    setup_instruments 列出了哪些event会被收集与监控:

    mysql> SELECT * FROM setup_instruments limit 10; +-------------------------------------------------------+---------+-------+ | NAME | ENABLED | TIMED | +-------------------------------------------------------+---------+-------+ | wait/synch/mutex/sql/PAGE::lock | YES | YES | | wait/synch/mutex/sql/TC_LOG_MMAP::LOCK_sync | YES | YES | | wait/synch/mutex/sql/TC_LOG_MMAP::LOCK_active | YES | YES | | wait/synch/mutex/sql/TC_LOG_MMAP::LOCK_pool | YES | YES | | wait/synch/mutex/sql/LOCK_des_key_file | YES | YES | | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_commit | YES | YES | | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_commit_queue | YES | YES | | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_done | YES | YES | | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_flush_queue | YES | YES | | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_index | YES | YES | +-------------------------------------------------------+---------+-------+ 10 rows in set (0.00 sec)
    哪些event是不是instrument,可以给enabled设置yes or no

    mysql> UPDATE setup_instruments SET ENABLED = 'NO' WHERE NAME = 'wait/synch/mutex/sql/LOCK_mysql_create_db'; Query OK, 0 rows affected (0.01 sec) Rows matched: 0 Changed: 0 Warnings: 0

    消费者:接收EVENTS 的表

    performance schema 使用收集的events 来更新performance_schema 数据库的那些表,这些表扮演着事件信息消费者的角色。
    setup_consumers 列出了可用的消费者 以及哪些是enabled.

    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 |

    http://www.javacoder.cn/?p=332

    MySQL在5.6版本中包含了一个强大的特性——performance-schema

    合理的使用这个数据库中的表,能为我们解决一些瓶颈问题提供帮助,但是在我使用的5.6.21版本中,已经包含了52张表,后续还有可能会持续增加,所以搞清楚各个表之间的关系很重要。

    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.01 sec)


    1)setup_instruments [测量仪器]
    使用performance-schema诊断问题的过程类似于医生给病人看病的过程。"setup_instruments"犹如医生能够使用的测量仪器(比如温度计,CT,X光等),在MySQL的官方文档中,使用“instrument”一词来表示,这应该也是这个表的名称的来源。这个表的每一行代表一个"instrument","instrument"在MySQL的源码中表示为一段为了测量相应指标的代码。这张表的三个字段分别为“name enabled timed”,enabled表示是否启用该"instrument", "timed"表示是否对其进行定量的耗时分析。

    mysql> SELECT * FROM setup_instruments limit 10;
    +-------------------------------------------------------+---------+-------+
    | NAME                                                  | ENABLED | TIMED |
    +-------------------------------------------------------+---------+-------+
    | wait/synch/mutex/sql/PAGE::lock                       | YES     | YES   |
    | wait/synch/mutex/sql/TC_LOG_MMAP::LOCK_sync           | YES     | YES   |
    | wait/synch/mutex/sql/TC_LOG_MMAP::LOCK_active         | YES     | YES   |
    | wait/synch/mutex/sql/TC_LOG_MMAP::LOCK_pool           | YES     | YES   |
    | wait/synch/mutex/sql/LOCK_des_key_file                | YES     | YES   |
    | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_commit       | YES     | YES   |
    | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_commit_queue | YES     | YES   |
    | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_done         | YES     | YES   |
    | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_flush_queue  | YES     | YES   |
    | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_index        | YES     | YES   |
    +-------------------------------------------------------+---------+-------+
    10 rows in set (0.01 sec)


    2)setup_objects
    setup_objects类似某类病人(精神病,男科,妇科等),在MySQL中指table, 表示哪些表需要“instrument”,该表的默认值为:

    mysql> SELECT * FROM setup_objects limit 10;                 
    +-------------+--------------------+-------------+---------+-------+
    | 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   |
    +-------------+--------------------+-------------+---------+-------+
    4 rows in set (0.00 sec)

    表示出了系统表“mysql performance_schema information_schema”外,都需要对其进行“instrument”操作。


    3)threads
    "threads“类似于某个病人,在MySQL中的某个线程,这个表有一个非常重要的字段”INSTRUMENTED“,表示是否需要对该线程进行”instrument“,这个字段由”setup_actors“表中的内容决定。setup_actors的默认内容如下

    mysql> SELECT THREAD_ID,NAME,TYPE,INSTRUMENTED,role FROM threads limit 10;
    +-----------+---------------------------------+------------+--------------+------+
    | THREAD_ID | NAME                            | TYPE       | INSTRUMENTED | role |
    +-----------+---------------------------------+------------+--------------+------+
    |         1 | thread/sql/main                 | BACKGROUND | YES          | NULL |
    |         2 | thread/innodb/io_handler_thread | BACKGROUND | YES          | NULL |
    |         3 | thread/innodb/io_handler_thread | BACKGROUND | YES          | NULL |
    |         4 | thread/innodb/io_handler_thread | BACKGROUND | YES          | NULL |
    |         5 | thread/innodb/io_handler_thread | BACKGROUND | YES          | NULL |
    |         6 | thread/innodb/io_handler_thread | BACKGROUND | YES          | NULL |
    |         7 | thread/innodb/io_handler_thread | BACKGROUND | YES          | NULL |
    |         8 | thread/innodb/io_handler_thread | BACKGROUND | YES          | NULL |
    |        11 | thread/innodb/io_handler_thread | BACKGROUND | YES          | NULL |
    |         9 | thread/innodb/io_handler_thread | BACKGROUND | YES          | NULL |
    +-----------+---------------------------------+------------+--------------+------+
    10 rows in set (0.01 sec)


    线程分前台线程和后台线程,后台线程指MySQL为了完成任务二自己开启的线程,这样的线程的setup_objects.INSTRUMENTED字段默认为true。

    前台线程值用户操作而开启的线程。这时如果当前用户匹配setup_actors中的某个记录,那么setup_objects.INSTRUMENTED=true.
    threads表的另一个功能是可以代替"show processlist"指令和"information_schema.processlist"表的功能,其不用获取同步的mutex对象,不会又那么重的额外消耗(overhead).

    4)setup_consumers
    setup_consumers表类似于各种诊断报告是否需要记录的配置,这个表的默认配置为:select * from 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)

     5)setup_actors

    mysql> select * from setup_actors  ;
    +------+------+------+
    | HOST | USER | ROLE |
    +------+------+------+
    | %    | %    | %    |
    +------+------+------+
    1 row in set (0.16 sec)

    6)setup_timers

    mysql> select * from  setup_timers ;
    +-----------+-------------+
    | NAME      | TIMER_NAME  |
    +-----------+-------------+
    | idle      | MICROSECOND |
    | wait      | CYCLE       |
    | stage     | NANOSECOND  |
    | statement | NANOSECOND  |
    +-----------+-------------+
    4 rows in set (0.00 sec)

    这个表的各个记录还存在层级关系,只有当上级的配置启用时才会考虑下级的配置。
    层级关系为:
    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


    当global_instrumentation启用时,"thread_instrumentation"和"statements_digest"的配置才有可能生效。其他的配置类推。
    只有当"setup_instruments","setup_objects",”setup_consumers“和"threads"都某一项测量指标都启用时才能收集到它的信息。

    结束语

    对于”statement, stages, waits“这三类统计信息,除了setup_consumers中配置的名称,还有summary版本的统计信息(summary_by_host_by_event_name, summary_by_user_event_name, summary_global_by_event_name)等按照各个维度的统计信息,外加file_instance, mutext_instance, rwlock_instance, table_io_waits_summary_by_index_usage, table_io_waits_summary_by_table,table_lock_waits_summary_by_table,外加一些杂项信息。
    由于这些都是基础信息,网上有一个叫做ps_helper的项目,它提供了一些视图,存储过程来简化performence_schema数据库的使用,

    MySQL官方的GUI工具——MySQL Workbench就含义ps_helper的安装向导入下图,

    mysql_workbench_ps_helper_setup

    安装完后会新增一个名为"sys"的数据库,里面会包含一些视图和存储过程,具体的内容可以查看官方文档。

    一些不错的资料:
    ps_helper官方 
    MySQL Performance_Schema官网
    Using-MySQL-5.6-Performance-Schema-To-Troubleshoot-Typical-Workload-Bottlenecks.pdf

  • 相关阅读:
    初试 spring web mvc
    读取网络数据缓存在本地 流程图
    servlet 过滤器实现 请求转发(跳转);跨域转发请求;tomcat 环境下。
    C# .net基于Http实现web server(web服务)
    微信公众平台开发
    Linux目录结构及作用
    MySQL事件调度器event的使用
    MySQL触发器trigger的使用
    存储过程的查、改、删
    MySQL游标的简单实践
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5627783.html
Copyright © 2011-2022 走看看