上次放出了一篇文章,针对磁盘卷簇大小默认4KB和自定义64KB进行了测试,测试内容为随机和顺序读写,大小为8KB和64KB,有人觉得这并没有照顾到SQL Server所有的IO使用情景。这篇测试文章,我们就来尽可能模拟一下SQL Server IO的行为,全方位对簇大小4KB、8KB和64KB做一次验证,注意:本次我们增加了簇为8KB的大小。

重点说明:本测试使用的是两块SSD组成的RAID1

首先,我们先来分析SQL Server的IO行为,参考网址:Choosing what SQLIO tests to Run and Automating the Tests

下面的几点是我根据文章整理,并非完全翻译:

1、SQL Server每个逻辑CPU上都会分配一个调度器,每个调度器上根据系统负载不同,会有多个Worker Thread,但是在同一个时刻,每个调度器上只能有一个Worker Thread处于运行状态,即:每个逻辑CPU在同一时刻只能支配一个Worker Thread干活。也就是说:SQLIO Param.txt 文件中定义的testfile.dat 0×0 5000 不能超过测试服务器逻辑CPU的数目,我测试的服务器为:2物理CPU*6核心*双线程=24逻辑CPU,即最大设置为:testfile.dat 0×0 5000

2、SQL Server间歇性的写入数据,写数据的行为由CheckPoint或者Lazy Writer(当内存有压力的时候)完成。当二者触发执行时,由单一的线程将内存中的脏页写入磁盘,因此当测试“写”的时候,在Param.txt 中配置超过1个线程都是毫无意义的,因为这种行为在即使多个数据库时也是串行的,(当然你可以配置线程数为2来压榨出IO写能力的极限)。并且,SQL Server在写入数据的时候,大部分情况下一次性写入32个page即256K的数据,因此你应该配置写入的Size为256K。但是也有例外,那就是Eager Writer,该行为在将数据库恢复模式设置为“大容量日志模式”时,最小化记录日志时将触发,该行为的写入Size为8KB(或者可能是64KB)。

3、SQL Server连续不断的进行数据读取操作,绝大多数的读操作是8KB为单位的,预读的块大小是64个page即512KB,直接读取整个区Extent即64KB也是较为常见的,因此对于读操作,测试8KB、64KB、512KB就可以了。

4、对于日志写,定一个测试Size是非常困难的,因为写入日志的大小取决于系统的负荷大小,但是一般不会超过60KB,但是对于测试,“我”建议使用8KB作为测试单位,这个大小覆盖了Eager Writer和Log Writer。在微软亚太博客的这篇文章中:SQL server每个日志写(log write)究竟有多大?,我们也可以了解到,SQL Server的日志写确实很不固定,一个简单的commit是512byte,而负荷较高时,接近60KB,在这里,我决定擅自再使用一个接近512byte的1KB作为测试大小,并且实际上,我用ProcessMonitor在生产环境抓取了一段时间Log Writer后,绝大多数的日志写确实在1K及以下。

5、作者的第5条认为SAN存储,由于有巨大的缓存,并且优化了读写机制,所以读写的差距不是很大,所以建议只使用Random作为测试方式,这一点,我决定不苟同于作者,仍然按照Data和Log的读写特性来进行测试,随机和顺序都会照顾到。

综上所述,根据个人知识点,测试要点总结如下:

1、我们首先建立两个Para.txt文件,一个Thread为逻辑CPU数目24,另外一个Thread我们设置为1,对应于上图中“使用线程数”中的内容,另外,我还将测试文件testfile.dat的大小调整为了5000M。

本次我为了避免误差,仅使用同一组RAID1来完成这三组簇分别为4KB/8KB/64KB大小的测试。

ParamMT.txt

D:\testfile.dat 24 0x0 5000

ParamST.txt

D:\testfile.dat 1 0x0 5000

2、以下为测试脚本,我们将-o参数从1开始增加,然后以翻倍的形式,测试出IO的最大能力。

在进行下一组测试前,我们只需要将后面的写入文件Cluster_4KB_test中的4KB全部替换为8KB或者64KB即可。
echo ****** Read Tests *****

echo ******random_R_8KB**********
sqlio -kR -s300 -frandom -o1 -b8 -LS -BH -FparamMT.txt > Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5 echo ******random_R_64KB**********
sqlio -kR -s300 -frandom -o1 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o2 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o4 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o8 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o16 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5 echo ******random_R_512KB**********
sqlio -kR -s300 -frandom -o1 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o2 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o4 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o8 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o16 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5 echo ******random_W_8KB**********
sqlio -kW -s300 -frandom -o1 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5 echo ******random_W_256KB**********
sqlio -kW -s300 -frandom -o1 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o2 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o4 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o8 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o16 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5 echo ******sequential_W_1KB**********
sqlio -kW -s300 -fsequential -o1 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o2 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o4 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o8 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o16 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5 echo ******sequential_W_8KB**********
sqlio -kW -s300 -fsequential -o1 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
 
