测试指导
本章节指导用户如何创建EC存储池,预埋数据,以及对4k块进行读写测试。

以下步骤只需要在client1节点进行。
- 在“/home”路径下创建perf_test目录,用于存放测试脚本。
1
mkdir /home/perf_test
- 创建存储池。
- 新建脚本create_pool.sh进行存储池的创建。
1
vim create_pool.sh
- 键入以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
ec_data_pool=ec_data ec_metadata_pool=ec_metadata image_pre=image size=20G ceph osd pool rm $ec_metadata_pool $ec_metadata_pool true ceph osd pool rm $ec_data_pool $ec_data_pool true ceph osd erasure-code-profile rm EC4_2 ceph osd erasure-code-profile set EC4_2 k=4 m=2 crush-failure-domain=osd plugin=isa stripe_unit=4096 ceph osd pool create $ec_data_pool 2048 2048 erasure EC4_2 ceph osd pool application enable $ec_data_pool rbd ceph osd pool create $ec_metadata_pool 64 64 ceph osd pool application enable $ec_metadata_pool rbd ceph osd pool set $ec_data_pool allow_ec_overwrites true sleep 10 for i in {1..60} do echo create $ec_metadata_pool/$image_pre$i size:$size rbd create --size $size --data-pool $ec_data_pool $ec_metadata_pool/$image_pre$i done
- 执行脚本创建存储池。
1
sh create_pool.sh
- 新建脚本create_pool.sh进行存储池的创建。
- 预埋数据。
- 新建脚本common.sh,作为后续的create_data.sh与cluster_fio的依赖。
1
vim common.sh
- 键入以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
#!/bin/bash # fio parameter image_num=60 pool_name="rbd" size="20G" blocksize="4k" numjobs=1 iodepth=128 ramp_time=10 runtime=180 rw="randread" image_name_prefix="foo" log_avg_msec=1000 fio_log=result.log # node parameter client_list=("client1" "client2" "client3") server_list=("ceph1" "ceph2" "ceph3") function start_fio() { ssh $1 pkill -9 fio numa_node=$(ssh ceph1 ssh $1 lscpu | grep "NUMA node(s)" | awk -F" " '{print $NF}') for ((i = 0; i <= numa_node - 1; ++i)); do echo "ssh ceph1 ssh $1 numactl -m $i -C $(ssh $1 lscpu | grep "NUMA node$i" | awk -F" " '{print $NF}') fio --server=$1,400$((i + 1))" ssh $1 numactl -m $i -C $(ssh ceph1 ssh $1 lscpu | grep "NUMA node$i" | awk -F" " '{print $NF}') fio --server=$1,400$((i + 1)) & done } function end_fio() { ssh $1 pkill -9 fio } function fio_gen() { rm -rf *.fio for image in $(seq 1 ${image_num}); do filename=$1_${blocksize}_${rw}_${pool_name}_${image_name_prefix}${image}_${iodepth}.fio echo "[global]" >$filename echo "ioengine=rbd" >>$filename echo "clientname=admin" >>$filename echo "pool=${pool_name}" >>$filename echo "size=$size" >>$filename echo "direct=1" >>$filename echo "bs=${blocksize}" >>$filename echo "numjobs=${numjobs}" >>$filename echo "iodepth=${iodepth}" >>$filename if [ "$1" != "prepare" ]; then echo "ramp_time=${ramp_time}" >>$filename echo "runtime=${runtime}" >>$filename echo "time_based" >>$filename fi echo "thread" >>$filename echo "stonewall" >>$filename echo "rw=${rw}" >>$filename if [ "${rw}" == "rw" ] || [ "${rw}" == "randrw" ]; then echo "rwmixread=70" >>$filename fi echo "[$1_${blocksize}-${rw}]" >>$filename echo "rbdname=${image_name_prefix}${image}" >>$filename done client_size=${#client_list[@]} fio_script="launch_$1.sh" echo "" >${fio_script} echo -e "\n\nscirpt for ${blocksize}" script="fio" for image in $(seq 1 ${image_num}); do filename=$1_${blocksize}_${rw}_${pool_name}_${image_name_prefix}${image}_${iodepth}.fio client_index=$(((image - 1) % client_size)) numa_num=2 port_index=$(echo "400$(((image - 1) / client_size % $numa_num + 1))") fio_client="${client_list[client_index]},$port_index" script=${script}" --client=${fio_client} ${filename} " done script=${script}" > ./${fio_log}" echo -e "$script\n" >>${fio_script} echo "sleep 10" >>${fio_script} cat ${fio_script} }
- 新建脚本create_data.sh进行数据预埋。
1
vim create_data.sh
- 键入以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#!/bin/bash source ./common.sh # fio parameter image_num=60 pool_name="ec_metadata" size="20G" blocksize="1024k" numjobs=1 iodepth=128 rw="write" image_name_prefix="image" log_avg_msec=1000 fio_log=result.log # node parameter client_list=("client1" "client2" "client3") server_list=("ceph1" "ceph2" "ceph3") mkdir -p ec_prepare cd ec_prepare fio_gen prepare for client in ${client_list[*]}; do start_fio $client done sleep 5 sh launch_prepare.sh for client in ${client_list[*]}; do end_fio $client done
- 执行脚本,预埋数据。
1
sh create_data.sh
- 新建脚本common.sh,作为后续的create_data.sh与cluster_fio的依赖。
- 4k集群随机写测试。
- 新建cluster_fio测试脚本,用于对集群进行读写测试。
1
vim cluster_fio.sh
- 脚本中键入以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
#!/bin/bash source ./common.sh # fio parameter image_num=60 pool_name="ec_metadata" size="20G" blocksize="4k" numjobs=1 iodepth=64 ramp_time=1 runtime=600 rw="randwrite" image_name_prefix="image" log_avg_msec=1000 fio_log=result.log client_list=("client1" "client2" "client3") server_list=("ceph1" "ceph2" "ceph3") function main() { test_time=$(date "+%Y-%m-%d-%H-%M-%S") mkdir $test_time cd $test_time fio_gen $rw echo "---------------------------start fio---------------------------" for client in ${client_list[*]}; do start_fio $client done sleep 5 sh launch_$rw.sh & sleep $ramp_time sleep $runtime sleep 10 for client in ${client_list[*]}; do end_fio $client done } ARGS=$(getopt -o hp:n:b:d:t: -l help,pool_name:,image_num:,blocksize:,iodepth:,rw: -n '$0' -- "$@") if [ $? != 0 ]; then exit 1 fi eval set -- "${ARGS}" while true; do if test -z "$1"; then break fi case $1 in -p | --pool_name) pool_name=$2 shift 2 ;; -n | --image_num) image_num=$2 shift 2 ;; -b | --blocksize) blocksize=$2 shift 2 ;; -d | --iodepth) iodepth=$2 shift 2 ;; -t | --rw) rw=$2 shift 2 ;; --) shift ;; *) esac done main
- 在perf_test目录下执行命令进行读写fio测试。
1
sh cluster_fio.sh -p ec_metadata -n 60 -b 4k -d 64 -t randwrite
- -p表示存储池。
- -n表示卷数。
- -b表示块大小。
- -d表示iodepth。
- -t表示读写模式。
- 新建cluster_fio测试脚本,用于对集群进行读写测试。
父主题: 调优指南