如何测试评估windows或linux下数据库的iops

如何测试评估windows或linux下数据库的iops,第1张

测试方法:

使用方式:

安装FIO:

yum install gcc libaio-devel -y

wget http://brick.kernel.dk/snaps/fio-2.0.10.tar.gz

tar -zxvf fio-2.0.10.tar.gz

cd fio-2.0.10

make &&make install

测试:

随机读:

fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=10 -runtime=1000 -group_reporting -name=mytest

参数说明:

filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。

direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。

rw=randwrite 测试随机写的I/O

rw=randrw 测试随机写和读的I/O

bs=16k 单次io的块文件大小为16k

bsrange=512-2048 同上,提定数据块的大小范围

size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。

numjobs=30 本次的测试线程为30.

runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。

ioengine=psync io引擎使用pync方式

rwmixwrite=30 在混合读写的模式下,写占30%

group_reporting 关于显示结果的,汇总每个进程的信息。

此外

lockmem=1g 只使用1g内存进行测试。

zero_buffers 用0初始化系统buffer。

nrfiles=8 每个进程生成文件的数量。

###############################################

顺序读:

fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

随机写:

fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

顺序写:

fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

混合随机读写:

fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop

###############################################

实际测试范例:

[root@localhost ~]# fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=100 -group_reporting -name=mytest1

mytest1: (g=0): rw=randrw, bs=16K-16K/16K-16K, ioengine=psync, iodepth=1

mytest1: (g=0): rw=randrw, bs=16K-16K/16K-16K, ioengine=psync, iodepth=1

fio 2.0.7

Starting 30 threads

Jobs: 1 (f=1): [ [3.5% done] [6935K/3116K /s] [423 /190 iops] [eta 48m:20s] s]

mytest1: (groupid=0, jobs=30): err= 0: pid=23802

read : io=1853.4MB, bw=18967KB/s, iops=1185 , runt=100058msec

clat (usec): min=60 , max=871116 , avg=25227.91, stdev=31653.46

lat (usec): min=60 , max=871117 , avg=25228.08, stdev=31653.46

clat percentiles (msec):

| 1.00th=[ 3], 5.00th=[ 5], 10.00th=[ 6], 20.00th=[ 8],

| 30.00th=[ 10], 40.00th=[ 12], 50.00th=[ 15], 60.00th=[ 19],

| 70.00th=[ 26], 80.00th=[ 37], 90.00th=[ 57], 95.00th=[ 79],

| 99.00th=[ 151], 99.50th=[ 202], 99.90th=[ 338], 99.95th=[ 383],

| 99.99th=[ 523]

bw (KB/s) : min= 26, max= 1944, per=3.36%, avg=636.84, stdev=189.15

write: io=803600KB, bw=8031.4KB/s, iops=501 , runt=100058msec

clat (usec): min=52 , max=9302 , avg=146.25, stdev=299.17

lat (usec): min=52 , max=9303 , avg=147.19, stdev=299.17

clat percentiles (usec):

| 1.00th=[ 62], 5.00th=[ 65], 10.00th=[ 68], 20.00th=[ 74],

| 30.00th=[ 84], 40.00th=[ 87], 50.00th=[ 89], 60.00th=[ 90],

| 70.00th=[ 92], 80.00th=[ 97], 90.00th=[ 120], 95.00th=[ 370],

| 99.00th=[ 1688], 99.50th=[ 2128], 99.90th=[ 3088], 99.95th=[ 3696],

| 99.99th=[ 5216]

bw (KB/s) : min= 20, max= 1117, per=3.37%, avg=270.27, stdev=133.27

lat (usec) : 100=24.32%, 250=3.83%, 500=0.33%, 750=0.28%, 1000=0.27%

lat (msec) : 2=0.64%, 4=3.08%, 10=20.67%, 20=19.90%, 50=17.91%

lat (msec) : 100=6.87%, 250=1.70%, 500=0.19%, 750=0.01%, 1000=0.01%

cpu : usr=1.70%, sys=2.41%, ctx=5237835, majf=0, minf=6344162

IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%

submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%

complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%

issued : total=r=118612/w=50225/d=0, short=r=0/w=0/d=0

Run status group 0 (all jobs):

READ: io=1853.4MB, aggrb=18966KB/s, minb=18966KB/s, maxb=18966KB/s, mint=100058msec, maxt=100058msec

