머리말
이전 섹션에서는 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