序文
前のセクションでは、Fioツールのインストール、依存ライブラリとgcc環境のインストール、および簡単な使用法について説明しました。今日は、主にパフォーマンステストと安定性テストの実際の経験、およびいくつかの注意事項。ディスクパフォーマンステストの場合、各サーバーメーカーには独自の一連の手順があり、HuaweiH3Cなどのメーカーがサーバーのパフォーマンスをテストします。ディスクパフォーマンステストには多くのツールがありますが、現在主流のツールはfioとiozoneです。
Fio(この記事で使用)
iozone(これも比較的良い)
fioのインストールとプロセスは前のセクションにあります:https://blog.csdn.net/u013521274/article/details/107949362
1.Fioパフォーマンステスト
パフォーマンステストは、主にディスクの読み取りおよび書き込みパフォーマンスをテストすることであり、通常、シーケンシャル読み取り、シーケンシャル書き込み、ランダム読み取り、ランダム書き込み、4つのモードをテスト します。
テストパフォーマンス指標: bw 平均io帯域幅
Iops は、1秒あたりの読み取りと書き込みの数として簡単に理解できるパフォーマンステストインジケーターです(このインジケーターはテスト結果に表示されます)
以下に示すように、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 执行完毕"
上記のように、プログラムは最初に書き込み操作を実行し、読み取り操作を実行し、最後に生成されたファイルを削除します。実行結果は以下のとおりです。
上の図に示すように、赤い線のボックスは結果インジケーターであり、1つは書き込み操作で、もう1つは読み取り操作です。
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.3Fioコードループ
コードをループする方法は3つあります。これは、Python言語とJavaでのループ記述に似ています。例を簡単に紹介します。
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.3Fioコードの実際の戦闘ループ
書き込みモードで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、パフォーマンス監視
3.1iostatコマンド
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
2つのコマンドの結果は次のとおりです。
3.3 shスクリプト実行のログ出力、つまりfioログ出力
このコマンドはログをファイルに出力できますが、実行中に停止したり、他のことを実行したりすることはできません。
sh fio-liyang-w2.sh >> fioly.log
このコマンドがnohupに追加された後、バックグラウンドで実行され、他のものに影響を与えることはありません。
nohup sh fio.sh >> fio.log &
4、安定性テスト
安定したラインテストまたは信頼性テストを実行できます。区別はあまりありません。主な目的は、ディスクがCPU負荷の55%〜80%であり、障害のない実行時間を検出することであり、パフォーマンスを判断するために使用できます。ディスク、またはNAS磁気ストレージシステムの堅牢性の良い尺度があります。
安定性は、上記のパフォーマンステストとそれほど変わりません。重要なのは、マシンを実行し続け、実行し続け、実行後に再度実行することです。通常、実行には2〜3日かかります。最終結果を得る:bwiopsなどは安定性の良い尺度です。
以下に例を示します。コードのごく一部であり、これよりも多くの実際のプロジェクトがあります。
#!/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)
5、テストレポートを自分で要約します
クラスターレイヤー | 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サーバーの2つのオペレーティングシステムをインストールする必要があります。Fioを実行するときのWindowsは少し異なります。Fioコマンドでは、-numjobsは通常4 8 10などに設定されます。この記事の最初の図に示すように、Linuxはこれらの4つのファイルを実行した後に最終値を返します。
ただし、Windowsでは、numjobs = 4は4つの実行結果を生成します。これは、各ファイルが結果を生成するためです。次に、テスト結果で、これら4つの結果のbw iopsを合計して、最終的なテスト結果にする必要があります。
総括する:
前のセクションのfioパフォーマンステストでは、高度な手順を実行しました。質問がある場合は、メッセージを残して、表示されたら返信してください。
この記事はブログを参照しています:https://blog.csdn.net/qq_14935437/article/details/93749444