鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

测试指导

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

以下步骤只需要在client1节点进行。

  1. “/home”路径下创建perf_test目录,用于存放测试脚本。
    1
    mkdir /home/perf_test
    
  2. 创建存储池。
    1. 新建脚本create_pool.sh进行存储池的创建。
      1
      vim create_pool.sh
      
    2. 键入以下内容。
       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
      
    3. 执行脚本创建存储池。
      1
      sh create_pool.sh
      
  3. 预埋数据。
    1. 新建脚本common.sh,作为后续的create_data.shcluster_fio的依赖。
      1
      vim common.sh
      
    2. 键入以下内容。
       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}
      }
      
    3. 新建脚本create_data.sh进行数据预埋。
      1
      vim create_data.sh
      
    4. 键入以下内容。
       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
      
    5. 执行脚本,预埋数据。
      1
      sh create_data.sh
      
  4. 4k集群随机写测试。
    1. 新建cluster_fio测试脚本,用于对集群进行读写测试。
      1
      vim cluster_fio.sh
      
    2. 脚本中键入以下内容。
       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
      
    3. 在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表示读写模式。