【精华】SQL SERVER——磁盘问题定位与解决

时间:2024-04-06 22:10:09
磁盘问题定位基本流程:
【精华】SQL SERVER——磁盘问题定位与解决
 
 

磁盘的压力分析,主要使用下面几个性能计数器 (针对单独的物理盘,每个物理磁盘都会有一组):

  1. Avg. Disk Read Queue Length   读队列(越小越好,理想值 2 以下,队列越高说明一个操作的响应时间越长)
  2. Avg. Disk Write Queue Length  写队列(越小越好,理想值 2 以下,队列越高说明一个操作的响应时间越长)
  3. Avg. Disk sec/Read  
  4. Avg. Disk sec/Write
  5. Disk Read Bytes/sec
  6. Disk Write Bytes/sec
 
注:常规判断系统磁盘压力,通过读写队列即可判断,后面4个主要用于磁盘是否自身性能存在问题,本文不介绍。
 
 

步骤1.排除其他因素影响

    磁盘IO一般是整个数据库的瓶颈,磁盘写入速度的快慢直接影响着数据库的性能,一般推荐数据库服务器不要与其他应用共用服务器,同时也要尽量避免在数据库服务器上做大的文件处理工作。
 

步骤2.磁盘问题定位

磁盘队列计数器持续很高(Avg. Disk Read Queue Length、Avg. Disk Write Queue Length)

【精华】SQL SERVER——磁盘问题定位与解决

 

【精华】SQL SERVER——磁盘问题定位与解决

 

磁盘响应时间很长(磁盘队列很高,请求需要排队完成,所以表现为响应时间长)

【精华】SQL SERVER——磁盘问题定位与解决

 

 

磁盘队列波动

 

 

【精华】SQL SERVER——磁盘问题定位与解决

 

 

【精华】SQL SERVER——磁盘问题定位与解决


 

 

步骤3.磁盘问题分析与解决(通用步骤)

 首先有哪些情况会对磁盘造成压力?

    1. 内存不足导致需要频繁和磁盘交互  (一般为主因)
    2. 经常有大量冷数据需要从磁盘读取,或经常有大批量脏页一次写入(checkpoint触发)
    3. 磁盘读写速度,不能满足业务需要
 
 
解决磁盘问题首先请诊断内存是否存在瓶颈,参照上一篇 -----内存问题定位与解决
如果内存不存在问题,请分析语句压力,是否有不优化的语句(要查询大量数据)需要从磁盘读取。
并查看系统的文件磁盘规划:

看一下这个系统的磁盘及数据库文件分布

   【精华】SQL SERVER——磁盘问题定位与解决

 

   可以看到这个服务器只配置了一块物理磁盘

  

   数据库1

   【精华】SQL SERVER——磁盘问题定位与解决

   

数据库2

   【精华】SQL SERVER——磁盘问题定位与解决

   tempDB

   【精华】SQL SERVER——磁盘问题定位与解决

 

 2个业务频繁的大数据库,数据文件、日志文件和系统tempDB都在同一个磁盘上!这样磁盘的读写速度势必不能满足业务要求。

 
磁盘规划建议:

       规划磁盘分配的好处:假设你有两个数据库,业务操作都很繁忙,且读/写量都很大对磁盘的压力都很大,那么你自然会想到把他们分散到不同的磁盘上,这样每个库针对自己的磁盘读/写,不会互相影响且压力相当于原来的1/2,从而可以提升磁盘操作的响应时间。

   数据库磁盘该怎么划分? 不同系统不同环境可能都不相同,下面给出一些简单建议:

    1. 按照文件类型划分:数据文件、日志文件、tempDB文件、备份文件,分别放在一个物理磁盘
    2. 按照数据库划分:不同的业务数据库(压力大的)分别放在一个物理磁盘,tempDB和备份文件各一个物理磁盘。

   上面的两种分法是基本的划分方式,但是根据系统压力系统配置,均有不同情况。

   当你的数据库压力较小,或磁盘资源紧张可以做适当的合并。当你的数据库特别大,并且有多个文件组,也可以选择把文件组更进一步细分。

   类似于做了分区表,不同分区放在不同磁盘上,当需要多个分区数据时,可以利用IO并行提升效率。