作者:【吴业亮】
博客:http://blog.csdn.net/wylfengyujiancheng
一、存储模型
1、如果将存储系统比作一个排队模型
1)、去前台取单号
2)、等待排在你之前的人办完业务
3)、轮到你去某个柜台
4)、柜台职员帮你办完手续1
5)、柜台职员帮你办完手续2
6)、柜台职员帮你办完手续3
7)、办完业务,从柜台离开
2、如何评估银行的效率呢:
服务时间 = 手续1 + 手续2 + 手续3
响应时间 = 服务时间 + 等待时间
性能 = 单位时间内处理业务数量
3、那银行如何提高效率呢:
增加柜台数
降低服务时间
4、排队系统或存储系统的优化方法是
增加并行度
降低服务时间
二、机械盘存储原理
每个硬盘都有一个磁头(相当于银行的柜台),硬盘的工作方式是:
1)、收到IO请求,得到地址和数据大小
2)、移动磁头(寻址)
3)、找到相应的磁道(寻址)
4)、读取数据
5)、传输数据
则磁盘的随机IO服务时间: 服务时间 = 寻道时间 + 旋转时间 + 传输时间
对于10000转速的SATA硬盘来说,一般寻道时间是7 ms,旋转时间是3 ms, 64KB的传输时间是 0.8 ms, 则SATA硬盘每秒可以进行随机IO操作是 1000/(7 + 3 + 0.8) = 93,所以我们估算SATA硬盘64KB随机写的IOPS是93。一般的硬盘厂商都会标明顺序读写的MBPS。
三、使用fio性能测试
1、安装fio测试工具
# yum install fio -y
2、创建配置文件fio.conf并执行测试
# fio fio.conf -output=fio-all.log
配置文件如下:
[global]
ioengine=libaio
time_based
direct=1
thread
group_reporting
randrepeat=0
norandommap
numjobs=1
ramp_time=60
runtime=1200
size=500G
filename=/dev/rbd0
[randread-4k-io32]
bs=4k
iodepth=32
rw=randread
stonewall
[randwrite-4k-io32]
bs=4k
iodepth=32
rw=randwrite
stonewall
[randread-8k-io32]
bs=8k
iodepth=32
rw=randread
stonewall
[randwrite-8k-io32]
bs=8k
iodepth=32
rw=randwrite
stonewall
[read-64k-io32]
bs=64k
iodepth=32
rw=read
stonewall
[write-64k-io32]
bs=64k
iodepth=32
rw=write
stonewall
[rw-64k-io32]
bs=64k
iodepth=32
rw=rw
rwmixread=70
stonewall
3、io的参数说明
1)、ioengine: 负载引擎,我们一般使用libaio,发起异步IO请求。
2)、bs: IO大小
3)、direct: 直写,绕过操作系统Cache。因为我们测试的是硬盘,而不是操作系统的Cache,所以设置为1。
4)、rw: 读写模式,有顺序写write、顺序读read、随机写randwrite、随机读randread等。
5)、size: 寻址空间,IO会落在 [0, size)这个区间的硬盘空间上。这是一个可以影响IOPS的参数。一般设置为硬盘的大小。
6)、filename: 测试对象
7)、iodepth: 队列深度,只有使用libaio时才有意义。这是一个可以影响IOPS的参数。
8)、runtime: 测试时长
9)、–output TestResult.log:日志输出到TestResult.log。
其中8k读执行结果如下:
关注参数
1)、IOPS 67763,
2)、每个IO请求的平均响应时间,大约是2.6ms。
3)、95%的IO请求的响应时间是小于等于 9.024 ms。
4)、该硬盘的利用率已经达到了100%。