Linux、macOSなどのUnix環境でディスク速度(読み込み、書き込み)を測定するベンチマーク用シェルスクリプト(バッチ処理プログラム) ~RHEL、CentOS、Fedora、Ubuntu、macOS、Cygwinなどに対応したディスクスピードテストのベンチマークツール~

6月 22, 2017AWS,EC2,Programming,Shell Script

以前の下記の記事でLinux、macOSなどのUnix環境でサーバやクライアントの性能を評価する指標の一つであるCPUのベンチマークを行うシェルスクリプト(バッチ処理プログラム)について紹介しました。

参考記事:Linux、macOSなどのUnix環境でCPUベンチマークツール「UnixBench」を必要パッケージごと一括インストールするシェルスクリプト(バッチ処理プログラム) ~RHEL、CentOS、Fedora、Ubuntu、macOS、Cygwinなどに対応したCPU性能評価ソフトウェア~

今回はCPUの他に重要な位置づけである性能評価指標の一つディスクアクセス速度をLinuxのddコマンドを用いて計測するシェルスクリプト(バッチ処理プログラム)を備忘として紹介します。

Linux、macOSなどのUnix環境でディスク速度(読み込み、書き込み)を測定するベンチマーク用シェルスクリプト(バッチ処理プログラム) ~RHEL、CentOS、Fedora、Ubuntu、macOS、Cygwinなどに対応したディスクスピードテストのベンチマークツール~

シェルスクリプト(バッチ処理プログラム)の基本方針としてはddコマンドによる書き込み、読み込みを行ってその際のディスク速度及び計測時間を出力します。

ddコマンドは「oflag=direct」オプションで書き込み時、「iflag=direct」オプションで読み込み時のキャッシュを使用しない指定をすることができます。

そのため、「キャッシュ無しの書き込み」、「キャッシュ無しの読み込み」、「キャッシュ有りの書き込み」、「キャッシュ有りの読み込み」の4パターンを計測するようにしています。

Linux、macOSなどのUnix環境でディスク速度(読み込み、書き込み)を測定するベンチマーク用シェルスクリプト(バッチ処理プログラム)

実装したシェルスクリプトには引数でテストデータのMB単位の容量(bs=1Mに対するcountの値)を指定できるようにしています(デフォルト値は1024)。

「キャッシュ無しの書き込み」、「キャッシュ無しの読み込み」のテストを行った後、テストデータを削除し、再度「キャッシュ有りの書き込み」、「キャッシュ有りの読み込み」について計測するようになっています。

vim disk_speed_test.sh
#!/bin/bash

COUNT=$1

if [ "${COUNT}" = "" ]; then
  COUNT=1024
fi

echo "Disk Writing Speed (No Cache)"
echo "time dd bs=1M count=${COUNT} if=/dev/zero of=/tmp/disktest oflag=direct"
time dd bs=1M count=${COUNT} if=/dev/zero of=/tmp/disktest oflag=direct

echo "Disk Reading Speed (No Cache)"
echo "time dd bs=1M count=${COUNT} if=/tmp/disktest of=/dev/null iflag=direct"
time dd bs=1M count=${COUNT} if=/tmp/disktest of=/dev/null iflag=direct

rm -f /tmp/disktest

echo "Disk Writing Speed (Cached)"
echo "time dd bs=1M count=${COUNT} if=/dev/zero of=/tmp/disktest"
time dd bs=1M count=${COUNT} if=/dev/zero of=/tmp/disktest

echo "Disk Reading Speed (Cached)"
echo "time dd bs=1M count=${COUNT} if=/tmp/disktest of=/dev/null"
time dd bs=1M count=${COUNT} if=/tmp/disktest of=/dev/null

rm -f /tmp/disktest

Linux、macOSなどのUnix環境でディスクアクセス速度を測定するベンチマーク用シェルスクリプト(バッチ処理プログラム)の実行例

作成したスクリプトの実行例は下記のようになります。

[mag4j@localhost ~]# chmod 755 disk_speed_test.sh
[mag4j@localhost ~]# ./disk_speed_test.sh
Disk Writing Speed (No Cache)
time dd bs=1M count=1024 if=/dev/zero of=/tmp/disktest oflag=direct
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 4.22216 秒、 254 MB/秒

real    0m4.223s
user    0m0.003s
sys     0m0.279s
Disk Reading Speed (No Cache)
time dd bs=1M count=1024 if=/tmp/disktest of=/dev/null iflag=direct
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 4.19186 秒、 256 MB/秒

real    0m4.193s
user    0m0.005s
sys     0m0.099s
Disk Writing Speed (Cached)
time dd bs=1M count=1024 if=/dev/zero of=/tmp/disktest
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 0.714099 秒、 1.5 GB/秒

real    0m0.715s
user    0m0.003s
sys     0m0.711s
Disk Reading Speed (Cached)
time dd bs=1M count=1024 if=/tmp/disktest of=/dev/null
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 0.199486 秒、 5.4 GB/秒

real    0m0.200s
user    0m0.000s
sys     0m0.200s

[mag4j@localhost ~]# ./disk_speed_test.sh 2048
Disk Writing Speed (No Cache)
time dd bs=1M count=2048 if=/dev/zero of=/tmp/disktest oflag=direct
2048+0 レコード入力
2048+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 42.6873 秒、 50.3 MB/秒

real    0m42.688s
user    0m0.003s
sys     0m0.618s
Disk Reading Speed (No Cache)
time dd bs=1M count=2048 if=/tmp/disktest of=/dev/null iflag=direct
2048+0 レコード入力
2048+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 42.6635 秒、 50.3 MB/秒

real    0m42.665s
user    0m0.004s
sys     0m0.250s
Disk Writing Speed (Cached)
time dd bs=1M count=2048 if=/dev/zero of=/tmp/disktest
2048+0 レコード入力
2048+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 1.12603 秒、 1.9 GB/秒

real    0m1.127s
user    0m0.001s
sys     0m1.127s
Disk Reading Speed (Cached)
time dd bs=1M count=2048 if=/tmp/disktest of=/dev/null
2048+0 レコード入力
2048+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 0.434828 秒、 4.9 GB/秒

real    0m0.436s
user    0m0.000s
sys     0m0.435s

Reference: Tech Blog citing related sources