云硬盘读写功能测评

我的云服务器硬盘性能到底有多快,以及该如何衡量呢?

希望你看过本文后,至少以后不要再用dd命令了~

0x00 背景

你肯能会疑惑,测试硬盘性能,为什么不能用Linux系统自带的dd工具呢?而且不少人之前都这么用的:

dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync

其实这样做可能根本不能达到评测的目的。dd仅能作单线程的顺序写入工作,然后只报告一个类似吞吐量的数值,毕竟该命令最初就是用来dump disk的数据内容的。因为对于大部分典型的Web/数据库的服务器,是不可能只有这种写入模式的,所以dd显示的吞吐量不具备实际意义。另外,通常dd数据量过小,这个结果会很大程度上被云服务器所在的物理机缓存影响,且测试时间短,很可能测的不是一致的可持续的性能,而只是个峰值性能。另外,这个命令也几乎不能用来测试读性能。

那我们该用什么工具评测硬盘性能呢?别着急,我们先来看看该评测哪些指标。

0x01 硬盘性能指标

在开始评测前,我们必须先明确需要考虑哪些指标。对于I/O密集型系统,其指标最重要的是以下三个:

  • 吞吐量(Throughput):每秒的读写数据量,单位为MB/s。类似概念如:吞吐率、带宽、传输率等。
  • 时延(Latency):I/O 操作的发送时间到接收确认所经过的时间,单位通常为毫秒。类似概念如:响应时间、请求时间等。
  • IOPS(I/O per second):每秒读/写次数,单位为次(计数)。类似概念如:并发量、每秒请求RPS等。

而这几个指标,彼此并非是完全独立的,通常鱼与熊掌不可兼得,系统设计中常会做些妥协。且各类IO系统中,不论是硬盘还是网络,都会有类似概念的指标。我们将会在评测过后简要分析常见的优化思路。一般来讲,长时间的同类任务,通常系统吞吐量高更重要;短时间的随机任务,系统的时延小更重要,而在时延保证的前提下,IOPS越高系统的服务能力越强。

另外,最大峰值性能(maximum performance)不同于可持续性能(sustained performance),所以在评测时需要维持一段时间的稳定负载并统计平均值。

0x02 I/O访问模式

如上所述,既然这些云硬盘的指标的关注点各不相同,那该如何判断,其中哪个指标对我们的业务最重要,从而更针对地优化它进而提升性能或者降低成本呢?这就需要明确文件的访问模式了。

I/O访问模式访问特点典型的应用
流式读 Streaming Read全部读,大数据量顺序请求流媒体服务、视频传输
流媒体服务、视频传输全部写,大数据量顺序请求存储备份、归档、录像监控
在线事务处理 OLTP大量的并发随机读写请求,4K~16K数据库系统,在线业务系统
文件服务器 File Server主要为随机访问,4K~64K,大并发文件、打印、邮件、聊天、决策辅助系统
Web服务器大并发随机访问,4K~512KWeb服务、博客、在线电商、存储服务
工作站 WorkStation数据量中等,顺序/随机访问都有。云游戏,云电脑,个人PC也属于此类

所以我们在为业务系统选择存储产品时,需根据业务系统的特点针对性地具体评测以及选择,没有必要为了某一非重点特性或指标上无谓投入。根据业务类型确认访问模式,锁定性能指标最后通过合适的评测选择最具性价比的方案。

那么我们开始测吧~

0x03 fio介绍与使用

fio介绍与安装

fio,即flexible I/O tester,是更先进且系统的磁盘性能评测工具,目前各个主流云厂商都推荐用它来对硬件进行各种压力测试和验证,成为了当前公认的评测标准。fio作者是Jens Axboe,创建它是为了允许对特定的磁盘IO工作负载进行基准测试。fio于2012年左右发布且目前仍在活跃维护中,主要由C语言实现。

