怎样测试云硬盘的性能
操作须知
测试性能时,若分区的初始磁柱编号是非4KiB对齐,则对性能影响较大,请先确保分区的初始磁柱编号已经4KiB对齐,再开始测试。
说明测试共享云硬盘性能时,必须满足以下要求:
共享云硬盘必须同时挂载至多台云主机(弹性云主机或者裸金属服务器)。
当共享云硬盘挂载至多台弹性云主机时,这些弹性云主机必须位于同一个策略为“反亲和性”的云主机组内。如果弹性云主机不满足反亲和性,则共享云硬盘性能无法达到最佳。
测试共享云硬盘性能时,必须满足以下要求:
- 共享云硬盘必须同时挂载至多台云主机(弹性云主机或者裸金属服务器)。
- 当共享云硬盘挂载至多台弹性云主机时,这些弹性云主机必须位于同一个策略为“反亲和性”的云主机组内。
如果弹性云主机不满足反亲和性,则共享云硬盘性能无法达到最佳。
测试方法分为以下两种:
- Windows
- Linux
Windows
本文以“Windows 7 Professional 64位”操作系统为例,不同操作系统的格式化操作可能不同,本文仅供参考,具体操作步骤和差异请参考对应操作系统的产品文档。
测试性能前请先安装Iometer性能测试工具,Iometer官网地址为http://www.iometer.org/ 。
步骤 1 登录云主机。
步骤 2 使用“win+r”组合键打开运行窗口,并输入“msinfo32”,单击“确定”。 弹出系统信息窗口。
步骤 3 选择“组件 > 存储 > 磁盘”,在右侧区域查看分区起始偏移值。
- 若4096能被该参数值整除,则表示已经4KiB对齐,请执行步骤 4 。
- 若4096不能被该参数值整除,则表示未4KiB对齐,如需继续测试请重新按照4KiB对齐分区。
注意删除分区并重新按照4KiB对齐选取初始磁柱编号时会导致磁盘原有数据的丢失,请谨慎操作。
步骤 4 使用Iometer工具测试磁盘性能,具体方法请参见Iometer产品文档。
在进行IOPS和吞吐量测试时,Iometer参数配置和fio工具的参数相同,具体请参考表fio参数说明。
以下为使用Iometer工具测试磁盘性能的一个示例:
- 设置工作流。
- 设置测试时间。
示例中测试时间为10分钟,前60秒不做计算,等待写入稳定后开始计算磁盘性能。
- 设置64 KB块写入,采用100%的顺序写。
- 查看测试结果。
Linux
CentOS 6.5等较老版本的操作系统用fdisk创建分区时,默认为非4KiB对齐选择初始磁柱编号,对性能有较大的影响,建议针对该类操作系统,在创建分区时4KiB对齐选取初始磁柱编号。
本文以“CentOS 7.2 64位”操作系统为例,不同操作系统的格式化操作可能不同,本文仅供参考,具体操作步骤和差异请参考对应操作系统的产品文档。
测试性能前请先安装fio性能测试工具。
步骤 1 登录云主机并切换为root用户。
步骤 2 进行性能测试之前,请执行以下步骤,确认磁盘分区的初始磁柱编号是否已经4KiB对齐。
fdisk -lu
回显类似如下信息:
[root@ecs-centos sdc]# fdisk -lu
Disk /dev/xvda: 10.7 GiB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x7db77aa5
Device Boot Start End Blocks Id System
/dev/xvda1 * 2048 20968919 10483436 83 Linux
Disk /dev/xvdb: 10.7 GiB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/xvdc: 53.7 GiB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x3cf3265c
Device Boot Start End Blocks Id System
/dev/xvdc1 2048 41943039 20970496 83 Linux
- 若start对应的初始磁柱编号能被8整除,则表示4KiB对齐,请执行步骤3进行性能测试。
- 若start对应的初始磁柱编号不能被8整除,则表示未4KiB对齐,如需继续测试请删除原有分区,重新按照4KiB对齐选择初始磁柱编号。
注意删除分区并重新按照4KiB对齐选取初始磁柱编号会导致磁盘原有数据的丢失,请谨慎操作。
步骤 3 执行以下命令,使用fio工具测试磁盘性能。
- 测试随机写IOPS:fio -direct= 1 -iodepth= 128 -rw= randwrite -ioengine= libaio -bs= 4k -size= 10G -numjobs= 1 -runtime= 600 -group_reporting -filename= /opt/fiotest/fiotest.txt -name= Rand_Write_IOPS_Test
- 测试随机读IOPS: fio -direct= 1 -iodepth= 128 -rw= randread -ioengine= libaio -bs= 4k -size= 10G -numjobs= 1 -runtime= 600 -group_reporting -filename= /opt/fiotest/fiotest.txt * -name= Rand_Read_IOPS_Test
- 测试写吞吐量: fio -direct= 1 -iodepth= 32 -rw= write -ioengine= libaio -bs= 1024k -size= 10G -numjobs= 1 -runtime= 600 -group_reporting -filename= /opt/fiotest/fiotest.txt -name= Write_BandWidth_Test
- 测试读吞吐量: fio -direct= 1 -iodepth= 32 -rw= read -ioengine= libaio -bs= 1024k -size= 10G -numjobs= 1 -runtime= 600 -group_reporting -filename= /opt/fiotest/fiotest.txt -name= Read_BandWidth_Test
- 测试单队列随机读时延: fio -direct= 1 -iodepth= 1 -rw= randread -ioengine =libaio -bs= 4k -size= 10G -numjobs= 1 -runtime= 60 -group_reporting -filename= /opt/fiotest/fiotest.txt -name= Rand_Read_LATE_Test
注意
使用fio工具进行裸盘性能测试时,不能在已创建文件系统的磁盘上测试,因为fio性能测试会破坏文件系统,导致磁盘变为只读,需要删除后重新购买。
请尽量不要在保存业务数据的磁盘上进行测试。如果需要,请按照以下建议操作:
在测试开始前对磁盘数据进行备份,防止误操作造成数据丢失。
在测试命令中指定filename参数为某个文件,例如 -filename=/opt/fiotest/fiotest.txt 。
测试fio相关参数说明如下表所示。
表: 参数说明
参数 | 说明 |
---|---|
direct | 定义是否使用direct IO,可选值如下: 值为0,表示使用buffered IO 值为1,表示使用direct IO |
iodepth | 定义测试时的IO队列深度。此处定义的队列深度是指每个线程的队列深度,如果有多个线程测试,意味着每个线程都是此处定义的队列深度。fio总的IO并发数=iodepth * numjobs。 例如: 单线程,且-iodepth=32,则该线程的IO队列深度为32,fio总的IO并发数=32*1=32。 多线程(3个线程),且-iodepth=32,则3个线程的IO队列深度均为32,fio总的IO并发数=32*3=96。 |
rw | 定义测试时的读写策略,可选值如下: 随机读:randread 随机写:randwrite 顺序读:read 顺序写:write 混合随机读写:randrw |
ioengine | 定义fio如何下发IO请求,通常有同步IO和异步IO: 同步IO一次只能发出一个IO请求,等待内核完成后才返回。这样对于单个线程IO队列深度总是小于1,但是可以透过多个线程并发执行来解决。通常会用16~32个线程同时工作把IO队列深度塞满。 异步IO则通常使用libaio这样的方式一次提交一批IO请求,然后等待一批的完成,减少交互的次数,会更有效率。 |
bs | 定义IO的块大小(block size),单位是k、K、m和M等,默认IO块大小为4 KB。 |
size | 定义测试IO操作的数据量,若未指定runtime这类参数,fio会将指定大小的数据量全部读/写完成,然后才停止测试。该参数的值,可以是带单位的数字,比如size=10G,表示读/写的数据量为10GiB;也可是百分数,比如size=20%,表示读/写的数据量占该设备总文件的20%的空间。 |
numjobs | 定义测试的并发线程数。 |
runtime | 定义测试时间。如果未配置,则持续将size指定的文件大小,以每次bs值为分块大小读/写完。 |
group_reporting | 定义测试结果显示模式,group_reporting表示汇总每个进程的统计信息,而非以不同job汇总展示信息。 |
filename | 定义测试文件(设备)的名称。 此处选择文件,则代表测试文件系统的性能。例如:-filename=/opt/fiotest/fiotest.txtl 此处选择设备名称,则代表测试裸盘的性能。例:-filename=/dev/vdb须知 如果在已经分区、并创建文件系统,且已写入数据的磁盘上进行性能测试,请注意filename选择指定文件,以避免覆盖文件系统和原有数据。 |
name | 定义测试任务名称。 |
使用fio工具测试性能,测试结果不对怎么办
问题描述
根据性能测试的方法,得到的测试结果与预期不符。
排查思路
测试云硬盘性能时,云硬盘本身以及压测条件都起着重要的作用。
以下排查思路根据原因的出现概率进行排序,建议您从高频率原因往低频率原因排查,从而帮助您快速找到问题的原因。
如果解决完某个可能原因仍未解决问题,请继续排查其他可能原因。
注意部分操作会导致磁盘原有数据丢失,建议使用裸盘进行性能测试。
图:排查思路
表:排查思路
可能原因 | 处理措施 |
---|---|
分区的初始磁柱编号4KiB对齐 | 检查分区的初始磁柱编号是否4KiB对齐。非4KiB对齐请删除原有分区,重新按照4KiB对齐选择初始磁柱编号。 |
测试盘不是裸盘 | 请重新购买裸盘挂载至云主机进行测试。 |
压测条件设置不合理 | 为了发挥出多核并发的系统性能,压测出目标性能指标,建议设置为多核,并且合理安排队列。 |
数据块大小设置不合理 | 重新设置数据块大小。l 测试IOPS时,建议将数据块设置为一个较小的值,如4k。l 测试吞吐量时,建议将数据块设置为一个较大的值,如1024k。 |
检查分区的初始磁柱编号是否4KiB对齐
步骤 1 登录云主机并切换为root用户。
步骤 2 进行性能测试之前,请执行以下步骤,确认磁盘分区的初始磁柱编号是否已经4KiB对齐。
fdisk -lu
回显类似如下信息:
[root@ecs-centos sdc]# fdisk -lu
Disk /dev/xvda: 10.7 GiB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x7db77aa5
Device Boot Start End Blocks Id System
/dev/xvda1 * 2048 20968919 10483436 83 Linux
Disk /dev/xvdb: 10.7 GiB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/xvdc: 53.7 GiB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x3cf3265c
Device Boot Start End Blocks Id System
/dev/xvdc1 2048 41943039 20970496 83 Linux
- 若start对应的初始磁柱编号能被8整除,则表示4KiB对齐。
- 若start对应的初始磁柱编号不能被8整除,则表示未4KiB对齐,如需继续测试请删除原有分区,重新按照4KiB对齐选择初始磁柱编号。
注意删除分区并重新按照4KiB对齐选取初始磁柱编号会导致磁盘原有数据的丢失,请谨慎操作。
云硬盘读写慢、IO升高怎么办
问题现象
当您感知到业务变慢时,可以通过以下方法进行检查:
- Windows:查看“任务管理器”中的“平均响应时间”。
- Linux:执行iostat -dx命令查看IO性能。
如果云硬盘出现读写慢、IO升高、await值变大等现象,说明云硬盘的性能出现了瓶颈。
解决办法
建议您更换性能更高的磁盘类型。
如果您的云硬盘中有重要数据,可以通过云硬盘备份创建新的云硬盘,从而保留云硬盘数据。方法如下:
- 通过云硬盘创建备份。
图:创建备份
- 再从备份创建新的云硬盘,创建过程中可以为云硬盘重新选择“磁盘类型”和“高级配置”,包括共享盘、SCSI和加密。
图:从备份创建云硬盘
为什么磁盘的I/O使用率已接近100%,但磁盘的读IOPS没有达到IOPS上限?
问题现象:
单块500GiB的超高IO磁盘,磁盘I/O使用率为99.94%时,磁盘的读IOPS只有12000,没有达到磁盘的IOPS上限。
原因说明:
- 磁盘I/O使用率达到100%,不能代表磁盘的IOPS也达到上限。
磁盘I/O使用率,用于统计测量对象在测量周期内提交读取或写入操作的占比,不能代表磁盘的I/O性能数据,仅代表磁盘的繁忙程度。
由于云硬盘具有可以并行处理多个I/O请求的能力,因此当磁盘的I/O使用率达到100%时,也不表示达到了磁盘的瓶颈。例如:某个云硬盘处理单个I/O请求需要0.1秒,且可以同时处理10个I/O请求,那么当10个I/O请求依次按顺序(串行)提交时,需要1秒才可以全部完成,则在1秒的采样周期中,磁盘的I/O使用率达到了100%;而如果10个I/O请求一次性全部(并行)提交时,需要0.1秒就可以全部完成,则在1秒的采样周期中,磁盘的I/O使用率仅达到10%。由此可见,即使磁盘的I/O使用率达到100%,磁盘仍然有余力可以处理更多的I/O请求,即没有达到饱和状态。
- 磁盘的读IOPS没有达到IOPS上限的原因
对于500GiB的超高IO磁盘,其IOPS性能上限=min (单个云硬盘最大IOPS, 单个云硬盘最小IOPS + 每GiB云硬盘的IOPS × 云硬盘容量 ) = min (33000, 1500 + 50 × 500 ) = 26500
磁盘的读IOPS,用于统计每秒从测量对象读取数据的请求次数。IOPS实际是由时延控制的,目前在数据块大小为4KiB的情况下,超高IO磁盘的单队列访问时延为1ms,那么在单队列场景下,1秒可以处理的IOPS为1000,即当IOPS为12000时,队列深度大约为12,如果要达到IOPS上限26500,则队列深度大约需要达到26。