ローカルディスクとNFSとGlusterFSの読み書き速度の比較
簡単なスクリプト作って計測してみた。
全てサーバ・クライアント共にKVM上で実施。
計測対象
- クライアントのローカルディスク
- NFS領域(asyncオプションつき)
- GlusterFS領域
計測方法
- write
- dd使って1Gのファイルを作成して計測
- read
- 1Gのファイルをcatをtimeして計測
- いずれも12回計測し、maxとminを除外して10で割って平均値を算出。
スクリプト
#!/bin/sh # # ディスクの読み書き速度を簡易的に確認するよ。 #### # # 設定 # ## 計測対象となるファイルパス check_file="/home/data/vol1/testfile" ## ループ数。最終的にループ数-2した値をの合計値から割る loop_max=12 ## 書込みテスト時に作成するファイルサイズ。1M単位 size=1024 # # 変数定義 # loop=1 IFS=$'\n' result=() # # 関数 # usage() { echo "usage: $0 (w|r) Options w, 書込みの確認 r, 読み込みの確認" exit } d_write() { if [ -f "${check_file}" ]; then rm -f ${check_file} fi time=`dd if=/dev/zero of=${check_file} bs=1M count=${size} 2>&1 | grep MB/s | awk '{print $8}'` echo ${time} } d_read() { if [ ! -f "${check_file}" ]; then echo "${check_file} not exists" return 1 fi res=`(time cat ${check_file} > /dev/null) 2>&1 | grep real | awk '{print $2}'` m=`echo $res | sed -e 's/m.*$//i'` s=`echo $res | sed -e 's/^.*m\(.*\?\)s/\1/i'` if [ $m -ne 0 ]; then time=`echo "scale=3; (${m} * 60) + ${s}" | bc` else time=$s fi echo $time } case $1 in "r" ) func=d_read echo "[check read]" unit="/sec" ;; "w" ) func=d_write echo "[check write]" unit="MB/sec" ;; * ) usage ;; esac # # 測定 # while [ ${loop} -le ${loop_max} ] do echo -n "loop ${loop} ..." sleep 10 result+=(`${func}`) echo " ${result[`echo $loop - 1 | bc`]} ${unit}" loop=`expr ${loop} + 1` done result=(`echo "${result[*]}" | sort -n`) # # 計算 # echo "" echo "[calculating...]" count=0 total=0 for data in ${result[*]} do count=`expr ${count} + 1` if [ ${count} -eq 1 -o ${count} -eq ${#result[*]} ]; then echo "[${count}] ${data} ${unit} (exclude)" continue fi echo "[${count}] ${data} ${unit}" total=`echo "scale=3; ${total} + ${data}" | bc` done echo "" echo "[result]" echo "`echo "scale=3; ${total} / (${loop_max} - 2)" | bc | sed 's/^\./0./g'` ${unit}"
結果
書込み | 読込み | |
local | 109.700 MB/sec | 6.681 /sec |
NFS | 120.400 MB/sec | 6.699 /sec |
GlusterFS | 49.740 MB/sec | 7.257 /sec |