mysql性能优化等待事件

1.物理实体关系图

mysql性能优化等待事件

 

2.统计表层级

mysql性能优化等待事件

3.Performance_schema系统信息统计表

1.performance_timers表

mysql性能优化等待事件

TIMER_NAME: 计数器的名称,为NULL表示平台不支持,在SETUP_TIMERS表中可使用PERFORMANCE_TIMERS表字段不为NULL的计时器

TIMER_FREQUENCY: 表示每秒对应的计数器单位的数量

TIMER_RESOLUTION: 计时器的精度,表示每个计时器被调用时额外增加的值

TIMER_OVERHEAD:  使用计时器获取事件的开销最小周期值

 

 

2.setup_timers表

mysql性能优化等待事件

 

NAME: 计时器类型,对应事件类别

TIMER_NAME:  计时器类型名称,对应PERFORMANCE_TIMERS表的TIMER_NAME,即主表的这个字段不为NULL,即可在外键表上面使用,这个字段在此表上面可以修改,并且可以立即影响监控信息

3.setup_consumers表

mysql性能优化等待事件

NAME:  consumers的名称

ENABLED: 是否启用consumers

mysql性能优化等待事件

 

4.setup_instruments表

mysql性能优化等待事件

NAME: instruments名称

ENABLED: 是否启用instruments

TIMED: 是否收集时间信息

mysql性能优化等待事件

Idle: socket空闲的时间

Stage: 语句的每个执行阶段的统计

Statement: 统计语句维度的信息

Wait: 统计各种等待事件,比如IOmutuxspin_lock,condition

每类的instrument数目,idle包含1memory包含376个,stage包含129个,statement包含193个,transaction包含1个,wait包含321

每类的数目随着mysql版本的更新会不断变化

 

5.setup_objects表

mysql性能优化等待事件

默认mysqlperformance_schemainformation_schema系统schema下的表和其他对象不在监控范围,其他数据库表是监控的

6.setup_actors表

mysql性能优化等待事件

Setup_actors表配置是否为新的前台server线程启动监视和历史事件日志记录

表存储行数受限于performance_schema_setup_actors_size系统变量的限制

HOST: IP主机名或者DNS解析,%代表可以接受任何远程访问过来的主机

USER: 代表用户信息,%接收任何合法的用户客户端连接

ROLE: 5.7版本不支持,8.0以后使用

ENABLED: 是否启用对于前面HOST,USER,ROLE组合的客户端线程的监控YES OR NO

 

 

 

 

 

 

 7.threads表

mysql性能优化等待事件

监控server线程都会生成一行相关信息

4.Mysql性能问题-等待事件

Performance_schema配置表启用等待事件信息

 

启用等待事件setup_instruments

update setup_instruments set enabled='yes',timed='yes' where name like 'wait/%';

mysql性能优化等待事件

查看等待事件setup_instruments

select * from setup_instruments where name like 'wait/%';

mysql性能优化等待事件

启用等待事件setup_consumers

update setup_consumers set enabled='yes' where name like '%wait%';

查看等待事件setup_consumers

select * from setup_consumers where name like '%wait%';

mysql性能优化等待事件

安装sysbench软件包

./sysbench --test=oltp --db-driver=mysql --mysql-table-engine=innodb --mysql-host=10.20.7.243 --mysql-port=3306 --mysql-user=root --mysql-password=xxxxxx --mysql-db=bytontest --test=tests/db/oltp.lua --oltp_tables_count=20 --oltp-table-size=1000000 --num-threads=16 --max-requests=0 --report-interval=1 --rand-init=on prepare

 

mysql性能优化等待事件

./sysbench --test=oltp --db-driver=mysql --mysql-table-engine=innodb --mysql-host=10.20.7.243 --mysql-port=3306 --mysql-user=root --mysql-password=xxxxxx --mysql-db=bytontest --test=tests/db/oltp.lua --oltp_tables_count=20 --oltp-table-size=1000000 --num-threads=16 --max-requests=0 --report-interval=1 --rand-init=on run

mysql性能优化等待事件

mysql性能优化等待事件

 

Sysbench压力测试结果

mysql性能优化等待事件

16个并发线程的oltp压力,TPS200-300之间,延迟时间在100ms以上,说明cpu未完全使用

 

OLTP test statistics:

    queries performed:

        read:                            421372//select数量

        write:                           120392//updateinsertdelete语句数量

        other:                           60196//commitunlock tables以及其他mutex的数量

        total:                           601960

    transactions:                        30098  (501.40 per sec.) //通常需要关注的数字(TPS)

    read/write requests:                 541764 (9025.25 per sec.)//读写需求

    other operations:                    60196  (1002.81 per sec.)

    ignored errors:                      0      (0.00 per sec.) //忽略的错误数

    reconnects:                          0      (0.00 per sec.)//重新连接数

 

General statistics:

    total time:                          60.0276s//max-time指定的压测实际

    total number of events:              30098285932 //总的事件数,一般与transactions相同

    total time taken by event execution: 960.3598s

    response time:

         min:                                  4.92ms

         avg:                                 31.91ms//95%的语句的平均响应时间

         max:                                146.16ms

         approx.  95 percentile:              72.01ms

 

Threads fairness:

    events (avg/stddev):           1881.1250/6.34//事件的平均数和方差

    execution time (avg/stddev):   60.0225/0.00

Top命令查看cpu空闲百分比

mysql性能优化等待事件

Iostat

mysql性能优化等待事件

可以看到只有sda分区tps2000-3000左右,iowait等待为15%左右,cpu空闲为50%,说明cpu目前还不是主要性能问题

 

 

创建系统视图

use sys;

CREATE VIEW sys.test_waits AS SELECT

sum( timer_wait ) AS timer_wait,

sum( number_of_bytes ) AS number_of_bytes,

event_name,

operation

FROM

               performance_schema.events_waits_current

WHERE

               event_name != 'idle'

GROUP BY

               event_name,

               operation;

              

分组按照事件类型查询              

SELECT

               sys.format_time ( timer_wait ),

               sys.format_bytes ( number_of_bytes ),

               event_name,

               operation

FROM

               sys.test_waits

WHERE

               sys.format_time ( timer_wait ) NOT REGEXP 'ns | us'

ORDER BY

               timer_wait DESC;

mysql性能优化等待事件

根据分组排序

前两个和表的IO有关等待事件也是最长的,使用sysbench测试对表的查询和修改最多

第三个是innodb数据库引擎的操作系统文件io等待事件

剩下的大部分和锁有关,主要是mutex

 

SELECT

               thread_id,

               event_name,

               sys.format_time ( timer_wait ),

               index_name,

               nesting_event_type,

               operation,

               number_of_bytes

FROM

               performance_schema.events_waits_current

WHERE

               event_name !='idle'

ORDER BY

               timer_wait DESC;

mysql性能优化等待事件

mysql性能优化等待事件

有条件可以把数据库文件,redobinlog,等文件分开放在不同的分区下,防止数据库随机io和顺序io资源争用导致的阻塞