zoukankan      html  css  js  c++  java
  • [转]SQL Server 性能调优(io)

     

    目录

    诊断磁盘io问题

    常见的磁盘问题

    容量替代了性能

    负载隔离配置有问题

    分区对齐配置有问题

    总结

    关于io这一块,前面的东西如磁盘大小,磁盘带宽,随机读取写入,顺序读取写入,raid选择,DAS和SAN比较都不讲了。

    直接就开始讲关于io问题的诊断和一般问题的处理。

    io这一块东西比较特殊,是数据库的重点,因为数据库一般都是io密集型产品,为了让io速度更快,那么数据库会使用内存来代替磁盘。

    io出现问题,可能会连带其他资源的问题。cpu,内存,网络。所以在分析问题的时候对数据库结构的了解是必不可少的。

     

    诊断磁盘io问题

    一般使用的工具就是perfmon特别是 physical diskdisk reads/sec 和 physical disk disk writes/sec。

    对于这2个性能指标有一个阀值的表格:

    • Less than 10 ms = good performance

    • Between 10 ms and 20 ms = slow performance

    • Between 20 ms and 50 ms = poor performance

    • Greater than 50 ms = significant performance problem.

     

    还有一些就是 PAGEIOLATCH_*,ASYNC_IO_COMPLETION,IO_COMPLETION,WRITELOG这些等待事件。关于这些 wait event的查询可以看SQL Server 性能调优(方法论) 

     

    常见的磁盘问题

    在此之前,我们先要排除集中状况就是,接下来讨论的和miss index,较差性能的写入,多余的io无关。单纯从io层面讨论io的配置问题。

    io的配置问题最常见的有以下4中情况:

    • 容量替代了性能

    • 负载隔离配置有问题

    • 分区对齐配置有问题

    • SAN的带宽配置有问题(这个SAN 小弟不是很熟悉,那么就不讨论了,如果想了解情况可以查看原书:《Troubleshooting SQL Server: A Guide for the Accidental DBA》)

     

    容量替代了性能

    一个800g的数据库可以存放在1个1t的磁盘中,也可以是通过raid拆分为多个磁盘,当然一个磁盘的性能明显比多个磁盘的要差。

    负载隔离配置有问题

    可能读到这里不太清楚负载隔离是什么,简单的说就是数据文件要放在哪里,日志文件要放在哪里,tempdb数据库要放在哪里。

    负载隔离对sql server 存储计划来说是很重要的,最简单的,也是很容被忽略的,为啥,因为不知道日志文件和数据文件的区别,不知道生产库和tempdb之间的关系和区别。日志文件是顺序写入的,数据文件是随即读写的,如果你把2个放在同一个磁盘或者raid里面,要日志文件的顺序读写算啥了。都体现不出优点来了。

    所以日志文件和数据文件要分开无疑。

    分区对齐配置有问题

    有一片相关的文章:《Disk Partition Alignment Best Practices for SQL Server》,很多人都不知道分区对齐是什么概念,但是又20%-30%的性能都浪费在上面。

    关键的问题就是有63个保留扇区被用来MBR。当windows创建分区的时候就会保留31.5kb的空间供MBR使用。这样就照成了不对齐,和raid的条带单元代销不对齐了。raid条带的单元大小是从4kb到512kb的。

    多数磁盘一个扇区的大小是512B,但是 ssd是4kb一个扇区,sql server 的推荐分配单元大小是64kb但是ntfs的大小则是4kb,根据推荐值64kb的大小就是128个扇区。但是保留扇区是63个,当发生io的时候,sql server 读取128个扇区,那么就会发生2次io,从第一个磁盘中读取65个扇区,从第二个磁盘中读取63个扇区。为了阻止,windows 的保留空间变为了1mb,那么就能包容所有的raid单元条带的大小。但是windows2008以下的版本默认是不对齐的。就需要命令行下调用diskpar或者diskpart来显示的对齐。

    查看是否对齐的唯一方法就是wmic命令:

    wmic partition get BlockSize, StartingOffset, Name, Index

    如果用Startingofferset/raid条带大小,如果为整数那么就是对齐的否则就是不对齐的。

    分区保留扇区只能在磁盘的创建分区的时候设置。

    create partition primary align=64

    分区对齐后,可以给分区分配盘符并且在格式化的时候指定分配单元大小,这样就避免了没对齐带来的性能冲击。



    总结

    关于隔离的内容个人觉得讲得不是很深入,大家可以去看原书:《Disk Partition Alignment Best Practices for SQL Server》第二章的Choosing the Right RAID Level下的Workload considerations小节,详细描述了关于数据文件,日志文件,tempdb的特点,并建议使用哪种raid 比较合适。

    这里的io问题主要是讲io的配置问题。io的配置如果撇开SAN不讲,还是挺简单的。

  • 相关阅读:
    ‘==’运算符和equals方法的区别
    ‘==’与equals的使用
    重写equals()方法的原则
    三目运算符---自动转换数据类型
    Spring安全框架——细粒度权限控制实现步骤
    Http协议学习笔记---Http协议介绍、协议格式、响应码说明
    Xml&Tomcat学习笔记03-----javaweb介绍、Tomcat介绍和使用
    Xml&Tomcat学习笔记02-----IDEA配置TomCat服务器
    Xml&Tomcat学习笔记01-----XML简介、语法、元素、属性、dom4j
    MVC概念
  • 原文地址:https://www.cnblogs.com/crystal-guoguo/p/3655820.html
Copyright © 2011-2022 走看看