fio功能强大且特性丰富。通过fio,用户可以指定多个线程/进程来执行一种特定的IO负载。fio可以使用许多同步和异步IO API中的一个来发出IO请求,也可以使用各种API,允许通过一个API调用来发出许多IO请求。我们还可以调整fio使用的文件有容量大小,在这些文件中IO发生的偏移量是多少,甚至在发出IO请求之间有多少延迟,以及在每个IO请求之间是否有文件系统同步调用(同步调用是告诉操作系统,确保缓存在内存中的任何信息都已保存到磁盘上,因此可能会带来明显的延迟)。fio的选项允许指定非常精确的IO模式,如随机读写、顺序读写等,并查看磁盘子系统完成这些任务需要多长时间。

fio的安装过程非常简单,一般通过发行版的包管理工具(如yum、apt等)安装fio就行,如在CentOS下:

yum install fio
# 如果低版本的CentOS可能需要安装libaio库

fio常用命令参数

  • blocksize或bs: I/O单元的块大小,单位byte,默认4096,即4KB。最多可以有三个逗号分隔的数值,分别为指定reads、writes、trims的block size。
  • blocksize_range或bsrange: 块大小的范围。
  • ioengine: 指定如何发送I/O请求任务。fio支持多中I/O引擎,默认是psync(通过pread/pwrite系统调用),常见的还有sync(通过read/write/lseek),以及libaio(Linux中可以提升性能,且需要指定direct,Linux中带缓冲的I/O是不能异步的),甚至mmap、rdma、nbd等。
  • iodepth: I/O异步请求队列深度,默认为1,提升此值需要结合libaio和direct。
  • direct: 如果指定,执行non-buffered直接I/O,通常是通过写(write)相关的系统调用中的O_DIRECT参数完成的。默认是false。注意,如果用libaio需要指定此参数。
  • readwrite或rw: I/O模式类型,支持如read(顺序读) 、write(顺序写)、randread(随机读)、randwrite(随机写)、readwrite(混合顺序读写,混合默认是读写各半)、randrw(混合随机读写)等多中类型。默认是顺序读。
  • runtime: 指定测试进程的运行时长,默认单位是秒。
  • time_based: 如果设置了该值,fio会运行runtime设置的时长,即便文件已经完全读写完毕。fio会循环重复相同工作负载直到runtime指定的时长。
  • refill_buffers: FIO 将在每次提交时重新填充 I/O 缓冲区。默认设置是仅在初始时填充并重用该数据。
  • norandommap: 通常执行随机I/O时会覆盖全部每一个块。如果指定此参数,将选择新的偏移量而不查看 I/O 历史记录。
  • randrepeatat: 随机I/O模式中的随机数生成器是否可预测(重复)。
  • name: 测试任务(job)的名称。
  • size: 任务中每个线程的文件I/O的大小,不仅可以是数值,如1G,还可以是磁盘/文件总容量的百分比,如20%。
  • filename: 待测的目标文件/设备。
  • numjobs: 测试进程数。
  • group_reporting: 表示测试结果里汇总每个进程的统计信息,而非以不同job汇总展示信息。

注意,fio默认执行fsync,这点不同于dd。

fio性能评测示例

友情提示:尽量不要在系统盘上进行fio测试,避免损坏系统重要文件。另外,为避免底层文件系统元数据损坏导致数据损坏,也不要在业务数据盘上进行测试。

我们的测试环境:CentOS 8.2,高性能云硬盘,容量3T左右。

顺序写:评测云盘最大吞吐量

fio -name=write-throughput -readwrite=write -blocksize=128k -numjobs=8 -ioengine=libaio -iodepth=1 -direct=1 -runtime=60 -refill_buffers -norandommap -randrepeat=0 -group_reporting --size=10G -filename=/dev/vdb

测试吞吐量一般需要用大一些的block size,选择128K比较合适。如需要进一步同时提升IOPS,可以采取增加线程数(多核下更推荐,对时延影响相对小)以及增加队列深度(即iodepth参数,核数少时的办法)。

测试结果类似如下:

云硬盘读写功能测评

可以看到虽然吞吐量上去了,达到210MiB/s,但是并非没有有代价,时延达到了4ms左右,而IOPS不到2K。

随机读:评测云盘的时延和IOPS

fio -name=read-latency-iops -readwrite=randread -blocksize=4k -numjobs=8 -ioengine=libaio -iodepth=1 -direct=1 -runtime=60 -refill_buffers -norandommap -randrepeat=0 -group_reporting --size=10G -filename=/dev/vdb

