前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL写性能监控及调优

MySQL写性能监控及调优

作者头像
MySQL数据库技术栈
发布2022-05-25 14:41:14
8150
发布2022-05-25 14:41:14
举报

磁盘性能对数据库的读写能力影响很大,如何从多个角度监控数据库的写性能就变得至关重要,当写性能成为瓶颈时我们又该如何调优呢?

一、写压力性能监控

1、OS层监控:

代码语言:javascript
复制
[root@localhost ~]# iostat -x
Linux 4.18.0-193.el8.x86_64 (localhost.localdomain)     05/13/22        _x86_64_        (2 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          30.91    0.00   19.45    0.78    0.00   48.85
Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
nvme0n1        173.29   42.89   5431.13    677.45     0.03     3.81   0.02   8.15    0.46    0.55   0.03    31.34    15.79   0.48  10.30
scd0             0.44    0.00     16.78      0.00     0.00     0.00   0.00   0.00    0.44    0.00   0.00    38.52     0.00   0.48   0.02

主要关注以下几个指标:

1.iowait:io等待情况,iowait很高的话说明cpu花太多的时间在io等待上,说明系统的IO成瓶颈了,iowait一般希望小于5,大于25一般就需要进行分析查看了。

2.r/s和w/s:每秒的读和写,即IOPS。

3.%util:繁忙度,周期内用于IO操作的时间比例,如果IO不高,但是繁忙度高,就说明磁盘有问题了。

2、DB层面监控

1.数据库挂起监控 建议采集成趋势,当挂起状态值大于0且持续增加时做告警处理。

代码语言:javascript
复制
mysql> show global status like '%pend%';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| Innodb_data_pending_fsyncs | 0 | #被挂起的fsync
| Innodb_data_pending_reads | 0 | #被挂起的物理读
| Innodb_data_pending_writes | 0 | #被挂起的写
| Innodb_os_log_pending_fsyncs | 0 | #被挂起的日志fsync
| Innodb_os_log_pending_writes | 0 | #被挂起的日志写
+------------------------------+-------+
5 rows in set (0.01 sec)

2.写性能监控

代码语言:javascript
复制
mysql> show global status like '%Innodb_buffer_pool_wait_free%';
mysql> show global status like '%Innodb_log_waits%';

重点指标关注:

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、刷新脏页的频率

代码语言:javascript
复制
mysql> show variables like '%innodb_lru_scan_depth%';
#默认1024,遍历lru list刷新脏页,值越大,说明刷脏页频率越高。

2、磁盘io能力

代码语言:javascript
复制
mysql> show variables like '%io_c%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| innodb_io_capacity | 200 |
| innodb_io_capacity_max | 2000 |
+------------------------+-------+
2 rows in set (0.00 sec)
#根据磁盘io能力进行调整,值越大,每次刷脏页的量越大。

3、redolog的刷新机制

代码语言:javascript
复制
mysql> show variables like '%innodb_flush_log_at_trx_commit%';

默认MySQL的刷盘策略是1,最安全的,但是安全的同时,自然也就会带来一定的性能压力。

关于redolog的刷盘策略如下:

0:当提交事务时,并不将事务的redo log写入logfile中,而是等待master thread每秒的刷新redo log,数据库崩溃丢失数据,丢一秒钟的事务。

1:执行commit时将redo log同步写到磁盘logfile中,同时做刷盘动作,保证不丢失事务。

2:在每个提交,日志缓冲被写到文件系统缓存,但不做磁盘的刷新,数据库宕机而操作系统及服务器并没有宕机时,可以保证数据不丢失,但是文件系统崩溃会丢失数据。

4、内存脏页占比控制

代码语言:javascript
复制
mysql> show variables like '%innodb_max_dirty_pages_pct%';
#在内存buffer pool空间允许的范围下,可以调大脏页允许在内存空间的占比,降低写压力。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL数据库技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档