WRITE: io=803600KB, aggrb=8031KB/s, minb=8031KB/s, maxb=8031KB/s, mint=100058msec, maxt=100058msec

Disk stats (read/write):

sdb: ios=118610/50224, merge=0/0, ticks=2991317/6860, in_queue=2998169, util=99.77%

Windows性能计数器--磁盘性能析Disk

Physical Disk:

单IO

Avg.Disk Bytes/Read

Avg.Disk Bytes/Write

IO响应间

Avg.Disk sec/Read

Avg.Disk sec/Write

IOPS

DiskReads/sec

DiskWrites/sec

DiskTransfers/sec

IO吞吐率

DiskBytes/sec

DiskRead Bytes/sec

DiskWrite Bytes/sec

磁盘两重要参数:Seek time、Rotational latency

I/O计数:①1000/(Seek time+Rotational latency)*0.75范围内属达85%I/O计数则基本认已经存I/O瓶颈理论情况磁盘随机读计数125、 顺序读计数225于数据文件言随机读写志文件顺序读写数据文件建议存放于RAID5志文件存放于RAID10或 RAID1

附:

15000 RPM:150随机IOPS

10000 RPM:110随机IOPS

5400 RPM:50随机IOPS

面假设4块硬盘RAID5观察Physical Disk性能象部值:

Avg. DiskQueue Length 12 队列度

Avg. DiskSec/Read .035 读数据所用间ms

Avg. DiskSec/Write .045 写数据所用间ms

DiskReads/sec 320 每秒读数据量

DiskWrites/sec 100 每秒写数据量

Avg. DiskQueue Length12/4=3每块磁盘平均队列建议超2

Avg. DiskSec/Read般要超11~15ms

Avg. DiskSec/Write般建议于12ms

面结我看磁盘本身I/O能力满足我要求原量请求才导致队列等待能SQL语句导致量表扫描所致进行优化能达要求面公式帮助计算使用几块硬盘满足并发要求:

Raid 0 -- I/Os per disk = (reads +writes) / number of disks

Raid 1 -- I/Os per disk = [reads +(2 * writes)] / 2

Raid 5 -- I/Os per disk = [reads +(4 * writes)] / number of disks

Raid 10 -- I/Os per disk = [reads +(2 * writes)] / number of disks

我结:(320+400)/4=180根据公式①磁盘I/O值假设现I/O计数125达结:720/125=5.76说要用6块磁盘才能达要求

面Disk Reads/secDisk Writes/sec难确估算值能系统比较忙概估算平均值作计算公式依据另难客户Seek time、 Rotational latency参数值能用理论值125进行计算

前言

作数据库管理员关注系统性能重要工作所关注各面性能能IO性能却令痛块面着各种涩参数令眼花缭乱新奇术语再加存储厂商忽悠总让我种云雾觉本系列文章试图基本概念始磁盘存储相关各种概念进行综合归纳让家能够IO性能相关基本概念IO性能监控调整比较全面解

部我先舍弃各种结构复杂存储系统直接研究单独磁盘性能问题藉解各衡量IO系统系能各指标及间关系

几基本概念

研究磁盘性能前我必须先解磁盘结构及工作原理再重复说明关系硬盘结构工作原理信息参考维基百科面相关词条——Hard disk drive(英文)硬盘驱器(文)

读写IO(Read/Write IO) *** 作

磁盘用给我存取数据用说IO *** 作候存两种相应 *** 作存数据候应写IO *** 作取数据候应读IO *** 作

单IO *** 作

控制磁盘控制器接 *** 作系统读IO *** 作指令候控制器给磁盘发读数据指令并同要读取数据块址传递给磁盘磁盘读取数据传给控制器并由控制器返给 *** 作系统完写IO *** 作;同写IO *** 作类似控制器接写IO *** 作指令要写入数据并其传递给磁盘磁盘数据写入完 *** 作结传递控制器再由控制器返给 *** 作系统完写IO *** 作单IO *** 作指完写IO或者读IO *** 作

随机访问(Random Access)与连续访问(Sequential Access)

随机访问指本IO所给扇区址IO给扇区址相差比较磁两IO *** 作间需要作比较移作才能重新始读/写数据相反IO给扇区址与IO结束扇区址致或者接近磁能快始IO *** 作IO *** 作称连续访问尽管相邻两IO *** 作同刻发请求扇区址相差能称随机访问非连续访问

