테스트 학습 -103-Fio 도구 고급 성능 테스트 및 안정성 테스트

 

머리말

   이전 섹션에서는 Fio 도구 설치, 종속 라이브러리 및 gcc 환경 설치, 간단한 사용에 대해 설명했습니다. 오늘은 주로 성능 테스트 및 안정성 테스트의 실제 경험과 함께 고급 설명입니다. 몇 가지 예방 조치. 디스크 성능 테스트를 위해 각 서버 제조업체는 자체 절차를 가지고 있으며 Huawei H3C와 같은 제조업체는 서버 성능을 테스트합니다. 디스크 성능 테스트를위한 많은 도구가 있으며 현재 주류는 fio 및 iozone입니다. 

Fio (이 기사에서 사용됨)

iozone (또한 상대적으로 좋음)

fio의 설치 및 프로세스는 이전 섹션에 있습니다 : https://blog.csdn.net/u013521274/article/details/107949362


1. Fio 성능 테스트

성능 테스트는 주로 디스크의 읽기 및 쓰기 성능을 테스트하는 것이며 일반적으로 순차 읽기, 순차 쓰기, 임의 읽기, 임의 쓰기 , 4 가지 모드를 테스트  합니다.

테스트 성능 표시기 :  bw   평균 io 대역폭 

                          Iops   는 초당 읽기 및 쓰기 수로 간단히 이해할 수있는 성능 테스트 표시기입니다 (이 표시기는 테스트 결과에 표시됨).

다음과 같이 Fio에서 스크립트를 작성할 때 설정해야 할 많은 매개 변수가 있습니다.

参数说明:
filename=/dev/sdb1  测试文件名称,通常选择需要测试的盘的data目录。
direct=1            是否使用directIO,测试过程绕过OS自带的buffer,使测试磁盘的结果更真实。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面再后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电缓存里的数据就没了。所以有一种模式叫做DirectIO,跳过缓存,直接读写SSD。 
rw=randwrite        测试随机写的I/O
rw=randrw           测试随机写和读的I/O
bs=16k              单次io的块文件大小为16k
bsrange=512-2048    同上,提定数据块的大小范围
size=5G             每个线程读写的数据量是5GB。
numjobs=1           每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs。 
name=job1:         一个任务的名字,重复了也没关系。如果fio -name=job1 -name=job2,建立了两个任务,共享-name=job1之前的参数。-name之后的就是job2任务独有的参数。 
thread              使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。 
runtime=1000        测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
ioengine=libaio     指定io引擎使用libaio方式。libaio:Linux本地异步I/O。请注意,Linux可能只支持具有非缓冲I/O的排队行为(设置为“direct=1”或“buffered=0”);rbd:通过librbd直接访问CEPH Rados 
iodepth=16          队列的深度为16.在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。这样,就带来一个参数叫做队列深度。
Block Devices(RBD) 无需使用内核RBD驱动程序(rbd.ko)。该参数包含很多ioengine,如:libhdfs/rdma等
rwmixwrite=30       在混合读写的模式下,写占30%
group_reporting     关于显示结果的,汇总每个进程的信息。
此外
lockmem=1g          只使用1g内存进行测试。
zero_buffers        用0初始化系统buffer。
nrfiles=8           每个进程生成文件的数量。
磁盘读写常用测试点:
1. Read=100%  Ramdon=100%   rw=randread   (100%随机读)
2. Read=100%  Sequence=100% rw=read      (100%顺序读)
3. Write=100% Sequence=100% rw=write     (100%顺序写)
4. Write=100% Ramdon=100%   rw=randwrite (100%随机写)
5. Read=70%   Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30
(70%顺序读,30%顺序写)
6. Read=70%   Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30
(70%随机读,30%随机写)

Fio 매개 변수의 세부 설정 방법은 위와 같으며, 궁금한 사항이 있으면 온라인에서 세부 사항을 확인할 수 있습니다.

둘째, 실제 코드

2.1 테스트 코드 (순차 읽기 및 쓰기)

#!/bin/sh

export test=fio

echo "fio_write测试"
echo $(date +%F%n%T)
fio -directory=/fiorwtest -rw=write -bs=1M -direct=1 -iodepth 2 -ioengine=libaio -size 1G  -thread -numjobs=2  -group_reporting -name=write1M_1Gjob
echo $(date +%F%n%T)
sync
echo 3 > /proc/sys/vm/drop_caches
#ansible all -m shell -a "/tmp/qingli.sh"
echo "write 执行完毕"
echo "fio_read测试"
echo $(date +%F%n%T)
fio -directory=/fiorwtest -rw=read -bs=1M -direct=1 -iodepth 2 -ioengine=libaio -size 1G  -thread -numjobs=2  -group_reporting -name=write1M_1Gjob
echo $(date +%F%n%T)
sync
echo 3 > /proc/sys/vm/drop_caches
#ansible all -m shell -a "/tmp/qingli.sh" 196执行197上的
rm -f /fiorwtest/write1M_1Gjob*
echo "read 执行完毕"

위와 같이 프로그램은 먼저 쓰기 작업을 실행하고 읽기 작업을 실행 한 다음 마지막으로 생성 된 파일을 삭제합니다. 실행 결과는 다음과 같습니다.

