Linux 磁盘性能测试

背景知识:

IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。随机读写频繁的应用,如OLTP(Online Transaction Processing),IOPS是关键衡量指标。理论上,对于机械硬盘,最小读写单位为一个sector(512byte),所以每次传输数据为512byte时测试的IOPS为机械硬盘的最大IOPS,实际上受磁盘文件系统影响,一般以文件系统的block_size为每次传输数据的大小测试出来的IOPS为最大。IOPS主要测试硬盘的随机读写(磁头定位)能力,此时数据传输的时间可以忽略。
数据吞吐量(Throughput),另一个重要指标,指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(Video On Demand),此时的IOPS很低,则更关注吞吐量指标。

磁盘操作时,IOPS达到磁盘最大IOPS时,IOPS成为瓶颈;反之Throughput则是瓶颈。

Linux O_DIRECT,O_SYNC flag:

  1. 一般情况下(无O_DIRECT,无O_SYNC flag),用户数据写入磁盘顺序如下:

  2. 用户数据写入用户内存空间stdio缓冲区;

  3. 当stdio缓冲区填满后,调用I/O系统调用write()写入内核IO缓冲区;

  4. 系统定时或根据实际情况写入磁盘。

  5. 当有O_DIRECT无O_SYNC flag时,步骤变为:

  6. 用户数据直接调用I/O系统调用write()写入内核IO缓冲区;

  7. 系统定时或根据实际情况写入磁盘。

  8. 当无O_DIRECT,有O_SYNC flag都有时,步骤变为:

  9. 用户数据写入用户内存空间stdio缓冲区;

  10. 当stdio缓冲区填满后,调用I/O系统调用write()写入内核IO缓冲区同时写入磁盘。

  11. 当O_DIRECT,O_SYNC flag都有时,步骤变为:

  12. 用户数据直接调用I/O系统调用write()写入内核IO缓冲区同时写入磁盘。

在所有(ABCD)情况下,对用户而言,第1步完成了就算写入成功即使数据还在缓冲区里。所以ABC情况下测试的数据都不是真实的磁盘性能。下面我们来测试真实的磁盘性能:

sysbench测试

测试磁盘最大IOPS,用随机写测试:

$ sysbench --test=fileio --num-threads=1 --max-requests=0 --max-time=30
–file-num=8 --file-total-size=1G --file-test-mode=rndwr --file-block-size=4K
–file-fsync-freq=1 --file-extra-flags=direct run

说明:

–file-fsync-freq=1 每个request做一次sync(O_SYNC flag);

–file-extra-flags=direct 相当于O_DIRECT flag

结果:

Read 0b Written 2.2812Mb Total transferred 2.2812Mb (77.841Kb/sec)

19.46 Requests/sec executed

IOPS=143.73,磁盘每秒能写19.46 次。

测试磁盘吞吐量(throughput),用顺序写测试:

$ sysbench --test=fileio --num-threads=1 --max-requests=0 --max-time=30
–file-num=8 --file-total-size=1G --file-test-mode=seqwr --file-block-size=16M
–file-fsync-freq=1 --file-extra-flags=direct run

结果:

Read 0b Written 1Gb Total transferred 1Gb (88.034Mb/sec)

5.50 Requests/sec executed

吞吐量(throughput)= 88.034Mb/sec,但是每秒只有5.98
个requests,就是说磁头只需要移动5.50 次,低于IOPS,瓶颈在吞吐量上。

用顺序读测试:

$ sysbench --test=fileio --num-threads=1 --max-requests=0 --max-time=30
–file-num=8 --file-total-size=1G --file-test-mode=seqrd --file-block-size=16M
–file-fsync-freq=1 --file-extra-flags=direct run

结果:

Read 1Gb Written 0b Total transferred 1Gb (104.41Mb/sec)

6.53 Requests/sec executed

用随机读测试:

$ sysbench --test=fileio --num-threads=1 --max-requests=0 --max-time=30
–file-num=8 --file-total-size=1G --file-test-mode=rndrd --file-block-size=16M
–file-fsync-freq=1 --file-extra-flags=direct run

结果:

Read 2.9844Gb Written 0b Total transferred 2.9844Gb (101.49Mb/sec)

6.34 Requests/sec executed

dd测试

测试IOPS(写):

$ dd if=/dev/zero of=disk.test oflag=direct,sync count=512 ibs=1K obs=1K

说明:

oflag=direct,sync 就是写入时设置O_DIRECT和O_SYNC

结果:

524288 bytes (524 kB) copied, 25.2116 s, 20.8 kB/s

相当于IOPS=20.8

测试IOPS(读):

$ dd if=disk.test of=/dev/null iflag=direct,sync count=512 ibs=1K obs=1K

524288 bytes (524 kB) copied, 0.0529684 s, 9.9 MB/s

这个结果显然缓冲起作用了,说明读取时不受O_DIRECTO_SYNC影响,下面的吞吐量测试也能看到这一结果。

测试吞吐量(写):

$ dd if=/dev/zero of=disk.test oflag=direct,sync count=64 ibs=16M obs=16M

1073741824 bytes (1.1 GB) copied, 13.7279 s, 78.2 MB/s

测试吞吐量(读):

$ dd if=disk.test of=/dev/null iflag=direct,sync count=64 ibs=16M obs=16M

1073741824 bytes (1.1 GB) copied, 9.9118 s, 108 MB/s

$ dd if=disk.test of=/dev/null count=64 ibs=16M obs=16M

1073741824 bytes (1.1 GB) copied, 9.93738 s, 108 MB/s

iflag有没有设置结果都一样。

iostat

查看每5秒钟IO

$ iostat -kx 5

avg-cpu: %user %nice %system %iowait %steal %idle

0.35 0.00 0.50 20.91 0.00 78.23

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util

sda 0.00 4.20 0.00 78.60 0.00 331.20 8.43 1.34 16.99 12.67 99.60

参数说明:

rrqm/s: 每秒进行 merge 的读操作数目.
wrqm/s: 每秒进行 merge 的写操作数目.
r/s: 每秒读请求次数,不是实际需要读磁盘读次数. 实际需要读次数=(r/s) /
(rrqm/s).
w/s: 每秒写请求次数,不是实际需要写次数. 实际需要写次数=(w/s) /
(wrqm/s).
rsec/s: 每秒读扇区数.
wsec/s: 每秒写扇区数.
rKB/s: 每秒读K字节数.
wKB/s: 每秒写K字节数.
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区).
avgqu-sz: 平均I/O队列长度.
观察磁盘瓶颈最直观的一个参数,如果大于1表明磁盘来不及读写,磁盘达到性能瓶颈.
await: 平均每次设备I/O操作的等待时间 (毫秒).
svctm: 平均每次设备I/O操作的服务时间 (毫秒).
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O
队列是非空的.

别人一个不错的例子(I/O 系统 vs. 超市排队)

举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢?
首当是看排的队人数,5个人总比20人要快吧?
除了数人头,我们也常常看看前面人购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队排了.还有就是收银员的速度了,如果碰上了连钱都点不清楚的新手,那就有的等了.另外,时机也很重要,可能5分钟前还人满为患的收款台,现在已是人去楼空,这时候交款可是很爽啊,当然,前提是那过去的
5 分钟里所做的事情比排队要有意义 (不过我还没发现什么事情比排队还无聊的).

I/O 系统也和超市排队有很多类似之处:

r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (%util)类似于收款台前有人排队的时间比例。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值