顺序IO模式(Queue Mode)/并发IO模式(BurstMode)

磁盘控制器能磁盘组发连串IO命令磁盘组能执行IO命令称顺序IO;磁盘组能同执行IO命令称并发IO并发IO能发由磁盘组磁盘组单块磁盘能处理IO命令

单IO(IO ChunkSize)

熟悉数据库都概念数据库存储基本块(Block Size)管SQL ServerOracle默认块都8KB数据库每读写都8k单位于数据库应用发固定8k单读写写磁盘层面呢于读写磁盘说单IO *** 作 *** 作数据少呢固定值答案确定首先 *** 作系统提高 IO性能引入文件系统缓存(File System Cache)系统根据请求数据情况自IO请求先放缓存面再性提交给磁盘说于数据库发8K数据块读 *** 作能放磁盘读IO处理于些存储系统提供缓存(Cache)接收 *** 作系统IO请求 *** 作系统 IO请求合并处理管 *** 作系统层面缓存磁盘控制器层面缓存目都提高数据读写效率每单独IO *** 作都主要取决于系统于数据读写效率判断

IO *** 作比较候我IO *** 作比说1K4K8K;IO *** 作数据量比较候称IO *** 作比说32K64K甚至更

我说块(Block Size)候通我接触类似概念像我面提数据库面数据管理单位Oralce称块(Block)般8KSQL Server称页(Page)般8k文件系统面我能碰文件系统块现Linux系统都4K(通 /usr/bin/time -v看)作用其实跟数据库面块/页都便数据管理说单IO跟些块都没直接关系英文单IO通称IO Chunk Size说IO Block Size

IOPS(IO per Second)

IOPSIO系统每秒所执行IO *** 作数重要用衡量系统IO能力参数于单磁盘组IO系统说计算IOPS件难事情要我知道系统完IO所需要间我能推算系统IOPS

现我推算磁盘IOPS假设磁盘转速(Rotational Speed)15K RPM平均寻道间5ms传输速率40MB/s(读写速度视实际差别比较)

于磁盘说完整IO *** 作进行:控制器磁盘发IO *** 作命令候磁盘驱臂(ActuatorArm)带读写磁(Head)离着陆区(LandingZone位于内圈没数据区域)移要 *** 作初始数据块所磁道(Track)程称寻址(Seeking)应消耗间称寻址间(SeekTime);找应磁道能马读取数据候磁要等磁盘盘片(Platter)旋转初始数据块所扇区(Sector)落读写磁才能始读取数据等待盘片旋转 *** 作扇区程消耗间称旋转延(RotationalDelay);接随着盘片旋转磁断读/写相应数据块直完IO所需要 *** 作全部数据程称数据传送(DataTransfer)应间称传送间(TransferTime)完三步骤IO *** 作完

我看硬盘厂商宣传单候我经能看3参数别平均寻址间、盘片旋转速度及传送速度三参数提供给我计算述三步骤间

第寻址间考虑读写数据能磁盘任意磁道既能磁盘内圈(寻址间短)能磁盘外圈(寻址间)所计算我考虑平均寻址间磁盘参数标明平均寻址间采用前10krmp硬盘5ms

第二旋转延寻址磁定位磁道能要读写扇区候需要额外额延立刻读写数据坏情况确实要磁盘旋转整整圈磁才能读取数据所我考虑平均旋转延于10krpm磁盘(60s/15k)*(1/2)= 2ms

第三传送间磁盘参数提供我传输速度要达种速度难度速度却磁盘纯读写磁盘速度要给定单IO我知道磁盘需要花费少间数据传送间IOChunk Size / Max Transfer Rate

现我计算单IO间公式:

IO Time = Seek Time + 60 sec/Rotational Speed/2 + IO ChunkSize/Transfer Rate

于我计算IOPS

IOPS = 1/IO Time = 1/(Seek Time + 60 sec/Rotational Speed/2 + IOChunk Size/Transfer Rate)

于给定同IO我面系列数据

4K (1/7.1 ms = 140 IOPS)

5ms + (60sec/15000RPM/2) + 4K/40MB = 5 + 2 + 0.1 = 7.1

8k (1/7.2 ms = 139 IOPS)

