磁盘性能对数据库的读写能力影响很大,如何从多个角度监控数据库的写性能就变得至关重要,当写性能成为瓶颈时我们又该如何调优呢?
一、写压力性能监控
1、OS层监控:
主要关注以下几个指标:
1.iowait:io等待情况,iowait很高的话说明cpu花太多的时间在io等待上,说明系统的IO成瓶颈了,iowait一般希望小于5,大于25一般就需要进行分析查看了。
2.r/s和w/s:每秒的读和写,即IOPS。
3.%util:繁忙度,周期内用于IO操作的时间比例,如果IO不高,但是繁忙度高,就说明磁盘有问题了。
2、DB层面监控
1.数据库挂起监控 建议采集成趋势,当挂起状态值大于0且持续增加时做告警处理。
2.写性能监控
重点指标关注:
1、Innodb_buffer_pool_wait_free,如果该值大于0,说明buffer pool中已经没有可用页,等待后台往回刷脏页,腾出可用数据页,这样就很影响业务了,hang住。
2、Innodb_log_waits,如果该值大于0,说明写压力很大,出现了日志等待。
3.脏页占比监控
Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total,通过该比值可以看出脏页的占比情况,如果该系统脏页占比持续增高,说明该系统是以写为主,根据情况进行调优。
二、写压力调优参数
1、刷新脏页的频率
2、磁盘io能力
3、redolog的刷新机制
默认MySQL的刷盘策略是1,最安全的,但是安全的同时,自然也就会带来一定的性能压力。
关于redolog的刷盘策略如下:
0:当提交事务时,并不将事务的redo log写入logfile中,而是等待master thread每秒的刷新redo log,数据库崩溃丢失数据,丢一秒钟的事务。
1:执行commit时将redo log同步写到磁盘logfile中,同时做刷盘动作,保证不丢失事务。
2:在每个提交,日志缓冲被写到文件系统缓存,但不做磁盘的刷新,数据库宕机而操作系统及服务器并没有宕机时,可以保证数据不丢失,但是文件系统崩溃会丢失数据。
4、内存脏页占比控制