评测时延和IOPS,一般用4K的随机读写的负载。因为4K往往是最小的读写寻址单元,比如对于SSD硬盘。同样类似的,提升IOPS可以通过增加线程数来完成。

测试结果类似如下:

云硬盘读写功能测评

可以看到,此时IOPS达到7K+,而平均请求时延也控制在了1ms,甚至大多数情况下更低,是比较理想的随机读写负载。当然,代价就是带宽吞吐量降到了30MiB/s左右。这里有个常见的权衡点:提升IOPS不能以牺牲太多时延为代价。因为时延是一种服务质量的体现,在CPU资源一定时,IOPS和时延是一定程度上负相关的,但如果能通过多线程/队列(引入CPU外援)等方法,可以在增加一些可忍的时延(如10%以内)但同时提升数倍的IOPS并发量,那么通常是值得的,也是常见的系统优化tradeoff。

结合控制台硬盘监控

另外,更方便地,我们可以在腾讯云的硬盘监控页实时查看它的状态:从硬盘的读写吞吐量到读写IOPS、I/O时延等。

云硬盘读写功能测评

前两行就是硬盘的读写吞吐量,而三、四行就是读写的IOPS。这些值和fio测试后统计的均值通常是一致的,可以互相佐证。再后面的I/O Await偏高可能意为着系统负载过重。而I/O Svctm可以反映出时延指标。其对与高性能云硬盘和SSD云盘时延差距不大,评测时一般0.5ms~5ms之间都可以算是正常的。最后是I/O的利用率(utilization),如果作为评测,一般是需要跑满的。

0x04 云盘评测结果

云厂商通常提供若干种类型的云盘,从机械硬盘到各种类型的SSD硬盘等等,那么该如何选择呢?

这里简单回顾下HDD(机械硬盘)和SSD(Solid State Disk)固态硬盘。机械硬盘是传统普通硬盘,它的构成主要由盘片,磁头、盘片转轴、控制电机、磁头控制器等部件构成,读写速度和转速(通常上万转)相关;而SSD盘是以固态电子存储芯片阵列组成,包括如闪存芯片、控制芯片、缓存芯片等。其实还有混合硬盘,在机械硬盘上加以闪存颗粒作为缓存以提升性能。典型的HDD和SSD示意图:

云硬盘读写功能测评

由于其结构的不同,二者在性能等多方面也差异巨大。一般来说,SSD比HDD机械硬盘在访问性能上是数十倍,能耗(质量、体积、功耗)和可靠性(防震、耐温)各方面上也有很大提升,所以现在的PC/笔记本等大多已选择了SSD固态硬盘。而HDD硬盘一般在容量和成本上更有优势。

那么对于云硬盘,是不是一定得用SSD了呢?其实未必,腾讯云的高性能云硬盘并不是普通的HDD,而是一种混合型存储,它通过缓存机制提供接近固态存储的高性能存储能力,和SSD硬盘并没有数量级的差异,在满足需求的场景下是个性价比不错的方案。

而且,随着技术和规模的发展,云上的SSD硬盘的也正在逐渐变得划算,而且单块的容量上也和HDD足够大了。另外,对于有超高IOPS的场景,基于NVME技术的增强型SSD云盘也完全没有问题。所以,还是看业务的需求选择最适合的类型。

下表格为在香港二区标准型S5机型(CentOS8.0系统)的1TiB单盘的实测结果:

云盘类型最大吞吐量(MiB/s)最大IOPS (次/秒)
高性能云硬盘1517480
SSD云硬盘26222.7K
增强型SSD35449.8K
云硬盘读写功能测评

所以选择一种适合的云盘吧。

0x05 性能优化总结

至此,我们已经更进一步熟悉了腾讯云云硬盘地类型与特点,对云硬盘主要的指标地概念以及各自的关系有了更深入地认识。当然最重要的,是更加系统地探索了如何根据业务特点进行针对地性能评测,进而选择最适合自己业务的云硬盘类存储产品。

祝你在腾讯云高效访问自己的数据~

0x06 参考资料

本文来自腾讯云计算社区,转载请注明出处:https://computeinit.com/archives/2761

发表评论

登录后才能评论
交流群