MYSQL数据库服务磁盘IO高问题分析与优化


压力测试过程中,如果因为资源使用瓶颈等问题引发最直接性能问题是业务交易响应时间偏大,TPS逐渐降低等。而问题定位分析通常情况下,最优先排查的是监控服务器资源利用率,例如先用TOP 或者nmon等查看CPU、内存使用情况,然后在排查IO问题,例如网络IO、磁盘IO的问题。 如果是磁盘IO问题,一般问题是SQL语法问题、MYSQL参数配置问题、服务器自身硬件瓶颈导致IOPS吞吐率问题。

今天主要是讲解MYSQL 参数配置不合理导致在高并发下磁盘IO问题,而MYSQL整体监控优化方案后面会整理《如何轻量化MYSQL服务性能监控》文章出来。

1、 打开日志跟踪引起的磁盘IO问题
例如:MySQL的日志包括错误日志(ErrorLog),更新日志(UpdateLog),二进制日志(Binlog),查询日志(QueryLog),慢查询日志(SlowQueryLog)等,正常情况下,在生产系统或者压力测试环境中很少有系统会时时打开查询日志。因为查询日志打开之后会将MySQL中执行的每一条Query都记录到日志中,会该系统带来比较大的IO负担,而带来的实际效益却并不是非常大.

2、 SQL写法问题引起磁盘IO高
例如:曾经在做某一个项目时,在看到数据库磁盘IO使用率偏高,前端查询业务交易loadrunner显示事物响应时间偏长,通过监控工具抓取对应SQL,通过计划分析,发现该SQL 中使用distinct 又多表关联且是大表、然后使用order by,最终显示10笔数据,而在产生中间过程数据进行筛选时,使用的是临时表,并把数据放入临时表中,内存刚好设置不大,于是放到磁盘中导致IO偏高。
备注:MySQL在执行SQL查询时可能会用到临时表,临时表存储,MySQL会先创建内存临时表,但内存临时表超过配置指定的值后,MySQL会将内存临时表导出到磁盘临时表;

3、 MYSQL参数配置问题
MYSQL默认配置性能低下,只能通过并发下尝试调整参数配置来逐步优化数据库性能,2017年底根据公司要求配合帮助某一家银行业务系统做性能测试,因为测试环境硬件资源有限,我跟公司申请了几台过时的笔记本,然后根据生产环境软件版本等配置要求,进行模拟搭建性能测试环境,基础软件包含:MYSQL5.6 、centos7.2、tomcat7、 JDK1.7、redis。使用的是联想L421 笔记本当MYSQL数据库服务器、L440当tomcat应用服务器,压力测试工具loadrunner、并发用户100,压力测试业务场景:用户登录退出、相关票据信息查询、电子汇票交易流程等,在压力测试过程中发现部分交易在50用户并发时,数据库磁盘I0使用率都偏高,特别是写操作一直很高,例如测试登录退出交易,经监控数据库磁盘IO率一直偏高,如下案例分析讲解:

优化前

压力测试时,数据库磁盘IO使用率大于75%,响应时间1.6秒,通过NMON监控到的数据库资源使用情况,如下图一与图二:
图一:
1.png
图二
2.png

优化后

数据库服务器资源使用率:
图三
3.png
图四
4.png

优化内容

通过优化innndb等影响IO、内存的一些参数后,性能问题明显解决,优化参数内容,例如:innodb_write_io_threads、 innodb_read_io_threads、
innodb_flush_log_at_trx_commi等InnoDB 引擎优化IO 子系统参数配置若干。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 对于MySQL磁盘IO问题,可以尝试以下几种方法来解决:1.优化SQL语句,减少查询时间;2.增加MySQL缓存,提升系统性能;3.更换更快的硬盘,提磁盘IO速度;4.调整MySQL参数,显著提升系统性能;5.使用读写分离,把读写操作分离出来;6.使用可靠的集群系统,提系统的扩展性和可用性;7.使用SSD来加速磁盘的读取和写入速度。 ### 回答2: MySQL磁盘IO问题主要是由于大量的磁盘读写操作导致的。以下是解决MySQL磁盘IO的几种方法: 1. 优化查询语句:检查和优化查询语句,尽量减少不必要的磁盘读取。可以使用索引,避免全表扫描,以提查询效率。 2. 调整MySQL缓存:增大MySQL的缓冲区以减少对磁盘的读写操作。可以适当调整参数innodb_buffer_pool_size和key_buffer_size。 3. 分散磁盘IO请求:将数据、日志和临时表等分别存储在不同的物理磁盘上,以减少磁盘IO的竞争。 4. 增加内存:提升系统的物理内存,增加系统缓存,减少对磁盘的读写操作。 5. 使用SSD硬盘:使用SSD(固态硬盘)替换传统的机械硬盘,SSD硬盘具有更的读写速度,能够显著提升磁盘IO性能。 6. 合理分区:对大表进行分区,将数据分散存储在多个分区上,减轻单个分区的IO负载。 7. 减少不必要的索引:评估并删除不再使用的索引,避免更新索引时的额外IO开销。 8. 使用缓存技术:可以考虑使用缓存技术,如Redis,将频繁读取的数据缓存到内存中,减少磁盘IO操作。 以上是解决MySQL磁盘IO的一些方法,具体措施可以根据实际情况进行调整,以达到减少磁盘IO的目的。同时,也可以通过监控工具不断优化,以保持系统的性能和稳定性。 ### 回答3: MySQL磁盘I/O的情况可能是由于以下几个原因导致的:缓存不足、查询语句不优化磁盘性能低等。 首先,可以尝试优化数据库的缓存设置。MySQL有一个用于缓存数据和索引的缓冲池(InnoDB缓冲池)。可以通过增加缓冲池的大小来减少对磁盘的访问次数,提系统性能。 其次,需要优化查询语句,避免不必要的全表扫描和重复查询。可以使用索引来加快查询速度,同时避免在查询语句中使用大量的JOIN和子查询等操作,优化查询逻辑。 此外,可以考虑使用更速的磁盘设备。当磁盘性能较低时,可以通过升级为更速的磁盘设备或使用RAID等技术来提升磁盘性能,减少I/O等待时间。 另外,还可以使用MySQL的分区表功能来将大表拆分成较小的分区,减少单个分区上的磁盘访问压力,提磁盘IO性能。 最后,可以通过调整MySQL的参数来优化磁盘I/O性能。例如,可以调整innodb_flush_method参数来控制MySQL数据的写入方式,选择适合的方式来提磁盘I/O性能。 需要根据具体情况分析和综合考虑以上解决方案,并逐步尝试和优化,以降低MySQL磁盘I/O的负载,提系统性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值