위의 그림에서 볼 수 있듯이 빨간색 선 상자는 결과 표시기이고 하나는 쓰기 작업이고 다른 하나는 읽기 작업입니다.

2.2 Fio 코드 (무작위 읽기 및 쓰기)

#!/bin/sh

export test=fio

#随机写
echo "randwrite4k4job"
echo $(date +%F%n%T)
fio -directory=/hlstor/cluster/fubenjuan1 -rw=randwrite -bs=4k -direct=1 -iodepth 8 -ioengine=libaio -size 35G  -thread -numjobs=4  -group_reporting -name=randwrite4k_4job
echo $(date +%F%n%T)
sync
echo 3 > /proc/sys/vm/drop_caches
ansible all -m shell -a "/tmp/qingli.sh"
#随机读
echo "randread4k4job"
echo $(date +%F%n%T)
fio -directory=/hlstor/cluster/fubenjuan1 -rw=randread -bs=4k -direct=1 -iodepth 8 -ioengine=libaio -size 35G  -thread -numjobs=4  -group_reporting -name=randwrite4k_4job
echo $(date +%F%n%T)
sync
echo 3 > /proc/sys/vm/drop_caches
ansible all -m shell -a "/tmp/qingli.sh"
rm -f /hlstor/cluster/fubenjuan1/randwrite4k_4job*

测试随机读写的 -rw=randwrite、randread
-rw=  --设置为randwrite randread  其他无差别

매개 변수 차이

2.3 Fio 코드 루프 

코드를 루핑하는 방법은 3 가지가 있는데, 이는 파이썬 언어와 자바로 작성하는 루프와 비슷합니다. 예를 간단히 소개하겠습니다.

for 루프의 일반적인 작성은 다음과 같습니다.

#!/bin/sh

export test=fio

rwmode=("a" "b" "c" "d")
bssize=("1" "2" "3" "4")

for i in ${rwmode[@]}
do 
    echo $i
    echo $(date +%F%n%T)
	
    for j in ${bssize[@]}
    do	
	  echo $j
    done;
done;
---------------------------第2种----------------------------------
#!/bin/sh

export test=fio

rwmode=("a b c d")
bssize=("1 2 3 4")     差别在这 这个数组的写法

for i in ${rwmode[@]}
do 
    echo $i
    echo $(date +%F%n%T)
	
    for j in ${bssize[@]}
    do	
	  echo $j
    done;
done;

위와 같이 차이점은 어레이 rwmode를 작성하는 데 있습니다. 두 실행의 결과는 동일합니다.

쉘 온라인 시뮬레이터 https://c.runoob.com/compile/18

2.3 Fio 코드 실제 ​​전투 루프

쓰기 모드에서 4k, 1024k 블록 크기 작업을 주기적으로 실행하고 읽기 모드에서 4k, 1024k 블록 크기 작업을 실행합니다.

매개 변수 변경시 $ 기호를 추가해야합니다.

루프의 이점 : 적은 코드

루프의 단점 : 가독성 불량 (필요에 따라 다름)

참고 : 여기 fio 코드에는 새 매개 변수 -runtime = 900이 있습니다.

           그것에서 런타임 매개 변수 단위는 초입니다.

     1. fio가 런타임을 실행하는 시간은 실행 되었더라도 런타임에 도달 할 때까지 계속 실행되어야합니다. 설정하면 파일을 완전히 읽거나 쓰거나 썼더라도 런타임에 지정된 시간을 실행해야합니다. 루프에서 동일한 부하를 실행하여 달성됩니다.
     2. 성능 정보를 기록하기 전에 특정로드를 실행할 시간을 설정합니다. 성능이 안정된 후 로그 결과를 기록하는 데 사용되므로 안정적인 결과를 생성하는 데 필요한 실행 시간을 줄일 수 있습니다.

     3. 부채 테스트에 사용되며 CPU 부하의 60 % 미만에서 오류 실행 시간이 없습니다.

#!/bin/sh

export test=fio

rwmode=( "write" "read" )
bssize=( "4k" "1024k" )

for j in  ${rwmode[@]};
    do for i in  ${bssize[@]};
        do echo "fuse_fenbujuan_$j_$i_1job"
        echo $(date +%F%n%T)
        fio -directory=/hlstor/fenbujuan1 -rw=$j -bs=$i -direct=1 -iodepth 8 -ioengine=libaio -size 50G  -thread -numjobs=1 -runtime=900 -group_reporting -name=$j_$i_1job
        echo $(date +%F%n%T)
        sleep 60
        echo 3 > /proc/sys/vm/drop_caches
    done;
done;

세, 성능 모니터링

3.1 iostat 명령

iostat 명령 및 결과

iostat -m 1 
iostat -x 1
iostat -h 1  
每1秒刷新

3.2 실시간 메모리

#!/bin/bash
echo `date` > /root/ansible_test.txt

时间保存到文件

메모리의 실시간 상태는 로그 파일로 출력됩니다. 

#!/bin/sh
while :
do
    free -m >> nei.log
    sleep 1
