如何测试香港云主机的性能
要测试香港云主机的性能,可以考虑以下几个方面:
网络性能:可以使用网络诊断工具如ping和traceroute来测试网络延迟和丢包率等指标;
CPU性能:可以使用CPU测试工具如stress和CPU-bound来模拟多个并发请求,测试CPU利用率和响应时间;
内存性能:可以使用内存测试工具如memtest86+来测试内存的稳定性和容量;
磁盘性能:可以使用磁盘测试工具如fio来测试磁盘的读写速度和延迟;
负载测试:可以使用负载测试工具如Apache JMeter或LoadRunner来模拟多个并发用户访问,测试系统在高负载下的性能和稳定性。
性能测试都包括以下几个方面:
负载测试 -- Load Testing
在一定的软件、硬件及网络环境下,通过改变系统负载方式来发现系统中所存在的性能问题。测试服务器的性能指标是否在用户的要求范围内,用于确定系统所能承载的最大用户数、最大有效用户数。关注不同用户数下的系统响应时间及服务器的资源利用率。
压力测试 -- Stress Testing
在一定的软硬件及网络环境下,通过模拟大量的虚拟用户向服务器产生负载,使服务器的资源处于极限状态下长时间连续运行,用以测试服务器在高负载情况下是否能够稳定工作,目的是找到系统在哪里失效以及失效时候的反应。比如CPU达到极限,内存溢出,资源无法回收,系统无响应等,均是失效的表现。
配置测试 -- Configuration Testing
在不同的软件、硬件以及网络环境配置下,通过运行一种或多种业务在一定的虚拟用户数量情况下,获得不同配置的性能指标,用于选择最佳的设备及参数配置。
容量测试 -- Volume Testing
在一定的软硬件及网络环境下,向数据库中构造不同数量级别的数据记录,通过运行一种或多种业务在一定的虚拟用户数量情况下,获取不同数据级别的服务器性能指标用以确定数据库的最佳容量。
一般的磁盘检查工具就可以了,像 HD Tune 之类的,有的优化软件也集成了硬盘检测的组件,可以做读写测试的,比如“软媒魔方”集成的“磁盘大师”组件等等。
如果还不清楚,就直接百度搜索“磁盘性能测试”吧,会有你想要的。
一、服务器测试方法分为两个大方面,性能测试与功能测试。
在性能测试方面采用了新的测试方法,主要分为文件测试、数据库性能测试与Web性能测试三个方面。其中,文件性能与数据库性能采用美国Quest软件公司的Benchmark Factory负载测试和容量规划软件,Web性能测试则使用了Spirent公司提供的Caw WebAvalanche测试仪。
1、硬盘哨兵
硬盘哨兵原名hard disk sentinel,这个工具非常专业且兼容性高,几乎所有的硬盘都可以用这个工具检测,包括服务器硬盘,而且它也是更新比较频繁的工具;
它能够检测硬盘状态、健康程度、以及性能其中包括每个硬盘的温度、SMART值等。本工具同时还可以测试硬盘的实时传输率以便用来做为性能测试或者硬盘是否有隐含问题的功能。
硬盘哨兵44绿色中文专业注册版-支持SAS硬盘检测通电时间
Hard Disk Sentinel Pro为绿色专业注册版,解压后直接运行主程序HDSentinelexe即可,
2、HDDScan
没有什么比直接扫描整个硬盘是否有物理或者逻辑坏道更能体现硬盘是否健康的了,这款HDDScan虽然是很老的工具,但也是最简单直接的硬盘检测工具了,推荐下载HDDScan 28。
HDDScan经典硬盘检测工具28绿色版
此版本非常好用,特别是在PE下检测硬盘坏块,比最新的33版好用很多,绿色小巧,33在pe下会出错。
它主要可以让我们用来检测我们的硬盘是否有坏道,我们可以自订检测试的每一区块大小,并且显示出每一区块的读取时间,同时还可以显示出读取时的速度。
3、HDTUNE
HD Tune Pro硬盘检测工具是一款小巧易用的硬盘工具软件,它也是大家用得最广泛的一款工具,其主要功能有硬盘传输速率检测,健康状态检测,温度检测及磁盘表面扫描等。另外,还能检测出硬盘的固件 版本、序列号、容量、缓存大小以及当前的Ultra DMA模式等。虽然这些功能其它软件也有,但难能可贵的是此软件把所有这些功能积于一身,而且非常小巧,速度又快,更重要的是它是免费软件,可自由使用。
HDTUNE硬盘检测工具
HDTUNE硬盘检测工具
健康一栏中有很多信息可以看,譬如通电时间,一般可以根据这个判断笔记本是否为样机。新机器的通电时间一般在20H以内。另外正常情况下,一块良好的硬盘所有健康状态都是如图的颜色,而没有**(警告)或者红色(严重)。
HDTUNE查看硬盘接口
HDTUNE查看硬盘接口
HDTUNE硬盘测试
HDTUNE硬盘测试
这里可以看到硬盘本身和接口信息。还有可以用这个软件来进
一、远程连接到Windows服务器,使用windows系统自带工具进行收集性能数据
1、Windows服务器中自带的性能监控工具叫做Performance Monitor,在开始-运行中输入‘Perfmonmsc’,然后回车即可运行。通过界面,控制面板\所有控制面板项\管理工具\性能监视器也能打开
打开后,页面展示
2、添加计数器
性能>数据收集器集>用户定义[右击]>新增‘数据收集器集’>手动创建高级>下一步
勾选创建数据日志>性能计数器>下一步
点击“添加”→选择计数器
点击选中的可用计数器>添加>确定
确定>下一步
选择目录后,点击完成
查看新增的计数器,输出地方为日志输出地址
3、选择日志数据源格式
选择用户定义下的数据收集器集>右键属性>性能计数器,日志格式选择“逗号分隔”(即csv格式)
4、开始启动数据采集,选择用户定义下的数据收集器集>右键属性>开始
此时,输出有地址了
5、用EXCEL将数据转换为折线图,并分析性能情况
二、分析性能情况
(1)内存泄露判断
●虚拟内存字节数(VirtualBytes)应该远大于工作集字节数(Workingset),如果两者变化规律相反,比如说工作集增长较快,虚拟内存增长较少,则可能说明出现了内存泄露的情况。
●对于Workingset、Private Bytes、Available bytes这些计数器,如果在测试期间内数值持续增长,而且测试停止后位置在高水平,则也说明存在内存泄露。
●Windows资源监控中,如果Process\PrivateBytes计数器和Process\WorkingSet计数器的值在长时间内持续升高,同时Memory\Available
bytes计数器的值持续降低,则很可能存在内存泄漏。
(2)CPU使用情况
●一般平均不要超过70%,最大不要超过90%(好:70% 、坏:85%、 很差:90%)
(3)tps(每秒处理事务的数量,在SOAPUI中进行统计)
●一般在10-100,不同应用程序具体值不同
1234567891011121314151617
几个常用参数的参考值: CPU:% Processor Time:表示CPU的使用率,如果值大于80表示CPU的处理调度能力偏低。 硬盘:% Disk Time:表示硬盘的I/O操作的频率(繁忙时间),如果值大于80表示硬盘I/O调度能力偏低。Average Disk QueueLength:表示硬盘I/O操作等待队列的长度,如果值大于2表示硬盘I/O调度能力偏低。 内存 Pages/Sec:表示系统对虚拟内存每秒钟的访问次数,如果值大于20表示有内存方面的问题。(有可能是物理内存偏低,也有可能是虚拟内存没有配置正确。一般情况下虚拟内存应为物理内存的15-2倍) Committed Bytes and Available Bytes:Committed Bytes表示虚拟内存的大小,Available Bytes表示剩余可用内存的大小。正常情况下,Available Bytes减少,pages(页面数)应该增加,提供页面交换。<br>如果Available Bytes的值很小表示物理内存偏低。当关闭一些应用以后,Committed Bytes应该减少,Available Bytes应该增加。因为关闭的进程释放了之前占用的内存资源。如果相应的值没有发生变化,那么该进程就可能造成了内存泄漏。 Cache Bytes:表示系统缓存的大小。如果值大于4M表示物理内存偏低。
三、关于计数器的选择
perfmon的计数器主要分四种:处理器性能计数器、内存性能计数器、磁盘性能计数器以及网络性能计数器。
以下为监控服务器常用的计数器:
常用的性能对象与指标
性能对象
计数器
提供的信息
Processor
% Idle Time
% Idle Time 是处理器在采样期间空闲的时间的百分比
Processor
% Processor Time
% Processor Time 指处理器用来执行非闲置线程时间的百分比。计算方法是,测量范例间隔内非闲置线程活动的时间,用范例间隔减去该值。这个计数器是处理器活动的主要说明器,显示在范例间隔时所观察的繁忙时间平均百分比。
Processor
% User Time
% User Time 指处理器处于用户模式的时间百分比。用户模式是为应用程序、环境分系统和整数分系统设计的有限处理模式。
Memory
Available Bytes
Available Bytes显示出当前空闲的物理内存总量。当这个数值变小时,Windows开始频繁地调用磁盘页面文件。如果这个数值很小,例如小于5 MB,系统会将大部分时间消耗在操作页面文件上。
Memory
% Committed Bytes in Use
% Committed Bytes In Use 是 Memory: Committed Bytes 与Memory: Commit Limit之间的比值。(Committed memory指如果需要写入磁盘时已在分页文件中保留空间的处于使用中的物理内存。Commit Limit是由分页文件的大小而决定的。如果扩大了分页文件,该比例就会减小)。这个计数器只显示当前百分比;而不是一个平均值。
Memory
Page Faults/sec
Page Faults/sec是指处理器处理错误页的综合速率。用错误页数/秒来计算。当处理器请求一个不在其工作集(在物理内存中的空间)内的代码或数据时出现的页错误。这个计数器包括硬错误(那些需要磁盘访问的)和软错误(在物理内存的其它地方找到的错误页)。许多处理器可以在有大量软错误的情况下继续操作。但是,硬错误可以导致明显的拖延。这个计数器显示用上两个实例中观察到的值之间的差除以实例间隔的持续时间所得的值。
Network Interface
Bytes Total/sec
Bytes Total/sec是发送和接收字节的速率,包括帧字符在内。
Network Interface
Packets/sec
Packets/sec为发送和接收数据包的速率。
Physical Disk
% Busy Time
% Busy Time指磁盘驱动器忙于为读或写入请求提供服务所用的时间的百分比。
Physical Disk
Avg Disk Queue Length
Avg Disk Queue Length 指读取和写入请求(为所选磁盘在实例间隔中列队的)的平均数。
Physical Disk
Current Disk Queue Length
Current Disk Queue Length指在收集操作数据时在磁盘上未完成的请求的数目。它包括在快照内存时正在为其提供服务中的请求。这是一个即时长度而非一定间隔时间的平均值。多主轴磁盘设备可以一次有多个请求操作,但是其它同时发生的请求为等候服务。这个计数器可能会反映一个暂时的高或低的列队长度,但是如果在磁盘驱动器存在持续负载,可能值会总是很高。请求等待时间与这个列队的长度减去磁盘上的主轴成正比。这个差值应小于2才能保持良好的性能。
Logical
Disk
% Free Space
% Free Space 是所选定的逻辑磁盘驱动器上总的可用空闲空间的百分比。
Logical
Disk
Free Megabytes
可用的 MB 显示磁盘驱动器上尚未分配的空间。
以下为监控进程常用的计数器:
Process对象的主要指标
性能对象
计数器
提供的信息
Process
% Privileged Time
% Privileged Time 是在特权模式下处理线程执行代码所花时间的百分比。当调用 Windows 系统服务时,此服务经常在特权模式运行,以便获取对系统专有数据的访问。在用户模式执行的线程无法访问这些数据。对系统的调用可以是直接的(explicit)或间接的(implicit),例如页面错误或间隔。
Process
% Processor Time
% Processor Time 是所有进程线程使用处理器执行指令所花的时间百分比。指令是计算机执行的基础单位。线程是执行指令的对象,进程是程序运行时创建的对象。此计数包括处理某些硬件间隔和陷阱条件所执行的代码。
Process
% User Time
% User Time 指处理线程用于执行使用用户模式的代码的时间的百分比。应用程序、环境分系统和集合分系统是以用户模式执行的。Windows 的可执行程序、内核和设备驱动程序不会被以用户模式执行的代码损坏。
Process
Creating Process ID value
Creating Process ID value 指创建该进程的父进程号。
Process
Elapsed Time
该进程运行的总时间(用秒计算)。
Process
Handle Count
由这个处理现在打开的句柄总数。这个数字等于这个处理中每个线程当前打开的句柄的总数。
Process
ID Process
ID Process 指这个处理的特别的识别符。ID Process 号可重复使用,所以这些 ID Process 号只能在一个处理的寿命期内识别那个处理。
Process
IO Data Bytes/sec
处理从 I/O 操作读取/写入字节的速度。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。
Process
IO Data Operations/sec
本处理进行读取/写入 I/O 操作的速率。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。
Process
IO Other Bytes/sec
处理给不包括数据的 I/O 操作(如控制操作)字节的速率。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。
Process
IO Other Operations/sec
本处理进行非读取/写入 I/O 操作的速率。例如,控制性能。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。
Process
IO Read Bytes/sec
处理从 I/O 操作读取字节的速度。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。
Process
IO Read Operations/sec
本处理进行读取 I/O 操作的速率。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。
Process
IO Write Bytes/sec
处理从 I/O 操作写入字节的速度。这个计数器为所有由本处理产生的包括文件、网络和设备。
Process
IO Write Operations/sec
本处理进行写入 I/O 操作的速率。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。
Process
Page Faults/sec
Page Faults/sec 指在这个进程中执行线程造成的页面错误出现的速度。当线程引用了不在主内存工作集中的虚拟内存页即会出现 Page Fault。如果它在备用表中(即已经在主内存中)或另一个共享页的处理正在使用它,就会引起无法从磁盘中获取页。
Process
Page File Bytes
Page File Bytes 指这个处理在 Paging file 中使用的最大字节数。Paging File 用于存储不包含在其他文件中的由处理使用的内存页。Paging File 由所有处理共享,并且 Paging File 空间不足会防止其他处理分配内存。
Process
Page File Bytes Peak
Page File Bytes Peak 指这个处理在 Paging files 中使用的最大数量的字节。
Process
Pool Nonpaged Bytes
Pool Nonpaged Bytes 指在非分页池中的字节数,非分页池是指系统内存(操作系统使用的物理内存)中可供对象(指那些在不处于使用时不可以写入磁盘上而且只要分派过就必须保留在物理内存中的对象)使用的一个区域。这个计数器仅显示上一次观察的值;而不是一个平均值。
Process
Pool Paged Bytes
Pool Paged Bytes 指在分页池中的字节数,分页池是系统内存(操作系统使用的物理内存)中可供对象(在不处于使用时可以写入磁盘的)使用的一个区域。这个计数器仅显示上一次观察的值;而不是一个平均值。
Process
Priority Base
这次处理的当前基本优先权。在一个处理中的线程可以根据处理的基本优先权提高或降低自己的基本优先权。
Process
Private Bytes
Private Bytes 指这个处理不能与其他处理共享的、已分配的当前字节数。
Process
Thread Count
在这次处理中正在活动的线程数目。指令是在一台处理器中基本的执行单位,线程是指执行指令的对象。每个运行处理至少有一个线程。
Process
Virtual Bytes
Virtual Bytes 指处理使用的虚拟地址空间的以字节数显示的当前大小。使用虚拟地址空间不一定是指对磁盘或主内存页的相应的使用。虚拟空间是有限的,可能会限制处理加载数据库的能力。
Process
Virtual Bytes Peak
Virtual Bytes Peak 指在任何时间内该处理使用的虚拟地址空间字节的最大数。
Process
Working Set
Working Set 指这个处理的 Working Set 中的当前字节数。Working Set 是在处理中被线程最近触到的那个内存页集。如果计算机上的可用内存处于阈值以上,即使页不在使用中,也会留在一个处理的 Working Set中。当可用内存降到阈值以下,将从 Working Set 中删除页。如果需要页时,它会在离开主内存前软故障返回到 Working Set 中。
Process
Working Set Peak
Working Set Peak 指在任何时间这个在处理的 Working Set 的最大字节数。
问题
UOS公有云开放以来,一些用户反应用dd命令测试出来的1TB云硬盘的吞吐率(MBPS)只有128MB/s,而不是我们SLA保证的170MB /s ,这是为什么?下面我会简单介绍如何测试硬盘,RAID,SAN,SSD,云硬盘等,然后再来回答上面的问题。
测试前提
我们在进行测试时,都会分清楚:
测试对象:要区分硬盘、SSD、RAID、SAN、云硬盘等,因为它们有不同的特点
测试指标:IOPS和MBPS(吞吐率),下面会具体阐述
测试工具:Linux下常用Fio、dd工具, Windows下常用IOMeter,
测试参数: IO大小,寻址空间,队列深度,读写模式,随机/顺序模式
测试方法:也就是测试步骤。
测试是为了对比,所以需要定性和定量。在宣布自己的测试结果时,需要说明这次测试的工具、参数、方法,以便于比较。
存储系统模型
为了更好的测试,我们需要先了解存储系统,块存储系统本质是一个排队模型,我们可以拿银行作为比喻。还记得你去银行办事时的流程吗?
去前台取单号
等待排在你之前的人办完业务
轮到你去某个柜台
柜台职员帮你办完手续1
柜台职员帮你办完手续2
柜台职员帮你办完手续3
办完业务,从柜台离开
如何评估银行的效率呢:
服务时间 = 手续1 + 手续2 + 手续3
响应时间 = 服务时间 + 等待时间
性能 = 单位时间内处理业务数量
那银行如何提高效率呢:
增加柜台数
降低服务时间
因此,排队系统或存储系统的优化方法是
增加并行度
降低服务时间
硬盘测试
硬盘原理
我们应该如何测试SATA/SAS硬盘呢?首先需要了解磁盘的构造,并了解磁盘的工作方式:
每个硬盘都有一个磁头(相当于银行的柜台),硬盘的工作方式是:
收到IO请求,得到地址和数据大小
移动磁头(寻址)
找到相应的磁道(寻址)
读取数据
传输数据
则磁盘的随机IO服务时间:
服务时间 = 寻道时间 + 旋转时间 + 传输时间
对于10000转速的SATA硬盘来说,一般寻道时间是7 ms,旋转时间是3 ms, 64KB的传输时间是 08 ms, 则SATA硬盘每秒可以进行随机IO操作是 1000/(7 + 3 + 08) = 93,所以我们估算SATA硬盘64KB随机写的IOPS是93。一般的硬盘厂商都会标明顺序读写的MBPS。
我们在列出IOPS时,需要说明IO大小,寻址空间,读写模式,顺序/随机,队列深度。我们一般常用的IO大小是4KB,这是因为文件系统常用的块大小是4KB。
使用dd测试硬盘
虽然硬盘的性能是可以估算出来的,但是怎么才能让应用获得这些性能呢?对于测试工具来说,就是如何得到IOPS和MBPS峰值。我们先用dd测试一下SATA硬盘的MBPS(吞吐量)。
#dd if=/dev/zero of=/dev/sdd bs=4k count=300000 oflag=direct
记录了300000+0 的读入 记录了300000+0 的写出 1228800000字节(12 GB)已复制,17958 秒,684 MB/秒
#iostat -x sdd 5 10
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdd 000 000 000 1679480 000 13435840 800 079 005 005 7882
为什么这块硬盘的MBPS只有68MB/s 这是因为磁盘利用率是78%,没有到达95%以上,还有部分时间是空闲的。当dd在前一个IO响应之后,在准备发起下一个IO时,SATA硬盘是空闲的。那么如何才能提高利用率,让磁盘不空闲呢?只有一个办法,那就是增加硬盘的队列深度。相对于CPU来说,硬盘属于慢速设备,所有操作系统会有给每个硬盘分配一个专门的队列用于缓冲IO请求。
队列深度
什么是磁盘的队列深度?
在某个时刻,有N个inflight的IO请求,包括在队列中的IO请求、磁盘正在处理的IO请求。N就是队列深度。
加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。
加大队列深度 -> 提高利用率 -> 获得IOPS和MBPS峰值 -> 注意响应时间在可接受的范围内
增加队列深度的办法有很多
使用异步IO,同时发起多个IO请求,相当于队列中有多个IO请求
多线程发起同步IO请求,相当于队列中有多个IO请求
增大应用IO大小,到达底层之后,会变成多个IO请求,相当于队列中有多个IO请求 队列深度增加了。
队列深度增加了,IO在队列的等待时间也会增加,导致IO响应时间变大,这需要权衡。让我们通过增加IO大小来增加dd的队列深度,看有没有效果:
dd if=/dev/zero of=/dev/sdd bs=2M count=1000 oflag=direct
记录了1000+0 的读入 记录了1000+0 的写出 2097152000字节(21 GB)已复制,106663 秒,197 MB/秒
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdd 000 000 000 38060 000 38973440 102400 239 628 256 9742
可以看到2MB的IO到达底层之后,会变成多个512KB的IO,平均队列长度为239,这个硬盘的利用率是97%,MBPS达到了197MB/s。(为什么会变成512KB的IO,你可以去使用Google去查一下内核参数 max_sectors_kb的意义和使用方法 )
也就是说增加队列深度,是可以测试出硬盘的峰值的。
使用fio测试硬盘
现在,我们来测试下SATA硬盘的4KB随机写的IOPS。因为我的环境是Linux,所以我使用FIO来测试。
$fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -size=1000G -filename=/dev/vdb \
-name="EBS 4K randwrite test" -iodepth=64 -runtime=60
简单介绍fio的参数
ioengine: 负载引擎,我们一般使用libaio,发起异步IO请求。
bs: IO大小
direct: 直写,绕过操作系统Cache。因为我们测试的是硬盘,而不是操作系统的Cache,所以设置为1。
rw: 读写模式,有顺序写write、顺序读read、随机写randwrite、随机读randread等。
size: 寻址空间,IO会落在 [0, size)这个区间的硬盘空间上。这是一个可以影响IOPS的参数。一般设置为硬盘的大小。
filename: 测试对象
iodepth: 队列深度,只有使用libaio时才有意义。这是一个可以影响IOPS的参数。
runtime: 测试时长
下面我们做两次测试,分别 iodepth = 1和iodepth = 4的情况。下面是iodepth = 1的测试结果。
上图中蓝色方框里面的是测出的IOPS 230, 绿色方框里面是每个IO请求的平均响应时间,大约是43ms。**方框表示95%的IO请求的响应时间是小于等于 9920 ms。橙色方框表示该硬盘的利用率已经达到了9858%。
下面是 iodepth = 4 的测试:
我们发现这次测试的IOPS没有提高,反而IO平均响应时间变大了,是17ms。
为什么这里提高队列深度没有作用呢,原因当队列深度为1时,硬盘的利用率已经达到了98%,说明硬盘已经没有多少空闲时间可以压榨了。而且响应时间为 4ms。 对于SATA硬盘,当增加队列深度时,并不会增加IOPS,只会增加响应时间。这是因为硬盘只有一个磁头,并行度是1, 所以当IO请求队列变长时,每个IO请求的等待时间都会变长,导致响应时间也变长。
这是以前用IOMeter测试一块SATA硬盘的4K随机写性能,可以看到IOPS不会随着队列深度的增加而增加,反而是平均响应时间在倍增。
队列深度 IOPS 平均响应时间
1 332931525 3002217
2 333985074 5986528
4 332594653 12025060
8 336568012 23766359
16 329785606 48513477
32 332054590 96353934
64 331041063 193200815
128 331309109 385163111
256 327442963 774401781
寻址空间对IOPS的影响
我们继续测试SATA硬盘,前面我们提到寻址空间参数也会对IOPS产生影响,下面我们就测试当size=1GB时的情况。
我们发现,当设置size=1GB时,IOPS会显著提高到568,IO平均响应时间会降到7ms(队列深度为4)。这是因为当寻址空间为1GB时,磁头需要移动的距离变小了,每次IO请求的服务时间就降低了,这就是空间局部性原理。假如我们测试的RAID卡或者是磁盘阵列(SAN),它们可能会用Cache把这1GB的数据全部缓存,极大降低了IO请求的服务时间(内存的写操作比硬盘的写操作快很1000倍)。所以设置寻址空间为1GB的意义不大,因为我们是要测试硬盘的全盘性能,而不是Cache的性能。
硬盘优化
硬盘厂商提高硬盘性能的方法主要是降低服务时间(延迟):
提高转速(降低旋转时间和传输时间)
增加Cache(降低写延迟,但不会提高IOPS)
提高单磁道密度(变相提高传输时间)
RAID测试
RAID0/RAID5/RAID6的多块磁盘可以同时服务,其实就是提高并行度,这样极大提高了性能(相当于银行有多个柜台)。
以前测试过12块RAID0,100GB的寻址空间,4KB随机写,逐步提高队列深度,IOPS会提高,因为它有12块磁盘(12个磁头同时工作),并行度是12。
队列深度 IOPS 平均响应时间
1 1215995842 0820917
2 4657061317 0428420
4 5369326970 0744060
8 5377387303 1486629
16 5487911660 2914048
32 5470972663 5846616
64 5520234015 11585251
128 5542739816 23085843
256 5513994611 46401606
RAID卡厂商优化的方法也是降低服务时间:
使用大内存Cache
使用IO处理器,降低XOR操作的延迟。
使用更大带宽的硬盘接口
SAN测试
对于低端磁盘阵列,使用单机IOmeter就可以测试出它的IOPS和MBPS的峰值,但是对于高端磁盘阵列,就需要多机并行测试才能得到IOPS和MBPS的峰值(IOmeter支持多机并行测试)。下图是纪念照。
磁盘阵列厂商通过以下手段降低服务时间:
更快的存储网络,比如FC和IB,延时更低。
读写Cache。写数据到Cache之后就马上返回,不需要落盘。 而且磁盘阵列有更多的控制器和硬盘,大大提高了并行度。
现在的存储厂商会找SPC帮忙测试自己的磁盘阵列产品(或全闪存阵列), 并给SPC支付费用,这就是赤裸裸的标准垄断。国内也有做存储系统测试的,假如你要测试磁盘阵列,可以找NSTC (广告时间)。
SSD测试
SSD的延时很低,并行度很高(多个nand块同时工作),缺点是寿命和GC造成的响应时间不稳定。
推荐用IOMeter进行测试,使用大队列深度,并进行长时间测试,这样可以测试出SSD的真实性能。
下图是storagereview对一些SSD硬盘做的4KB随机写的长时间测试,可以看出有些SSD硬盘的最大响应时间很不稳定,会飙高到几百ms,这是不可接受的。
云硬盘测试
我们通过两方面来提高云硬盘的性能的:
降低延迟(使用SSD,使用万兆网络,优化代码,减少瓶颈)
提高并行度(数据分片,同时使用整个集群的所有SSD)
在Linux下测试云硬盘
在Linux下,你可以使用FIO来测试
操作系统:Ubuntu 1404
CPU: 2
Memory: 2GB
云硬盘大小: 1TB(SLA: 6000 IOPS, 170MB/s吞吐率 )
安装fio:
#sudo apt-get install fio
再次介绍一下FIO的测试参数:
ioengine: 负载引擎,我们一般使用libaio,发起异步IO请求。
bs: IO大小
direct: 直写,绕过操作系统Cache。因为我们测试的是硬盘,而不是操作系统的Cache,所以设置为1。
rw: 读写模式,有顺序写write、顺序读read、随机写randwrite、随机读randread等。
size: 寻址空间,IO会落在 [0, size)这个区间的硬盘空间上。这是一个可以影响IOPS的参数。一般设置为硬盘的大小。
filename: 测试对象
iodepth: 队列深度,只有使用libaio时才有意义。这是一个可以影响IOPS的参数。
runtime: 测试时长
4K随机写测试
我们首先进行4K随机写测试,测试参数和测试结果如下所示:
#fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -size=100G -filename=/dev/vdb \
-name="EBS 4KB randwrite test" -iodepth=32 -runtime=60
蓝色方框表示IOPS是5900,在正常的误差范围内。绿色方框表示IO请求的平均响应时间为542ms, **方框表示95%的IO请求的响应时间是小于等于 624 ms的。
4K随机读测试
我们再来进行4K随机读测试,测试参数和测试结果如下所示:
#fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randread -size=100G -filename=/dev/vdb \
-name="EBS 4KB randread test" -iodepth=8 -runtime=60
512KB顺序写测试
最后我们来测试512KB顺序写,看看云硬盘的最大MBPS(吞吐率)是多少,测试参数和测试结果如下所示:
#fio -ioengine=libaio -bs=512k -direct=1 -thread -rw=write -size=100G -filename=/dev/vdb \
-name="EBS 512KB seqwrite test" -iodepth=64 -runtime=60
蓝色方框表示MBPS为174226KB/s,约为170MB/s。
使用dd测试吞吐率
其实使用dd命令也可以测试出170MB/s的吞吐率,不过需要设置一下内核参数,详细介绍在 128MB/s VS 170MB/s 章节中。
在Windows下测试云硬盘
在Windows下,我们一般使用IOMeter测试磁盘的性能,IOMeter不仅功能强大,而且很专业,是测试磁盘性能的首选工具。
IOMeter是图形化界面(浓浓的MFC框架的味道),非常方便操作,下面我将使用IOMeter测试我们UOS上1TB的云硬盘。
操作系统:Window Server 2012 R2 64
CPU: 4
Memory: 8GB
云硬盘大小: 1TB
当你把云硬盘挂载到Windows主机之后,你还需要在windows操作系统里面设置硬盘为联机状态。
4K随机写测试
打开IOMeter(你需要先下载),你会看到IOMeter的主界面。在右边,你回发现4个worker(数量和CPU个数相同),因为我们现在只需要1个worker,所以你需要把其他3个worker移除掉。
现在让我们来测试硬盘的4K随机写,我们选择好硬盘(Red Hat VirtIO 0001),设置寻址空间(Maximum Disk Size)为50GB(每个硬盘扇区大小是512B,所以一共是 50102410241024/512 = 104857600),设置队列深度(Outstanding I/Os)为64。
然后在测试集中选择”4KiB ALIGNED; 0% Read; 100% random(4KB对齐,100%随机写操作)” 测试
然后设置测试时间,我们设置测试时长为60秒,测试之前的预热时间为10秒(IOMeter会发起负载,但是不统计这段时间的结果)。
在最后测试之前,你可以设置查看实时结果,设置实时结果的更新频率是5秒钟。最后点击绿色旗子开始测试。
在测试过程中,我们可以看到实时的测试结果,当前的IOPS是6042,平均IO请求响应时间是1056ms,这个测试还需要跑38秒,这个测试轮回只有这个测试。
我们可以看到IOMeter自动化程度很高,极大解放测试人员的劳动力,而且可以导出CSV格式的测试结果。
顺序读写测试
我们再按照上面的步骤,进行了顺序读/写测试。下面是测试结果:
IO大小 读写模式 队列深度 MBPS
顺序写吞吐测试 512KB 顺序写 64 16407 MB/s
顺序读吞吐测试 256KB 顺序读 64 17932 MB/s
云硬盘的响应时间
当前云硬盘写操作的主要延迟是
网络传输
多副本,写三份(数据强一致性)
三份数据都落盘(数据持久化)之后,才返回
IO处理逻辑
我们当前主要是优化IO处理逻辑,并没有去优化2和3,这是因为我们是把用户数据的安全性放在第一位。
128MB/s VS 170MB/s
回到最开始的问题 “为什么使用dd命令测试云硬盘只有128MB/s”, 这是因为目前云硬盘在处理超大IO请求时的延迟比SSD高(我们会不断进行优化),现在我们有两种方法来获得更高的MBPS:
设置max_sectors_kb为256 (系统默认为512),降低延迟
使用fio来测试,加大队列深度
通过设置max_sectors_kb这个参数,使用dd也可以测出170MB/s的吞吐量
root@ustack:~# cat /sys/block/vdb/queue/max_sectors_kb
512
root@ustack:~# echo "256" > /sys/block/vdb/queue/max_sectors_kb
root@ustack:~#
root@ustack:~# dd if=/dev/zero of=/dev/vdb bs=32M count=40 oflag=direct
40+0 records in
40+0 records out
1342177280 bytes (13 GB) copied, 751685 s, 179 MB/s
root@ustack:~#
同时查看IO请求的延迟:
root@ustack:~# iostat -x vdb 5 100
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdb 000 000 000 68800 000 17612800 51200 5459 9347 000 9347 140 9656
下面是使用fio工具的测试结果,也可以得到170MB/s的吞吐率。
不可测试的指标
IOPS和MBPS是用户可以使用工具测试的指标,云硬盘还有一些用户不可测量的指标
数据一致性
数据持久性
数据可用性
这些指标我们只能通过根据系统架构和约束条件计算得到,然后转告给用户。这些指标衡量着公有云厂商的良心,有机会会专门进行介绍。
总结
上面介绍了一下测试工具和一些观点,希望对你有所帮助。
测试需要定性和定量
了解存储模型可以帮助你更好的进行测试
增加队列深度可以有效测试出IOPS和MBPS的峰值
如图点开始就行了,
一个很关键的地方要注意,最好在PE里运行HD Tune,那样的测试才比较准确,如果你在Windows里运行,由于系统资源每时每刻不确定地读写磁盘操作,所得的测试结果会稍差。
0条评论