Home > Linux, 工具介绍 > Linux下Fio和Blktrace模拟块设备的访问模式

Linux下Fio和Blktrace模拟块设备的访问模式

March 12th, 2011

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Linux下Fio和Blktrace模拟块设备的访问模式

我们在做块设备调优的时候, 我们关心的是块设备是如何被访问的,也就是访问模式(比如说每次从什么地方读,每次读多少块,热点在哪里等),至于每次读写的什么数据我们并不关心. 这些模式当然可以自己去构造,但是如果能把真实应用的访问模式记录下来,并且在调优的时候能重放,我们就可以一遍又一遍的调试直到达到最佳的性能.

这个事情听起来貌似很麻烦,对吧? 幸运的是fio配合blktrace可以作这样的事情. 流程是blktrace负责录制真实应用对设备的访问模式, fio负责读入这些模式, 同时重放模拟对设备的访问.

背景资料:
blktrace使用可以参看这里
fio使用可以参看这里

在做演示前需要强调的是: 对设备的读写是模拟它的模式, 所以会破坏原来的数据,请谨慎, 我也是用虚拟的设备作演示的:

我们要演示的设备是 /dev/ram0, 设备大小128M:

$ uname -r
2.6.35-22-generic
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.10
DISTRIB_CODENAME=maverick
DISTRIB_DESCRIPTION="Ubuntu 10.10"
$ sudo blockdev --getsize /dev/ram0
131072

在终端#1里面运行blktrace捕获设备的访问模式:

$ sudo blktrace /dev/ram0

在终端#2里面运行应用程序,这里只是简单的运行下dd在设备上写入64K数据:

$ sudo sudo dd if=/dev/zero of=/dev/ram0 count=16 bs=4096 oflag=direct
记录了16+0 的读入
记录了16+0 的写出
65536字节(66 kB)已复制,9.219e-05 秒,711 MB/秒

回到终端#1:

按下CTRL+C终止blktrace的运行, 可以看到该设备的录制文件有了.

$ ls ram0.blktrace.*
ram0.blktrace.0  ram0.blktrace.1

#转化成二进制文件格式
$ blkparse ram0 -d dd.bin >/dev/null

#重放日志:
$ sudo  fio  --name=replay --filename=/dev/ram0 --thread --direct=1 --read_iolog=dd.bin
replay: (g=0): rw=read, bs=4K-4K/4K-4K, ioengine=sync, iodepth=1
fio 1.50.2
Starting 1 thread
got timestamp notify: 4000001, 0

replay: (groupid=0, jobs=1): err= 0: pid=31484
  read : io=102400 B, bw=50000KB/s, iops=12500 , runt=     2msec
    clat (usec): min=6 , max=13 , avg= 6.56, stdev= 1.42
     lat (usec): min=7 , max=15 , avg= 7.84, stdev= 1.60
  write: io=65536 B, bw=32000KB/s, iops=8000 , runt=     2msec
    clat (usec): min=9 , max=39 , avg=11.88, stdev= 7.33
     lat (usec): min=10 , max=41 , avg=13.06, stdev= 7.53
  cpu          : usr=0.00%, sys=1000.00%, ctx=1, majf=0, minf=5
  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 r/w/d: total=25/16/0, short=0/0/0
     lat (usec): 10=68.29%, 20=29.27%, 50=2.44%

Run status group 0 (all jobs):
   READ: io=100KB, aggrb=50000KB/s, minb=51200KB/s, maxb=51200KB/s, mint=2msec, maxt=2msec
  WRITE: io=64KB, aggrb=32000KB/s, minb=32768KB/s, maxb=32768KB/s, mint=2msec, maxt=2msec

Disk stats (read/write):
  ram0: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=-nan%

如果我们用strace来跟踪会看到以下的系统调用, 确认我们的重放是成功的:

31350 open(“/dev/ram0”, O_RDWR|O_DIRECT|O_NOATIME) = 8
31350 ioctl(8, BLKFLSBUF, 0xffffffffffffffff) = 0
31350 fadvise64(8, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
31350 lseek(8, 0, SEEK_SET) = 0
31350 write(8, “\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0″…, 4096) = 4096
31350 write(8, “\30\260!\6\233\221\264\210\0036i\325\260u\331\17\300\306A)\324\307\221\17\3308\220\v\264\247\363\35″…, 4096) = 4096

总结: 该模拟破坏数据有风险, 但是省去了构造应用环境的时间,在调优的时候很有帮助.

