雑記

インフラのことだったりプログラムのことだったりどうでもいいこと書いたり。要は雑記。

ローカルディスクと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
  • なんでNFSの書き込みがこんな早いの?
    • というか計測するならsyncオプションにすればよかった。というわけでNFSは置いとく。
  • NFSはおいておくとして、ローカルと比較して予想以上にGlusterFSの書き込みが遅い…同期通信になるから遅くなるだろうなとは思ってたけどこれほどとは。
  • geo-replication使えば非同期になるらしいけど、どうあらrsync+inotify使ってるらしいしんー
  • 読み込みはなかなかの結果でしたけどね。