done

-m 是字节  -h 可视化比较好 

while :
do
    free -h >> /lyfiolog/Memory.log
    sleep 1
done

 두 명령의 결과는 다음과 같습니다.

3.3 sh 스크립트 실행의 로그 출력, 즉 fio 로그 출력

      이 명령은 로그를 파일로 출력 할 수 있지만 실행 중에 중지 할 수 없으며 다른 작업을 수행 할 수 없습니다.

 sh fio-liyang-w2.sh >> fioly.log

     이 명령이 추가되면 백그라운드에서 실행되며 다른 항목에는 영향을주지 않습니다.

nohup sh fio.sh  >> fio.log &

네, 안정성 테스트

        안정적인 라인 테스트 또는 신뢰성 테스트를 수행 할 수 있으며 구별이 많지 않습니다. 주된 목적은 디스크가 CPU 부하의 55 % -80 %, 오류없는 실행 시간을 감지하는 것입니다. 성능을 결정하는 데 사용할 수 있습니다. 디스크 또는 NAS 마그네틱 스토리지 시스템의 견고성에 대한 좋은 척도가 있습니다.

        안정성은 위의 성능 테스트와 크게 다르지 않습니다. 핵심은 기계를 계속 실행하고 계속 실행하고 실행 후 다시 실행하는 것입니다. 일반적으로 2 ~ 3 일 정도 소요됩니다. 최종 결과를 얻으십시오. bw iops 등은 안정성의 좋은 척도입니다.

        다음은 예제입니다. 코드의 작은 부분에 불과한 실제 프로젝트가 이보다 많습니다.

#!/bin/sh

export test=fio

echo "nfs_fuben"


echo "write4k8job"
echo $(date +%F%n%T)
fio  -directory=/data/test1fuben  -rw=write  -bs=4k  -direct=1  -iodepth 8  -ioengine=libaio  -size 20G   -thread  -numjobs=8  -group_reporting  -name=write4k_8job
echo $(date +%F%n%T)

echo "read4k8job"
echo $(date +%F%n%T)
fio  -directory=/data/test1fuben  -rw=read  -bs=4k  -direct=1  -iodepth 8  -ioengine=libaio  -size 20G   -thread  -numjobs=8  -group_reporting  -name=write4k_8job
echo $(date +%F%n%T)



echo "write1M4job"
echo $(date +%F%n%T)
fio  -directory=/data/test1fuben  -rw=write  -bs=1M  -direct=1  -iodepth 8  -ioengine=libaio  -size 20G   -thread  -numjobs=4  -group_reporting  -name=write1m_4job
echo $(date +%F%n%T)

echo "read1M4job"
echo $(date +%F%n%T)
fio  -directory=/data/test1fuben  -rw=read  -bs=1M  -direct=1  -iodepth 8  -ioengine=libaio  -size 20G   -thread  -numjobs=4  -group_reporting  -name=write1m_4job
echo $(date +%F%n%T)

다섯, 테스트 보고서를 직접 요약

클러스터 계층 4k 순차 쓰기 4k 순차 읽기 1M 순차 쓰기 1M 순차 읽기 4k 임의 쓰기 4k 임의 읽기 1M 임의 쓰기 1M 랜덤 읽기
bw 36M / s 65.2M / s 2384 3061 120 131 1952 년 2598
iops 18.9k 33.4k 2384 3061 30.8 33.5 1952 년 2599

     위의 표에서 볼 수 있듯이 클러스터 계층에 대한이 테스트는 다른 볼륨, 분산 볼륨, 복제본 볼륨, 오류 수정 볼륨 또는 Fuse 및 nfs 계층 일 수 있습니다. 다른 -bs 블록, 4k, 1M 순차 읽기 및 쓰기, 임의 읽기 및 쓰기로 테스트를 수행했습니다. 더 높은 결과 중 일부는 내 컴퓨터가 SSD 솔리드 스테이트 드라이브이기 때문입니다. 결과는이 표에 요약되어 있습니다. 더 직관적입니다.

5.2주의

     실제 전투 프로젝트에서 테스트 머신 서버는 종종 두 개의 운영 체제, Linux 및 Windows 서버를 설치해야합니다. Windows는 Fio가 실행될 때 약간 다릅니다. Fio 명령에서 -numjobs는 일반적으로 4 8 10 등으로 설정됩니다.이 기사의 첫 번째 그림과 같이 Linux는이 4 개의 파일을 실행 한 후 최종 값을 제공합니다.

     그러나 윈도우에서 numjobs = 4는 4 개의 실행 결과를 생성하는데 이는 각 파일이 결과를 생성하기 때문입니다. 그런 다음 테스트 결과에서이 4 개 결과의 bw iops를 더하여 최종 테스트 결과가되어야합니다.

요약하자면 :

이전 섹션의 fio 성능 테스트를 위해 고급 단계를 만들었습니다. 질문이 있으시면 메시지를 남기고 보시면 답장하실 수 있습니다. 

이 기사는 블로그를 참조합니다 : https://blog.csdn.net/qq_14935437/article/details/93749444

추천

출처blog.csdn.net/u013521274/article/details/108253194