如何使用fio模拟线上环境
线上表现
这里我想通过fio来模拟线上的IO场景,那么如何模拟呢?
首先使用iostat看线上某个盘的 使用情况,这里我们需要关注的是 avgrq-sz, avgrq-qz.
#iostat -dx 1 1000 /dev/sdk
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdk 0.22 16.32 71.08 49.98 23544.95 19763.38 715.45 0.65 5.34 7.64 2.08 5.21 63.04
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdk 0.00 0.00 81.00 78.00 26968.00 39936.00 841.56 143.32 683.93 38.35 1354.35 6.29 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdk 0.00 0.00 115.00 10.00 36940.00 5120.00 672.96 156.64 167.23 30.00 1745.40 7.99 99.90
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdk 0.00 44.00 107.00 28.00 37924.00 13496.00 761.78 149.48 584.97 33.19 2693.57 7.41 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdk 2.00 0.00 153.00 5.00 40896.00 2560.00 550.08 158.39 160.71 29.68 4170.20 6.33 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdk 0.00 0.00 89.00 88.00 28864.00 44424.00 828.11 143.19 2087.81 22.73 4176.35 5.65 100.00
- avgrq-sz: 和fio的-bs=参数关联, 单位是扇区数,一个扇区的大小是512KB,因此, 841.56 代表大小是: 841.56/2 = 420.78KB.
- avgra-gz: 和fio的iodepth关联,大概是150,因此,我们需要调整 fio的 iodepth的值
线下模拟
那么如何使用fio去模拟这个大小呢?
fio中最重要的一个参数是: -bs=xxxx, 我们经常看到这里是4k,16k,128k等等的测试数据,这里其实就是request 从elevator中出来,dispatch到driver的时候的大小。
线上机器 大小是 841.56 sector (420.78KB.)的时候, 意味着,这里, -bs=420k 比较合适。
需要注意的:
- 如果测试/dev/sdc, so, mount /dev/sdc /mnt/sdc , fio目标是/mnt/sdc/test, 而不是 /dev/sdc
- 线上差不多4个线程, numjobs = 4
- 线上读写比例3:1, So, -rwmixread=70
#fio -filename=/mnt/sdc/test -direct=1 -iodepth=4 -thread -rw=randrw -rwmixread=70 -ioengine=libaio -bs=420k -size=2G -numjobs=4 -name="EBS 4K randwrite test" -group_reporting -runtime=5000
avgqu-sz 和fio的iodepth 的关系
iodepth = 1, iostat avgqu-sz =
#fio -filename=/apxxxxxxx/disk3/test -direct=1 -iodepth=1 -thread -rw=randrw -rwmixread=70 -rwmixwrite=30 -ioengine=libaio -bs=4k -size=8G -numjobs=4 -name="EBS 4K randwrite test" -group_reporting -runtime=50000
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 226.00 125.00 904.00 500.00 8.00 12.00 11.36 17.29 0.62 2.85 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 1.00 23.00 6.00 92.00 28.00 8.28 12.91 16.41 20.61 0.33 34.48 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 186.00 99.00 744.00 396.00 8.00 12.21 30.16 39.33 12.94 3.51 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 207.00 108.00 828.00 432.00 8.00 12.00 12.87 19.07 1.00 3.17 100.00
iodepth = 100, iostat avgqu-sz =
#fio -filename=/axxxxxx/disk3/test -direct=1 -iodepth=100 -thread -rw=randrw -rwmixread=70 -rwmixwrite=30 -ioengine=libaio -bs=4k -size=8G -numjobs=4 -name="EBS 4K randwrite test" -group_reporting -runtime=50000
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 180.00 68.00 720.00 272.00 8.00 111.30 230.22 231.29 227.40 2.85 70.80
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 241.00 103.00 964.00 412.00 8.00 159.43 392.41 395.76 384.58 2.91 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 254.00 89.00 1016.00 356.00 8.00 158.65 465.12 436.02 548.17 2.92 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 261.00 114.00 1044.00 456.00 8.00 156.64 395.21 440.19 292.23 2.67 100.00
开始模拟: cfq对SYNC, ASYNC的影响
Case1: fio 使用-direct=1
这里read write都是SYNC, 由于cfq 的影响,保SYNC, 因为线上的场景是 SYNC 的read, 和ASYNC的 writeback,所以这样模拟是不对的
command:
#fio -filename=/apsarapangu/disk3/test -direct=1 -iodepth=130 -thread -rw=randrw -rwmixread=70 -rwmixwrite=30 -ioengine=libaio -bs=420k -size=8G -numjobs=4 -name="EBS 4K randwrite test" -group_reporting -runtime=50000
performance:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 106.00 56.00 43084.00 23868.00 826.57 297.76 609.85 539.71 742.61 6.17 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 100.00 57.00 40740.00 22752.00 808.82 307.53 1015.72 893.46 1230.21 6.37 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 95.00 50.00 37556.00 20160.00 796.08 278.35 1181.94 1041.71 1448.40 6.90 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 1.00 59.00 74.00 23940.00 28568.00 789.59 223.16 2312.37 1595.39 2884.01 7.52 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 79.00 32.00 32340.00 12956.00 816.14 299.97 1007.95 744.37 1658.66 9.01 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 124.00 41.00 50616.00 17656.00 827.54 303.84 1060.12 906.26 1525.46 6.06 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 106.00 47.00 43368.00 18532.00 809.15 290.17 1676.39 1099.78 2976.83 6.54 100.00
Analyze: Not I want!
Case2: fio 不使用-direct=1
这里read write都是SYNC, 由于cfq 的影响,保SYNC, 因为线上的场景是 SYNC 的read, 和ASYNC的 writeback,这里就和线上比较相似。
command:
#fio -filename=/apsarapangu/disk3/test -iodepth=130 -thread -rw=randrw -rwmixread=70 -rwmixwrite=30 -ioengine=libaio -bs=420k -size=8G -numjobs=4 -name="EBS 4K randwrite test" -group_reporting -runtime=50000
when cfq:
#echo cfq > /sys/block/sdc/queue/scheduler
Performance:
- when read and writeback reproduce at the same time:
- cfq have a good performance better than noop at this scene!
- Cause cfq and split SYNC and ASYNC, SYNC have a better priority!
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 353.00 8.00 41768.00 3504.00 250.81 148.39 91.06 40.39 2326.88 2.77 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 374.00 4.00 45348.00 1864.00 249.80 145.76 64.60 30.51 3251.75 2.65 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 2.00 201.00 32.00 19400.00 12756.00 276.02 175.74 581.51 100.38 3603.59 4.29 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 384.00 1.00 46524.00 420.00 243.86 171.37 48.15 34.22 5396.00 2.60 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 346.00 0.00 50388.00 0.00 291.26 167.22 29.55 29.55 0.00 2.89 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 417.00 0.00 46424.00 0.00 222.66 168.39 26.64 26.64 0.00 2.40 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 365.00 1.00 47996.00 420.00 264.57 166.98 50.49 30.11 7492.00 2.73 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 9.00 271.00 101.00 30148.00 41796.00 386.80 161.59 2375.33 30.86 8665.95 2.69 100.00
when noop:
#echo noop > /sys/block/sdc/queue/scheduler
Performance:
- When read and writeback reproduce at the same time
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 3.00 69.00 248.00 1864.00 100800.00 647.72 178.71 580.56 537.20 592.62 3.15 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 2.00 63.00 246.00 1568.00 100412.00 660.06 173.11 583.21 523.25 598.57 3.24 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 0.00 33.00 90.00 912.00 36544.00 609.04 181.04 1077.03 1079.82 1076.01 8.13 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 2.00 59.00 242.00 1436.00 100800.00 679.31 183.44 732.01 565.46 772.62 3.32 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 1.00 66.00 250.00 2364.00 102060.00 660.91 176.00 567.93 513.26 582.36 3.16 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 2.00 71.00 251.00 1700.00 104160.00 657.52 177.67 569.05 513.06 584.88 3.11 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdc 0.00 6.00 44.00 233.00 1764.00 96180.00 707.18 161.17 604.32 542.25 616.04 3.61 100.00
muahao@aliyun.com