测试工具

本篇目录

使用fio工具,建议使用libaio引擎测试

安装方法

Linux: yum install fio.x86_64

fio参数说明

参数 说明
-direct=1 忽略缓存,直接写入磁盘
-iodepth=128 请求的IO队列深度
-rw=write 读写策略,可选值randread(随机读),randwrite(随机写),read(顺序读),write(顺序写),randrw(混合随机读写)
-ioengine=libaio IO引擎配置,建议使用libaio
-bs=4k 块大小配置,可以使用4k,8k,16k等
-size=200G 测试生成文件的大小
-numjobs=1 线程数配置
-runtime=1000 测试运行时长,单位秒
-group_reporting 测试结果汇总展示
-name=test 测试任务名称
-filename=/data/test 测试输出的路径与文件名

常见测试用例如下:

  • 时延性能测试:

    读时延: 
    fio -direct=1 -iodepth=1 -rw=read -ioengine=libaio -bs=4k -size=200G -numjobs=1 -runtime=1000 -group_reporting -name=test -filename=/data/test  
    写时延: 
    fio -direct=1 -iodepth=1 -rw=write -ioengine=libaio -bs=4k -size=200G -numjobs=1 -runtime=1000 -group_reporting -name=test -filename=/data/test
  • 吞吐性能测试:

    读带宽: 
    fio -direct=1 -iodepth=32 -rw=read -ioengine=libaio -bs=256k -size=200G -numjobs=4 -runtime=1000 -group_reporting -name=test -filename=/data/test  
    写带宽:  
    fio -direct=1 -iodepth=32 -rw=write -ioengine=libaio -bs=256k -size=200G -numjobs=4 -runtime=1000 -group_reporting -name=test -filename=/data/test
  • IOPS性能测试(4k,4*32队列,随机读写):

    读IOPS: 
    fio -direct=1 -iodepth=32 -rw=randread  -ioengine=libaio -bs=4k -size=200G -numjobs=4 -runtime=1000 -group_reporting -name=test -filename=/data/test 
    写IOPS:   
    fio -direct=1 -iodepth=32 -rw=randwrite -ioengine=libaio -bs=4k -size=200G -numjobs=4 -runtime=1000 -group_reporting -name=test -filename=/data/test

RSSD性能测试

由于压测云盘的性能时,云盘本身以及压测条件都起着重要的作用。为了充分发挥出多核多并发的系统性能,压测出RSSD云盘120万IOPS性能指标,您可以参考以下rssd_test.sh脚本:

#!/bin/bash     
numjobs=16          # 测试线程数,要求不要超过CPU核数, 默认16
iodepth=32          # 每个线程IO队列深度, 默认32
bs=4k               # 每个I/O大小, 默认4k
rw=randread         # 读写方式, 默认随机读
dev_name=vdb        # 测试的块设备名, 默认vdb

if [[ $# == 0 ]]; then
  echo "Default test: `basename $0` $numjobs $iodepth $bs $rw $dev_name"
  echo "Or you can specify paramter:"
  echo "`basename $0` numjobs iodepth bs rw dev_name"
elif [[ $# == 5 ]]; then
  numjobs=$1
  iodepth=$2
  bs=$3
  rw=$4
  dev_name=$5
else
  echo "paramter number error!"
  echo "`basename $0` numjobs iodepth bs rw dev_name"
  exit 1
fi

nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l`
if [ $nr_cpus -lt $numjobs ];then
  echo "Numjobs is more than cpu cores, exit!"
  exit -1
fi
nu=$((numjobs+1))
cpulist=""
for ((i=1;i<10;i++))
do
  list=`cat /sys/block/${dev_name}/mq/*/cpu_list | awk '{if(i<=NF) print $i;}' i="$i" | tr -d ',' | tr '\n' ','`
  if [ -z $list ];then
    break
  fi
  cpulist=${cpulist}${list}
done
spincpu=`echo $cpulist | cut -d ',' -f 2-${nu}` # 不使用0号核
echo $spincpu
echo $numjobs
echo 2 > /sys/block/${dev_name}/queue/rq_affinity
sleep 5
# 执行fio命令
fio --ioengine=libaio --runtime=30s --numjobs=${numjobs} --iodepth=${iodepth} --bs=${bs} --rw=${rw} --filename=/dev/${dev_name} --time_based=1 --direct=1 --name=test --group_reporting --cpus_allowed=$spincpu --cpus_allowed_policy=split

测试说明

1.根据用户的测试环境,可以指定脚本的输入参数,如果不指定,会执行默认的测试方式。

2.直接测试裸盘会破坏文件系统结构。如果云盘上已经有数据,可以设置filename=[具体的文件路径,比如/mnt/test.image]。如果没有数据,可以直接设置filename=[设备名,如本示例中的/dev/vdb]

脚本解读

块设备参数

  • 测试实例时,脚本中的命令echo 2 > /sys/block/vdb/queue/rq_affinity是将云主机实例中的块设备中的参数rq_affinity值修改为 2。

  • 参数rq_affinity 的值为 1 时,表示块设备收到 I/O 完成(I/O Completion)的事件时,这个 I/O 被发送回处理这个 I/O 下发流程的 vCPU 所在 Group 上处理。在多线程并发的情况下,I/O Completion 就可能集中在某一个 vCPU 上执行,这样会造成瓶颈,导致性能无法提升。

  • 参数rq_affinity 的值为 2 时,表示块设备收到 I/O Completion 的事件时,这个 I/O 会在当初下发的 vCPU 上执行。在多线程并发的情况下,就可以完全充分发挥各个 vCPU 的性能。

绑定对应的 vCPU

  • 普通模式下,一个设备(Device)只有一个请求列表(Request-Queue)。在多线程并发处理I/O的情况下,这个唯一的Request-Queue就是一个性能瓶颈点。

  • 最新的多队列(Multi-Queue)模式下,一个设备(Device)可以拥有多个处理I/O的Request-Queue,可以充分发挥后端存储的性能。如果您有4个I/O线程,您需要将4个线程分别绑定在不同的Request-Queue对应的CPU Core上,这样就可以充分利用Multi-Queue提升性能。

  • fio 提供了参数 cpusallowed 以及 cpus_allowed_policy 来绑定 vCPU。以vdb云盘为例,运行 ls /sys/block/vdb/mq/ 查看设备名为vdb云盘的QueueId,运行 cat /sys/block/vdb/mq/$QueueId/cpu_list 查看对应设备名为vdb云盘的QueueId绑定到的cpu_core_id。

最近更新时间:2024-03-11 06:10:38