5ms + (60sec/15000RPM/2) + 8K/40MB = 5 + 2 + 0.2 = 7.2

16K (1/7.4 ms = 135 IOPS)

5ms + (60sec/15000RPM/2) + 16K/40MB = 5 + 2 + 0.4 = 7.4

32K (1/7.8 ms = 128 IOPS)

5ms + (60sec/15000RPM/2) + 32K/40MB = 5 + 2 + 0.8 = 7.8

64K (1/8.6 ms = 116 IOPS)

5ms + (60sec/15000RPM/2) + 64K/40MB = 5 + 2 + 1.6 = 8.6

面数据看单IO越候单IO所耗费间越少相应IOPS越

面我数据都比较理想假设理想情况磁盘要花费平均寻址间平均旋转延假设其实比较符合我实际情况随机读写随机读写每IO *** 作寻址间旋转延都能忽略计两间存限制IOPS现我考虑种相极端顺序读写 *** 作比说读取存储连续布磁盘文件文件存储布连续磁完读IO *** 作需要新寻址需要旋转延种情况我能IOPS值

4K (1/0.1 ms = 10000 IOPS)

0ms + 0ms + 4K/40MB = 0.1

8k (1/0.2 ms = 5000 IOPS)

0ms + 0ms + 8K/40MB = 0.2

16K (1/0.4 ms = 2500 IOPS)

0ms + 0ms + 16K/40MB = 0.4

32K (1/0.8 ms = 1250 IOPS)

0ms + 0ms + 32K/40MB = 0.8

64K (1/1.6 ms = 625 IOPS)

0ms + 0ms + 64K/40MB = 1.6

相比第组数据说差距非我要用IOPS衡量IO系统系能候我定要说清楚情况IOPS要说明读写式及单IO实际特别OLTP系统随机IO读写说服力

传输速度(Transfer Rate)/吞吐率(Throughput)

现我要说传输速度(另见说吞吐率)磁盘所表明传输速度或者说理想传输速度磁盘实际使用候磁盘系统总线流数据量IOPS数据我容易能计算应传输速度

Transfer Rate = IOPS * IO Chunk Size

面第组IOPS数据我相应传输速度

4K: 140 * 4K = 560K / 40M = 1.36%

8K: 139 * 8K = 1112K / 40M = 2.71%

16K: 135 * 16K = 2160K / 40M = 5.27%

32K: 116 * 32K = 3712K / 40M = 9.06%

看实际传输速度总线利用率非

定要明确概念尽管面我使用IOPS计算传输速度实际传输速度IOPS没直接关系没缓存情况共同决定素都磁盘系统访问式及单IO磁盘进行随机访问候我利用IOPS衡量磁盘系统性能传输速度太;磁盘进行连续访问IOPS已经没参考价值候限制实际传输速度却磁盘传输速度实际应用用IOPS 衡量IO随机读写性能要衡量IO连续读写性能候要采用传输速度能IOPS

IO响应间(IOResponse Time)

关注能直接描述IO性能IO响应间IO响应间称IO延(IOLatency)IO响应间 *** 作系统内核发读或者写IO命令 *** 作系统内核接收IO应间注意要单IO间混淆单IO间仅仅指IO *** 作磁盘内部处理间IO响应间要包括IO *** 作IO等待队列所花费等待间

计算IO *** 作等待队列面消耗间衍于利托氏定理(Little’sLaw)排队模型M/M/1模型遵循由于排队模型算比较复杂现没搞太明白(谁M/M/1模型比较精通欢迎给予指导)罗列结面计算IOPS数据说:

8K IO Chunk Size (135 IOPS, 7.2 ms)

135 =>240.0 ms

105 =>29.5 ms

75 =>15.7 ms

45 =>10.6 ms

64K IO Chunk Size(116 IOPS, 8.6 ms)

135 =>没响应……

105 =>88.6 ms

75 =>24.6 ms

45 =>14.6 ms

面数据看随着系统实际IOPS越接近理论值IO响应间非线性增越接近值响应间变越且比预期超般说实际应用70%指导值说IO读写队列队列于IOPS70%候IO响应间增加相说让比较能接受旦超70%响应间戏剧性暴增所系统IO压力超承受压力70%候必须要考虑调整或升级

另外补充说70%指导值适用于CPU响应间实践证明旦CPU超70%系统变受慢意思东西