玩得开心!

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Linux, 工具介绍 Tags: , , ,
  1. wuyun
    March 14th, 2011 at 11:28 | #1

    这个蛮有意义的,mark一下

  2. cccgw
    November 24th, 2011 at 15:13 | #2

    mark

  3. July 11th, 2012 at 11:36 | #3

    重放日志的时候出现“fio: filesetup.c:855: get_file: Assertion `fio_file_open(f)’ failed.”怎么回事

    Yu Feng Reply:

    用sudo 权限了吗

    ryanchen Reply:

    用了

    ryanchen Reply:

    解决了,是fio版本的问题,默认安装的是1.38,重新编译安装了2.0.8就没问题了。

    Yu Feng Reply:

    悲!

  4. Da Chun
    August 16th, 2013 at 12:06 | #4

    有工具能录制、模拟文件访问吗?

    Yu Feng Reply:

    文件层面的好做吧,写个stap脚本截获下文件相关的syscall就好吧

  5. hy110110
    October 30th, 2013 at 14:35 | #5

    请教一下,我用blktrace + fio回放的时候。
    如果抓取的数据是单路dd顺序写的,回放的数据是抓取时写的数据,数据量是一致的。
    如果抓取的数据是数据库场景产生的数据,回放的数据却是非常少,抓取了10几GB的数据,回放才100多MB。感觉在回放复杂场景下的IO有问题。但不知道问题在哪里。

    Yu Feng Reply:

    回头调研下。

  6. huang
    December 18th, 2013 at 23:07 | #6

    请问下,要回放的目的磁盘比录制的源磁盘空间小,会有问题吗?怎么办?

    Yu Feng Reply:

    肯定有问题

  7. huangbt
    January 3rd, 2014 at 15:30 | #7

    褚霸,请教下。我回放的时候,到这个就突然退出了
    Jobs: 1 (f=1): [M] [2.3% done] [127KB/624KB/0KB /s] [1/5/0 iops] [eta 58m:55s]
    然后有一个提示:
    fio: file hash not empty on exit
    但是我echo $?,退出码是0.
    这是正常的吗?如果是正常的,我录制的时候录制了很长时间,怎么回放一分多钟就回放完了?
    先谢过了!!!

    huangbt Reply:

    加了–debug=all看了下:
    io 15021 iolog: get 0/0//dev/sdf1
    io 15021 get_io_u: zero buflen on 0x71a590
    io 15021 get_io_u failed
    好像blktrace录制的时候录制到了大小为0的。不知道是不是blktrace的问题,我升级下版本看下

  8. Mengting
    July 18th, 2016 at 17:11 | #8

    您好,如果我的数据集是开源的,数据集名叫FIU Traces,文件格式是.blkparse,如果想要利用FIO进行回放,应该怎么做呢?直接是没法用的,那是不是得对这个开源的trace进行分析呢,如果要分析的话,分析完接下来要做什么处理呢?麻烦您了,贴一部分数据集如下:
    文件格式:
    [ts in ns] [pid] [process] [lba] [size in 512 Bytes blocks] [Write or Read] [major device number] [minor device number] [MD5 per 4096 Bytes]
    以下是trace的部分内容:
    0 318 kjournald 21128440 8 W 3 0 e790f4ea76270d5e08f221b891cbfdc8
    51952 318 kjournald 21128448 8 W 3 0 85f65be891e924b3567e97c1cc0fd896
    86313 318 kjournald 21128456 8 W 3 0 1773b70df9dbadbf0c2aaa4fc577b657
    121047 318 kjournald 21128464 8 W 3 0 54d78c17a0507e0c876ec805845b23a8
    155438 318 kjournald 21128472 8 W 3 0 5e5b2103c5166922cec2d1bc15f992ef
    188331 318 kjournald 21128480 8 W 3 0 9c57c6293c4a6f9653e4c254255d912c
    221648 318 kjournald 21128488 8 W 3 0 132e29a8045e5b233f672396321c346e
    256154 318 kjournald 21128496 8 W 3 0 4f8636339e3fc3b57c782a15fe420472
    289191 318 kjournald 21128504 8 W 3 0 53250b030464728fe2a5ee6265b554bc
    322623 318 kjournald 21128512 8 W 3 0 fe95405a6e3f0831c863c225a989ebe3
    355751 318 kjournald 21128520 8 W 3 0 479dbf0dd11c1ba191aa2700d4969aaa
    391417 318 kjournald 21128528 8 W 3 0 1c7de5ebc6b5aea6a46b8b01299b1b8f

  9. dqg
    November 23rd, 2016 at 08:53 | #9

    你好,请问我想在fio比对数据不一致的情况下,把写入的数据和读出的数据记录到日志,请问在fio源码什么地方修改,或者fio有没有类似功能?多谢!

  10. adolph
    December 5th, 2016 at 09:41 | #10

    您好,在做fio的replay 机制的时候,fio的read iolog 的格式是什么呢?

Comments are closed.