磁盘 I/O 的基准测试

当有新服务进行部署时,基准测试是必要的,这样的话能了解到系统的极限性能,可以选择更合适的方式去部署服务,或者当服务遇到性能瓶颈时,也有好的参照,是需要进行优化还是增加资源。

I/O 的真实性能比较难以测试,会涉及到两个方面,一个是文件系统 I/O, 一个是磁盘 I/O, 文件系统会有缓存操作,如果误用测试文件系统性能,往往会得到很好的结果,实际上与真实的磁盘性能相差甚远。在做磁盘 I/O 测试时,一定要使用 iostat 观察,通过直观的看,然后与测试结果进行比较,如果相差很大,需要调整测试方法。

测试指标

I/O 主要涉及两个指标,IOPS(每秒 IO 操作数),以及吞吐量(每秒 IO 大小)。

I/O 测试也需要很多参数调整,主要如下:

  • bock size 大小,读写的参数大小,主要分 4K, 8K, 16K, 64K, 1M 。需要根据应用情况,选择合适的参数。如果哪个不清楚,可以用 strace 跟踪应用,看下具体的大小,如果还不清楚,就用 4K
  • 读写模式,大体分为 顺序读,顺序写,随机读,随机写,顺序混合读写,随机混合读写
  • 操作的文件大小
  • 操作的线程数量,单线程还是多线程并发读写

dd

对于顺序读写,可以用 dd 很方便的得出结论。

上面使用 dd 测试写性能,bs 表示 block size, 每次操作大小为 64KB,count 为执行次数。但我们发现

iostat 显示 w/s 次数也就 200 左右,wkB/s 的文件操作也就 十几M 左右。但是 dd 显示性能很好。这里就是文件系统的影响,优先写入缓存,然后再由内核提交到磁盘设备。

我们增加了参数,使用了 direct 直接读写模式,绕过了系统缓存,然后通过 iostat 对比输出,发现数据指标基本一致了。

在测试读时,确保缓存没有影响,可以用 echo 1 > /proc/sys/vm/drop_caches 删除缓存。然后测试

以上都是单线程测试,可以开启多个 dd 开启测试,但是结果无法汇总,只能通过 iostat 观察。有时候,单线程的读写没有充分发挥性能,需要逐步增加观察。

fio

对于更复杂的读写模式测试,可以使用 fio 工具,可以从 https://github.com/axboe/fio 下载。或者 yum 安装 sudo yum install fio

测试顺序写

先来解释下参数

  • name 这个报告的名称

  • ioengine 使用的 I/O 引擎, sync 表示直接读写方式,调用 read or write

  • rw 读写模式, 我们选择顺序写测试

  • bs block size 大小
  • direct 是否设置 O_DIRECT 标记, 设置绕过系统缓存
  • size 测试文件大小
  • numjobs 并发执行线程数,并发执行多个写操作
  • runtime 最多运行 240s

报告输出如下

带 * 是重点关注的, write 可以看到 iops, 以及吞吐量 bw, 95M/s。

clat percentiles 统计的是提交 IO 任务到完成的时间间隔。可以关注 95%, 99% 之类的指标,总体的请求在多少时间内能完成。

顺序读

随机读

顺序读写混合, 读写比例各占一半

顺序读写混合,写占 20%

sysbench

sysbench 可以用来测试 CPU, 数据库,I/O 等性能指标。

查看测试 IO 的相关选项

使用 sysbench, 先进行准备阶段

会生成 8 个文件,每个文件大小 32G/8 = 4G。file-total-size 最好是测试机器内存的 2倍。

测试顺序写

file-test-mode 指定了测试模式, file-block-size 表示 block size, threads 表示运行的线程数。file-fsync-freq 表示刷新频率,默认每100次刷新一次。

结果如下

我们再测试下,关闭刷新频率的情况

发现比上面的性能要高,是不是每次刷新会提高性能吗?也不是,在测试过程中,要观察整个系统状况,CPU, 内存,IO 都要检查,第一次测试对系统影响较小,第二次系统压力更大,说明,第一次还没有充分发挥系统性能,可以增加线程数,或者文件个数。第二次基本到系统极限了,看上去性能要高。

测试顺序读

此条目发表在性能分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。