篇文章计算我看15k转速磁盘随机读写访问情况IOPS竟140左右实际应用我却能看标5000IOPS甚至更高存储系统IOPS存储系统呢要归结于各种存储技术使用些存储技术使用广高速缓存(Cache)磁盘冗余阵列(RAID)本文探讨缓存磁盘阵列提高存储IO性能

高速缓存(Cache)

各种存储产品按照速度快慢应该内存>闪存>磁盘>磁带速度越快意味着价格越高闪存虽说发展势目前说却价格问题普及现磁盘作霸王代与CPU内存速度相比磁盘速度疑计算机系统瓶颈所必须使用磁盘想提高性能情况想磁盘嵌入块高速内存用保存经访问数据提高读写效率折解决块嵌入内存称高速缓存

说缓存东西应用现已经处处于层应用 *** 作系统层再磁盘控制器CPU内部单磁盘内部都存缓存所些缓存存目都相同提高系统执行效率我关跟IO性能相关缓存与IO性能直接相关几缓存别文件系统缓存(FileSystem Cache)、磁盘控制器缓存(DiskController Cache)磁盘缓存(DiskCache,称DiskBuffer)计算磁盘系统性能候文件系统缓存考虑内我重点考察磁盘控制器缓存磁盘缓存

管控制器缓存磁盘缓存所起作用主要三部:缓存数据、预读(Read-ahead)写(Write-back)

缓存数据

首先系统读取数据缓存高速缓存再需要读取相同数据候用访问磁盘直接缓存取数据使用数据能缓存永久保留缓存数据般采取LRU算进行管理目间用数据清除缓存些经访问却能直保留缓存直缓存清空

预读

预读指采用预读算没系统IO请求候事先数据磁盘读入缓存系统发读IO请求候实现检查看看缓存面否存要读取数据存(即命)直接结返候磁盘再需要寻址、旋转等待、读取数据序列 *** 作能节省间;没命则再发真读取磁盘命令取所需要数据

缓存命率跟缓存关系理论缓存越所能缓存数据越命率自越高缓存能太毕竟本呢容量存储系统配备读缓存候问题比较缓存数据量非相比整存储系统说比例非低随机读取(数据库系统数情况)候命率自低缓存能提高效率(绝部读IO都要读取磁盘)反每匹配缓存浪费间

执行读IO *** 作读取数据存于缓存数量与全部要读取数据比值称缓存命率(ReadCache Hit Radio)假设存储系统使用缓存情况随机IO读取能达150IOPS缓存能提供10%缓存命率实际IOPS达150/(1-10%)=166

首先说用于写功能部缓存称写缓存(WriteCache)套写缓存打存储 *** 作系统所发系列写IO命令并挨执行些写IO命令先写入缓存再性缓存修改推磁盘相于些相同IO合并连续 *** 作IO合并IO随机写IO变组连续写IO能减少磁盘寻址等 *** 作所消耗间提高磁盘写入效率

读缓存虽效率提高明显所带问题比较严重缓存普通内存掉点数据全部丢失 *** 作系统发写IO命令写入缓存即认写入功实际数据没真写入磁盘掉电缓存数据永远丢失应用说灾难性目前解决问题给缓存配备电池保证存储掉电缓存数据能数保存

读写缓存存写缓存命率(WriteCache Hit Radio)读缓存命情况尽管缓存命能实际IO *** 作免掉合并已

控制器缓存磁盘缓存除面作用外承着其作用比磁盘缓存保存IO命令队列功能单磁盘能处理IO命令却能接收IO命令些进入磁盘未处理命令保存缓存IO队列

RAID(Redundant Array Of InexpensiveDisks)

位数据库管理员或者经接触服务器RAID应该熟悉作廉价存储解决案RAID早已服务器存储普及RAID各级别应RAID10RAID5(RAID5已经基本走RAID6崛起看看解原)应用广面RAID0RAID1RAID5RAID6RAID10几种级别RAID展说磁盘阵列于磁盘性能影响阅读面内容前必须各级别RAID结构工作原理要熟悉才行才至于满雾水推荐查看wikipedia面条目:RAIDStandardRAID levelsNested RAID levels


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/6245997.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-19
下一篇 2023-03-19

发表评论

登录后才能评论

评论列表(0条)

保存