十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
#IOPS计算方法
传统磁盘本质上一种机械装置,如FC, SAS, SATA磁盘,转速通常为5400/7200/10K/15K rpm不等。影响磁盘的关键因素是磁盘服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。
寻道时间Tseek是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。
旋转延迟Trotation是指盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常使用磁盘旋转一周所需时间的1/2表示。比如,7200 rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000 rpm的磁盘其平均旋转延迟约为2ms。
数据传输时间Ttransfer是指完成传输所请求的数据所需要的时间,它取决于数据传输率,其值等于数据大小除以数据传输率。目前IDE/ATA能达到133MB/s,SATA II可达到300MB/s的接口数据传输率,数据传输时间通常远小于前两部分时间。因此,理论上可以计算出磁盘的大IOPS,即IOPS = 1000 ms/ (Tseek + Troatation),忽略数据传输时间。假设磁盘平均物理寻道时间为3ms, 磁盘转速为7200,10K,15K rpm,则磁盘IOPS理论大值分别为,
IOPS = 1000 / (3 + 60000/7200/2) = 140
IOPS = 1000 / (3 + 60000/10000/2) = 167
IOPS = 1000 / (3 + 60000/15000/2) = 200
固态硬盘SSD是一种电子装置, 避免了传统磁盘在寻道和旋转上的时间花费,存储单元寻址开销大大降低,因此IOPS可以非常高,能够达到数万甚至数十万。实际测量中,IOPS数值会受到很多因素的影响,包括I/O负载特征(读写比例,顺序和随机,工作线程数,队列深度,数据记录大小)、系统配置、操作系统、磁盘驱动等等。因此对比测量磁盘IOPS时,必须在同样的测试基准下进行,即便如何也会产生一定的随机不确定性。通常情况下,IOPS可细分为如下几个指标:
Toatal IOPS,混合读写和顺序随机I/O负载情况下的磁盘IOPS,这个与实际I/O情况最为相符,大多数应用关注此指标。
1、Random Read IOPS,100%随机读负载情况下的IOPS。
2、Random Write IOPS,100%随机写负载情况下的IOPS。
3、Sequential Read IOPS,100%顺序负载读情况下的IOPS。
4、Sequential Write IOPS,100%顺序写负载情况下的IOPS。
IOPS的测试benchmark工具主要有Iometer, IoZone, FIO等,可以综合用于测试磁盘在不同情形下的IOPS。对于应用系统,需要首先确定数据的负载特征,然后选择合理的IOPS指标进行测量和对比分析,据此选择合适的存储介质和软件系统。
#下载http://freshmeat.net/projects/fio/
#安装fio-2.0.13.tar.gz之前需要安装开发工具包、libaio和libaio-devel
yum installgroup "Development tools" OR:yum install gccyum install libaio-0.3.107-10.el6.x86_64.rpm libaio-devel-0.3.107-10.el6.x86_64.rpm
#fio参数
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 每个进程生成文件的数量。
bssplit=512/20:1k/20:2k/10:4k/40:8k/10
#2成512B,1KB,1成2KB,4成4KB,1成8KB的小文件进行测试
rw=randrw
rwmixread=80 #8成读,2成写
direct=1 #不使用io设备buffer
size=4g
numjobs=16 #产生16个进程
nrfiles=8 #每1个进程生成文件数量
ioengine=libaio
#IO engine,种类丰富,测试nfs,cpu,nic使用不同的引擎。
directory=/mnt
# IOMeter defines the server loads as the following:
# iodepth=1 Linear
# iodepth=4 Very Light
# iodepth=8 Light
# iodepth=64 Moderate
# iodepth=256 Heavy
iodepth=64 #每个文件io队列长度
lockmem=1g #fio只使用1g内存进行测试
zero_buffers 用0初始化系统buffer
一般fio配置文件和参数都是支持k/m/g的标识
#dd测试
1. dd if=/dev/zero of=test bs=64k count=16k
这个很不准确的,因为命令结束的时候数据还没有真正写到磁盘上去
2. dd if=/dev/zero of=test bs=64k count=16k conv=fsync
这个还算准确,数据已经写入磁盘
3. dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
这个可以当成是模拟数据库插入操作,所以很慢
接着让我们来看看buyvm的磁盘性能
dd if=/dev/zero of=test bs=64k count=16k
1073741824 bytes (1.1 GB) copied, 2.99687 seconds, 358 MB/s
第一种方式得到的结果貌似很快
dd if=/dev/zero of=test bs=64k count=16k conv=fsync
1073741824 bytes (1.1 GB) copied, 13.9241 seconds, 77.1 MB/s
这次慢了很多,这个数据才有参考价值
dd if=/dev/zero of=test bs=64k count=2k oflag=dsync
134217728 bytes (134 MB) copied, 177.813 seconds, 755 kB/s
这是buyvm的真正实力,我在84的vps上测可是有20M/s的
#HP DL2000 两块300G的SAS盘做成RAID1
1、直接读块设备,fio和dd测试吞吐量和IOPS
[root@localhost ~]# cat test.cfg
[global]
bs=1024k
ioengine=libaio
iodepth=4
size=1g
direct=1
filename=/dev/sda4
zero_buffers
[seq-read]
rw=read
stonewall
测试结果:
read : io=1024.0MB, bw=183735KB/s, iops=179 , runt= 5707msec
[root@localhost ~]# dd if=/dev/zero of=/dev/sda4 bs=16k count=65536 conv=fsync
65536+0 records in65536+0 records out
1073741824 bytes (1.1 GB) copied, 5.85287 s, 183 MB/s
2、通过读ext4文件系统,fio和dd测试吞吐量和IOPS
[root@localhost ~]# cat test.cfg
[global]
bs=1024k
ioengine=libaio
iodepth=4
size=1g
direct=1
filename=file
directory=/mnt
zero_buffers
[seq-read]
rw=read
stonewall
测试结果:
read : io=1024.0MB, bw=167264KB/s, iops=163 , runt= 6269msec
[root@localhost ~]# dd if=/dev/zero of=/mnt/file bs=16k count=65536 conv=fsync
65536+0 records in65536+0 records out
1073741824 bytes (1.1 GB) copied, 6.66798 s, 161 MB/s
#一起测试顺序读、随机读、顺序写、随机写
[seq-read]
rw=read
stonewall
[rand-read]
rw=randread
stonewall
[seq-write]
rw=write
stonewall
[rand-read]
rw=randwrite
stonewall
[read-write]
rw=randrw
stonewall