3、在进行了漫长的等待后,我们终于拿齐了三个文件,用SqlioAnalyzer导出为文件,值得注意的是,导入txt文件时,报错,只需要将”1 thread”全部替换为”1 threads”,再次导入即可。
4、整理,取出每组测试最大值,所得结果如下。
看到结果,我惊呆了,在尽可能模拟SQLServer IO行为的前提下,我们这组SSD组成的Raid1不再是簇为64KB时性能全面领先!
  • 先说第二个直方图,我们可以看到,在顺序写时,三种簇大小下几乎是没有差别的;
  • 第一个直方图,在随机读取64KB和512KB时,簇为4KB相比其它两种情况是有优势的;其它读写情况下,还是簇为8KB和64KB时占据优势。
  • 我们上面已经说过,SQL Server的随机读,绝大多数还是以8KB为单位的,从这点来看,依然还是簇为8KB和64KB比簇为4KB在全局来讲,要占据优势,而簇为64KB比8KB的优势,是微乎其微的。
然后根据需要比较的项做成直方图,随机看IOS/sec,顺序看MB/sec。
 

测试总结:

在尽可能模拟SQL Server IO行为的前提下,我们测试的两块SSD硬盘组成的RAID1表现出了与第一篇测试文章时不同的性能行为。

SSD的特性是不再以物理寻道的形式获取数据,而是电子存储芯片颗粒直接读写,再也没有磁头移动消耗的时间,并且,SSD硬盘的并发读写能力是建立在多线程之上的,在同一时刻的工作绝不会局限于一个颗粒之上,本例我们测试的最大线程为24(测试服务器逻辑CPU数目),也许这是制约这组SSD硬盘没有发挥出最大功效的原因吧。即使这样,我们仍然可以察觉出簇为64KB比4KB时是有优势的。

如果您有不同意见,请提出,我们继续讨论。

手头上没有SAS硬盘的RAID,如果您有兴趣,可以试一下,差别应该会更大一些。

SQL Server 服务器磁盘测试之SQLIO篇(二)的更多相关文章

  1. SQL Server 服务器磁盘测试之SQLIO篇

    原文:SQL Server 服务器磁盘测试之SQLIO篇 数据库调优工作中,有一部分是需要排查IO问题的,例如IO的速度或者RAID级别无法响应高并发下的快速请求.最常见的就是查看磁盘每次读写的响应速 ...

  2. SQL Server 服务器磁盘测试之SQLIO篇(一)

    数据库调优工作中,有一部分是需要排查IO问题的,例如IO的速度或者RAID级别无法响应高并发下的快速请求.最常见的就是查看磁盘每次读写的响应速度,通过性能计数器Avg.Disk sec/Read(Wr ...

  3. SQL Server调优系列基础篇(并行运算总结篇二)

    前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...

  4. SQL Server调优系列进阶篇(如何索引调优)

    前言 上一篇我们分析了数据库中的统计信息的作用,我们已经了解了数据库如何通过统计信息来掌控数据库中各个表的内容分布.不清楚的童鞋可以点击参考. 作为调优系列的文章,数据库的索引肯定是不能少的了,所以本 ...

  5. SQL Server 2008性能故障排查(二)——CPU

    原文:SQL Server 2008性能故障排查(二)--CPU 承接上一篇:SQL Server 2008性能故障排查(一)--概论 说明一下,CSDN的博客编辑非常不人性化,我在word里面都排好 ...

  6. SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)

    前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...

  7. SQL Server调优系列基础篇(索引运算总结)

    前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方 ...

  8. SQL Server调优系列基础篇(子查询运算总结)

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  9. SQL Server调优系列进阶篇(查询优化器的运行方式)

    前言 前面我们的几篇文章介绍了一系列关于运算符的基础介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符. ...

随机推荐

  1. UWP开发必备以及常用知识点总结

    一直在学UWP,一直在写Code,自己到达了什么水平?还有多少东西需要学习才能独挡一面?我想对刚接触UWP的开发者都有这种困惑,偶尔停下来总结分析一下还是很有收获的! 以下内容是自己开发中经常遇到的一 ...

  2. Asp.net Core准备工作

    1.安装环境 安装.Net Core SDK 安装VS2015 Update3 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2.exe 2.新建Core工程 项 ...

  3. js callee,caller学习

    原文地址:js callee,caller学习 /* * caller 返回一个对函数的引用,该函数调用了当前函数. * 如果函数是由顶层调用的,那么 caller包含的就是 null . * 如果在 ...

  4. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  5. SpringMVC视图解析器

    SpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视 图解析器.当我们对SpringMVC控制的资源发起 ...

  6. mysql源码包手动安装、配置以及测试(亲测可行)

    笔记编者:小波/qq463431476博客首页:http://www.cnblogs.com/xiaobo-Linux/ 记下这篇mysql笔记,望日后有用! redhat6采用centos yum源 ...

  7. 个人也能申请微信小程序获得APPID和手机测试效果

    微信小程序昨晚火爆公测,我也第一时间注册了小程序账号开启公测之旅. 注册过程可以看文档:https://my.oschina.net/imhoodoo/blog/780901 进入后台之后我们其实主要 ...

  8. 技术笔记:Indy的TIdSMTP改造,解决发送Html和主题截断问题

    使用Indy来发邮件坑不少啊,只不过有比没有好吧,使用delphi6这种老工具没办法,只能使用了新一点的Indy版本9,公司限制... 1.邮件包含TIdText和TIdAttachment时会出现T ...

  9. Hadoop4 利用VMware搭建自己的hadoop集群

    前言:       前段时间自己学习如何部署伪分布式模式的hadoop环境,之前由于工作比较忙,学习的进度停滞了一段时间,所以今天抽出时间把最近学习的成果和大家分享一下.       本文要介绍的是如 ...

  10. Lesson 20 One man in a boat

    Text Fishing is my favourite sport. I often fish for hours without catching anything. But this does ...