前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >评测云硬盘读写性能

评测云硬盘读写性能

原创
作者头像
溪歪歪
修改2021-01-12 15:28:27
8K7
修改2021-01-12 15:28:27
举报
文章被收录于专栏:巫山跬步

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

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

0x00 背景

通过讲解如何优雅扩容云硬盘,我们了解了云盘连接到服务器上的具体操作过程。那么,如何进一步了解已挂载硬盘的实际性能呢?你或许会疑惑,测试硬盘性能,为什么不能用Linux系统自带的dd工具呢?而且不少人之前都这么用的:

代码语言:txt
复制
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越高系统的服务能力越强。

另外,读写块大小(I/O Block Size)是非常重要的因素。在具体的性能评测中,吞吐量和IOPS有如下关系:

Throughput = IOPS * BlockSize

所以在评测最大吞吐量和最大IOPS时,需要针对地选择BlockSize;提升BlockSize,通常会使系统吞吐率提升,系统IOPS下降。

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

0x02 I/O访问模式

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

I/O访问模式

访问特点

典型的应用

流式读 Streaming Read

全部读,大数据量顺序请求

流媒体服务、视频传输

流式写 Streaming Write

全部写,大数据量顺序请求

存储备份、归档、录像监控

在线事务处理 OLTP

大量的并发随机读写请求,4K~16K

数据库系统,在线业务系统

文件服务器 File Server

主要为随机访问,4K~64K,大并发

文件、打印、邮件、聊天、决策辅助系统

Web服务器

大并发随机访问,4K~512K

Web服务、博客、在线电商、存储服务

工作站 WorkStation

数据量中等,顺序/随机访问都有。

云游戏,云电脑,个人PC也属于此类

访问模式(包括读写是随机/顺序,以及读写的比例)和读写的块大小(BlockSize)通常是影响I/O性能的关键。

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

那么我们开始测吧~

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下:

代码语言:txt
复制
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左右。

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

代码语言:txt
复制
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参数,核数少时的办法)。

测试结果类似如下:

通过128K的块大小让系统达到最大吞吐量
通过128K的块大小让系统达到最大吞吐量

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

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

代码语言:txt
复制
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可以通过增加线程数来完成。

测试结果类似如下:

通过4K随机读写测试云盘IOPS
通过4K随机读写测试云盘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示意图:

HDD vs SSD 结构
HDD vs SSD 结构

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

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

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

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

云盘类型

最大吞吐量(MiB/s)

最大IOPS (次/秒)

高性能云硬盘

151

7480

SSD云硬盘

262

22.7K

增强型SSD

354

49.8K

单块SSD比HDD随即读写性能强非常多,但云盘的差距远没有这么大。
单块SSD比HDD随即读写性能强非常多,但云盘的差距远没有这么大。

所以选择一种适合你的云盘,才是最具性价比的方案。

0x05 性能优化总结

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

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

欢迎订阅专栏:巫山跬步,关注本文作者:溪歪歪,持续获取云服务技术的最佳实践讲解。感谢点赞支持!

0x06 参考资料

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 背景
  • 0x01 硬盘性能指标
  • 0x02 I/O访问模式
  • 0x03 fio介绍与使用
    • fio介绍与安装
      • fio性能评测示例
        • 顺序写:评测云盘最大吞吐量
        • 随机读:评测云盘的时延和IOPS
      • 通过控制台云硬盘监控查看实时负载
      • 0x04 云盘评测结果
      • 0x05 性能优化总结
      • 0x06 参考资料
      相关产品与服务
      云服务器
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档