ssdtest は SSD の性能を測定してグラフ化するツール群です。 ランダムアクセス性能を 2 次元空間上にプロットします。 平均化した値では見えなかった Turn Around Time, SSD 内外のキャッシュ影響、セクタ消去、ウエアレベリング、エラー訂正、 SSD 内のメモリデバイスアクセス並列度などによると考えられる アクセス速度分布が得られます。
サンプル SONY SR-16UY MicroSD card (軽量テスト)
サンプル SONY SR-16UY MicroSD card (完全テスト)
Copyright (C) 2012, 2017 Akinori Furuta <afuruta
@m7.dion.ne.jp>項目 | 説明 |
---|---|
OS | Linux kernel 2.6.34 or later, 64bit addressing. |
Memory | 8GiBytes or more main memory. |
Disk Space | 1MiBytes to store test programs,
1GiBytes to store test output logs and plots. |
Packages |
gcc,
gawk(ubuntu の場合、awk では動作しません),
time(外部コマンド),
smartctl(smartmontools),
hdparm,
gnuplot 4.2 or later ubuntu(debian 系)の環境であれば次のコマンドを実行してパッケージをインストールしてください。 $ sudo apt-get update $ sudo apt-get install gcc gawk time smartmontools hdparm gnuplot |
項目 | 説明 |
---|---|
種別 |
|
接続形態 | SSD の場合は SATA (途中に USB 等の変換アダプタがないこと) |
容量 |
|
ボリューム構成 | シングルパーティション (RAID, Volume Group 不可) |
ファイルシステム形式 |
|
空き容量の 90% をテストファイルとして使用します。VFAT(FAT32) ファイルシステム では 4095MiBytes をテストファイルとして使用します。/, /tmp, /home, /var 等を マウントした場所をテストする場合、容量不足に注意してください。容量不足になると、 突然再起動するなど不測の事態が発生します。
SSD の種類にもよりますが、1 回の完全テスト (ssdtest.sh) に付き 120GBytes の SSD で 12 ~ 48 時間 掛かります。
次の様にして、ダウンロードしたファイル ssdtest_x.x.tar.gz を展開、コンパイルしてください。
% tar zxvf ssdtest_x.x.tar.gz % cd ssdtest_x.x % make
どのコマンドもエラーや警告は出ないはずです。make に成功していれば、次の様に ssdstress コマンドのヘルプメッセージを出力することができます。
% ./ssdstress -h ./ssdstress: Info: Show help. ./ssdstress: Error: Need path name to read/write test. ssdstress: SSD stress test tool. Copyright (C) 2012, 2017 Akinori Furuta<afuruta@m7.dion.ne.jp>. Command line: [-f n] [-p {y|n}] [-x {b|r|w}] [-r {y|n}] [-d {y|n}{Y|N}] [-m {y|n}] [-b n] [-u n] [-i n] [-i {u|e}] [-a n] [-e n] [-n n] [-s n] path_name -f n work file size. -p{y|n} Fill file with initial image(y: fill, n: truncate)(n). -x{b|r|w} Random read/write method (b: Do both read and write, r: Do read only, w: Do write only)(b). -r{s|y|n} Read file from start block to end block (s: read strict check, y: read light check, n: do nothing)(n). -d{y|n}{Y|N} Add O_DIRECT flag at sequential r/w (y: add, n: not add), at random r/w(Y: add, N: not add)(yY). -m{y|n} Do block number Marking and check (y: mark and check, n: do not marking)(y). -b n block size(512). -u n Sequential read/write blocks per one IO (if zero or not set, same as "-a n" * 2)(0). -i n Random read/write minimum blocks(1). -a n Random read/write maximum blocks(8192). -i {uniform | exponential} Random read/write blocks distribution as uniform or exponential (uniform). -o n Start block number to read/write(0). -e n End block number to read/write(0). -n n number of random read/write access(4096). -s n random seed number(0). -z n Sleep time in seconds after test(10). path_name: File path name to test. Number n can be specified with unit {k|m|g|t}. k: x1024, m: x1024^2, g: x1024^3, t: x1024^4, p: x1024^5 Output format: sequential write. cur b/s, total b/s, cur_el b/s, elp b/s, cur_pos, progs, Twrite, Twrite_total, Twrite_elapsed, Telapsed, Tmem_access_total Output format: random access. index, elapsed_time, rw, seek_position, length, access_time, bps, memory_access_time Output format: sequential read. cur b/s, total b/s, cur_el b/s, elp b/s, cur_pos, progs, Tread, Tread_total, Tread_elapsed, Telapsed, Tmem_access_total
インストール機能はありません。システム(/bin, /usr/bin, /usr/local/bin 等)に インストールせずに使用するツールです。起動は、フルパスまたは、カレントディレクトリ から辿れる相対パスで実行ファイルを指定します。
次のコマンドで生成ファイルを削除します。測定結果はそのまま残ります。
% make clean
実行プログラムは、「テスト実行ツール」、「結果プロット、ページ作成ツール」、 「連続実行用ツール」、「デバック・診断ツール」の 4 群から構成されています。
以下 ${tool_path} は ssdtest ツール群を展開したディレクトリ ssdtest_x.x を指す 相対または絶対パスに置き換えて読んでください。# プロンプトは root 権限で実行 することを意味します。ディストリビューションによっては sudo を付けて起動する ことと解釈してください。$ プロンプトは一般ユーザーで実行することを意味します。
テスト実行ツールは root 権限もしくは block device に対して直接アクセスできる 権限をもつユーザーで実行します。一般ユーザーでも実行は可能です。しかし、 S.M.A.R.T. 情報、kernel チューニング等が行われずテスト結果から一部の情報が欠落 したり、十分な性能が発揮できないテストになります。
テスト手順は次の通りです。テスト実行、テスト結果をプロット、プロットしたグラフ から HTML ページ作成という順です。
# ${tool_path}/ssdtest.sh [-L ModelNameLabel] /path/to/test
plotlogseq.sh でシーケンシャルアクセステストの結果をプロットします。 plotlogmix.sh でランダムアクセステストの結果をプロットします。
$ ${tool_path}/plotlogseq.sh log_directory $ ${tool_path}/plotlogmix.sh log_directory
$ ${tool_path}/htmlplot.sh log_directory > html_page_file.html
ssdtest.sh, ssdtest_light.sh, ssdtest_usbmems.sh, ssdtest_light_usbmems.sh はテスト実行スクリプトです。 それぞれ次の表に示すテストを行います。
スクリプト名 | 機能 | テスト構成 | シーケンシャルアクセス単位 (blocks, (bytes)) | ランダムアクセス単位 (BlocksMin .. BlocksMax, (BytesMin .. BytesMax)) | 書き込み量 bytes | 必要空きメモリ bytes | |||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ssdtest.sh | SSD の完全テスト |
次の一連のテストを行います。
| 2Mi, (1Gi) | 1 .. 4Mi, (512 .. 2Gi) | 約 FreeSpace * 3.6 + 2.2Ti | 約 6.03Gi | |||||||||||||||||||||||||||||||||||||||||||||||||||
ssdtest_light.sh | SSD の軽量テスト |
次の一連のテストを行います。
|
2Mi, (1Gi) | 1 .. 4Mi, (512 .. 2Gi) | 約 FreeSpace * 0.9 + 570Gi | 約 6.03Gi | |||||||||||||||||||||||||||||||||||||||||||||||||||
ssdtest_usbmem.sh | USB memory の完全テスト |
次の一連のテストを行います。
sequential write、読み出しはキャッシュ無しです。 USB memory 容量が小さい場合は書き込みが全て主記憶にバッファされるのを防ぐためです。 USB memory の容量と速度は多種存在します。このスクリプトのパラメータはどんな USB memory にも適するパラメータではありません。テスト時間が長すぎたり、性能を把握するのには不十分な 結果が得られる場合もあります。 |
16Ki, (8Mi) | 1 .. 64Ki, (512 .. 32Mi) | 約 FreeSpace * 3.6 + 45.6Gi | 約 128Mi | |||||||||||||||||||||||||||||||||||||||||||||||||||
ssdtest_light_usbmem.sh | USB memory の軽量テスト |
次の一連のテストを行います。
USB memory の容量と速度は多種存在します。このスクリプトのパラメータはどんな USB memory にも適するパラメータではありません。テスト時間が長すぎたり、性能を把握するのには不十分な 結果が得られる場合もあります。 |
16Ki, (8Mi) | 1 .. 64Ki, (512 .. 32Mi) | 約 FreeSpace * 0.9 + 11.3Gi | 約 128Mi |
Note: グラフのタイトルに OS cache enabled の場合は "without O_DIRECT"、OS cache disabled の場合は "with O_DIRECT" という文言が入ります。
Note: FreeSpace は測定開始時点でボリュームに存在した空き容量です。
それぞれのコマンドラインは次の通りです。スクリプト内で ssdstress を呼び出します。
# ${tool_path}/ssdtest.sh [-L ModelNameLabel] /path/to/test # ${tool_path}/ssdtest_light.sh [-L ModelNameLabel] /path/to/test # ${tool_path}/ssdtest_usbmems.sh [-L ModelNameLabel] /path/to/test # ${tool_path}/ssdtest_light_usbmems.sh [-L ModelNameLabel] /path/to/test
コマンドライン引数は次の通りです。
Parameter | Description |
---|---|
SSD をテストする場合は任意で指定できます。SSD のモデル名に付加したい文字列を
ModelNameLabel で指定します。モデル名の接尾辞として扱われます。
USB memory をテストする場合は、 USB memory または memory card にボリュームラベルを付けていないならば必ず指定してください。 | |
テストしようとする SSD, USB memory をマウントしたパス、またはそれより深い 階層のパスを指定します。ディレクトリを指定すれば、そのディレクトリに UUID 形式 の名前が付いたファイルを生成してテストをします。ファイル名を指定すれば、その名 前でファイルを生成してテストをします。 |
テスト結果(テストログ)はカレントディレクトリの下に次の名前で生成したディレクト リ内に格納されます。 ModelName は デバイスから読み取ったモデル名です。 ModelNameLabel はテストスクリプトに -L オプションで与えた文字列です。 TestDateTime はテスト実施日時です。 TestFileSize はテストに使用したファイルサイズです。ボリュームの空き容量に対して おおよそ 90% を占めるサイズになります。
log-${ModelName}${ModelNameLabel}-${TestDateTime}-${TestFileSize}
ステップ (a1) から (a4) は次のような動作をします。
Method | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(a1) | sequential write
空き容量の 90% まで書き込みます。 1 回のアクセス単位は次の通りです。
アクセス単位はシステムコールの引数として渡す値です。SSD の場合は SATA ドライバの制限、USB の場合は USB Mass Storage Driver の制限を受けてドライブに対対するアクセス要求は分割されます。ログファイルには max_sectors_kb として分割サイズがバイト数として記録されます。 キャッシュが有効な場合、書き込み始めは OS のキャッシュにため込む動作になります。 書き込み速度は OS の内部処理速度になります。ドライブのアクセス速度より速い速度を示します。 以下 (a2), (a3), (a4) でこのファイルを使用します。
|
||||||||||||||||||||
(a2) | random read and write
以下に示す式でブロック数を計算し (a1) で作ったファイルに対して ランダムな均等分布位置で読み出しと書き込みを合計 8192 回行います。ブロックサイズ(最小単位)は 512 バイトです。 RatioL = Log2( BlocksMax / BlocksMin ) Blocks = Int( 0.5 + BlocksMin * 2RatioL * Rand(1.0) ) 数式の関数は次の通りです。
各パラメータは次の通りです。 SSD の場合
USB memory の場合
OS のキャッシュを有効にした場合、キャッシュとドライブの相互の作用によって、ランダムアクセスの 応答時間が 10 秒以上になる場合があります。「プチフリーズ」と呼ばれる現象に相当します。 OS キャッシュ無しの場合には見えなかったドライブの問題が顕在化することがあります。 ssdtest_light_*.sh スクリプトは OS のキャッシュを無効にして単純に状況におけるドライブの実力を 測ることができます。しかし、「プチフリーズ」等の問題を見る場合、キャッシュを有効にして、テストを 行うスクリプト ssdtest.sh, ssdtest_usbmems.sh を使用してください。 |
||||||||||||||||||||
(a3) | sequential read
テスト用ファイルを最初から最後まで読みます。1 回のアクセス単位は (a1) と同じです。 ドライブによっては直前に行った「(a2) ランダムアクセス」において OS のキャッシュ条件が アクセス速度の乱れ (短期的に急激な速度低下を起こす現象) と関係する場合があります。 |
||||||||||||||||||||
(a4) | Remove test file created at (a1) step.
(a1)で作成したファイルを削除します。テスト実行中に SIGINT ([Ctrl] + [C]) で中断した場合は、 ファイルを削除します。 |
ssdtest.sh から呼ばれるバイナリプログラムです。テストの核になる処理です。 直接起動することもできます。パラメータの与え方は ssdtest.sh 内の記述を 参考にして下さい。
# ${tool_path}/ssdstress コマンドラインオプション テストファイル名
コマンドライン書式:
[-f n] [-p {y|n}] [-x {b|r|w}] [-r {y|n}] [-d {y|n}{Y|N}]
[-m {y|n}] [-b n] [-u n] [-i n] [-i {uniform | exponential}] [-a n] [-e n] [-n n] [-s n] path_name
コマンドラインオプションの (既定) 内の値と文字列は既定値です。
Option or Argument | 説明 | ||||||||
---|---|---|---|---|---|---|---|---|---|
テスト作業用ファイルサイズ | |||||||||
シーケンシャルライトテスト実施指定 (既定 n)
|
|||||||||
ランダムアクセスで実施するアクセス (既定 b)
|
|||||||||
シーケンシャルリードテストの実施方法 (既定 n)
|
|||||||||
O_DIRECT (OS のキャッシュを使用しない) 指定 (既定 yY)
小文字 yn はシーケンシャルアクセステストに対する指定
-d y と -d Y を一緒にして -d yY と指定することが出来できます。 |
|||||||||
ファイルイメージ整合検査用の符号を付ける (既定 y)
テスト作業用ファイルに対して -r s または -r y を使って検査する場合、 -m y を指定してファイルを作成またはテストしてください。 |
|||||||||
ブロック(アクセス単位)サイズ (既定 512) このオプションで指定した整数倍が 1 回のアクセスサイズになります。
|
|||||||||
シーケンシャルアクセステストで一度にアクセスするブロック数 (既定 0) 0 を指定した場合は "-a オプションで指定した値" x 2 がブロック数になります。 以下の式の値が 4Gi を超える場合、General Protection Fault が発生することが有ります。 "-b オプション" * "-a オプション" * 2
|
|||||||||
ランダムアクセステストで一度にアクセスする最小ブロック数 (既定 1)
|
|||||||||
-i オプションに数値ではなく uniform または exponential を指定すると、
ランダムアクセステストで一度にアクセスするブロック数の分布を指定します。
|
|||||||||
ランダムアクセステストで一度にアクセスする最大ブロック数 (既定 8192)
-b 512 -i 1 -a 8192 の場合、ランダムアクセステストで OS に read/write 要求するサイズは i=1..8192 の整数とし、 512 * i バイトになります。
|
|||||||||
シーケンシャルとランダムアクセステストでアクセスする範囲の開始ブロック
番号、0 がファイルの先頭になる (既定 0)
|
|||||||||
シーケンシャルとランダムアクセステストでアクセスする範囲の終了ブロック
番号、0 を指定すると -f n で指定したサイズのファイル末尾までが範囲になります。(既定 0)
|
|||||||||
ランダムアクセステストでアクセスする回数を指定します。read 回数と write
回数を足した回数が -n n で指定した値になります (既定 4096) それぞれの回で read か write アクセスのどちらを実施するかは疑似乱数で決定します。 read と write アクセスの出現確率は半々です。疑似乱数による確率なので同一条件ならば 再現性があります。正確に半々になりません。
|
|||||||||
疑似乱数のシード値を指定します (既定 0)
|
|||||||||
シーケンシャルアクセステスト、ランダムアクセステスト後に休止
(sleep) する最小時間を指定します。テスト中、Tac="access_time" * 2 が
この値より大きければ、休止時間は Tac になります (既定 10)
|
|||||||||
テストに使うファイル名 |
数値 n は接尾辞 k, m, g, t, p を付加出来ます。其々 n に k: 1024, m: 10242, g: 10243, t: 10244, p: 10245 を掛ける指定です。
cur b/s, total b/s, cur_el b/s, elp b/s, cur_pos, progs, Twrite, Twrite_total, Twrite_elapsed, Telapsed, Tmem_access_total
列 | 説明 |
---|---|
直近の転送速度 (bytes/seconds) | |
Write に掛かった時間だけから計算した書き始めからの転送速度 (bytes/seconds) | |
Write とそれ以外の検査符号生成も全て含んだ時間で計算した直近の転送速度 (bytes/seconds) | |
Write 以外に掛かった時間 (主に検査符号生成) を全て含めても全て含んだ時間で計算した書き始めからの転送速度 (bytes/seconds) | |
次に書き込みを行うバイト位置テスト終了時はファイルサイズと一致します (byte) | |
進捗度を百分率で表しています。0 から 100 の値になります。(%) | |
Write に掛かった時間 (seconds) | |
書き始めから Write に掛かった時間の合計 (seconds) | |
書き始めから Write とそれ以外の処理時間 (主に検査符号生成処理) も全て含めた経過時間 (seconds) | |
書き込み以外、主に検査符号生成処理に掛かった時間 (seconds) |
cur b/s, total b/s, cur_el b/s, elp b/s, cur_pos, progs, Tread, Tread_total, Tread_elapsed, Telapsed, Tmem_access_total
列 | 説明 |
---|---|
直近の転送速度 (bytes/seconds) | |
Read に掛かった時間だけから計算した読み始めからの転送速度 (bytes/seconds) | |
Read とそれ以外の符号検査処理も全て含んだ時間で計算した直近の転送速度 (bytes/seconds) | |
Read 以外に掛かった時間(主に符号検査処理)を全て含めても全て含んだ時間で計算した読み始めからの転送速度 (bytes/seconds) | |
次に読み込みを行うバイト位置テスト終了時はファイルサイズと一致します (byte) | |
進捗度を百分率で表しています。0 から 100 の値になります。(%) | |
Read に掛かった時間 (seconds) | |
読み始めから Read に掛かった時間の合計 (seconds) | |
読み始めから Read とそれ以外の処理時間 (主に符号検査処理) も全て含めた経過時間 (seconds) | |
読み込み以外、主に符号検査処理に掛かった時間 (seconds) |
index, elapsed_time, rw, seek_position, length, access_time, bps, memory_access_time
列 | 説明 |
---|---|
アクセス連番、 0 から -n オプションで指定した値 -1 までの番号 | |
経過時間、Read/Write 以外に掛かった時間も含む (seconds) | |
アクセス種別 'r' で Read, 'w' で Write | |
ランダムアクセス開始位置 (16 進数, byte) | |
アクセス長 (16 進数, byte) | |
アクセス時間 (seconds) 符号検査・検査符号生成に掛かった時間は含んでいません | |
アクセス長 / アクセス時間 (bytes/seconds) | |
符号検査、検査符号生成に掛かった時間 (seconds) |
結果をプロットする機能は bash スクリプトと gnuplot で構成されています。出力形 式は PNG です。gnuplot のバージョンによって若干グラフの出来上がりが違います。
次の表は結果をプロットするためのスクリプト一覧です。SSD をテストした結果をプロットするには、 plotlogseq.sh, plotlogmix.sh の 2 つを使います。
Script | Description |
---|---|
plotlogseq.sh | SSD のシーケンシャルアクセステスト ((a1) sequential read, (a3) sequential write") の結果をプロットします。 |
plotlogmix.sh | SSD のランダムアクセステスト ((a2) random read and write) の結果をプロットします。 |
plotlogseq_usbmems.sh | High Speed 接続 USB memory のシーケンシャルアクセステスト ((a1) sequential read, (a3) sequential write") の結果をプロットします。 グラフの軸スケールと範囲を High speed 接続 USB memory に合う様に調整してあります。 遅い USB memory をプロットしてスケールや範囲が合わない場合はスクリプトを修正してください。 USB 3.0 Super Speed 対応の早い USB memory や UHS1 対応の Micro SD, SD card をテスト した結果をプロットする場合は plotlogseq_uhs1.sh の方が適している場合があります。 |
plotlogmix_usbmems.sh | High Speed 接続 USB memory のランダムアクセステスト ((a2) random read and write) の結果をプロットします。 グラフの軸スケールと範囲を High speed 接続 USB memory に合う様に調整してあります。 遅い USB memory をプロットしてスケールや範囲が合わない場合はスクリプトを修正してください。 USB 3.0 Super Speed 対応の早い USB memory や UHS1 対応の Micro SD, SD card をテスト した結果をプロットする場合は plotlogmix_uhs1.sh の方が適している場合があります。 |
plotlogseq_uhs1.sh | UHS1 SD Card (Micro SD Card) のシーケンシャルアクセステスト ((a1) sequential read, (a3) sequential write") の結果をプロットします。 グラフの軸スケールと範囲を UHS1 SD card (Micro SD card) または Super speed USB memory に合う様に調整してあります。スケールや範囲が合わない場合はスクリプトを修正してください。 |
plotlogmix_uhs1.sh | UHS1 SD Card (Micro SD Card) のシーケンシャルアクセステスト ((a2) random read and write) の結果をプロットします。 グラフの軸スケールと範囲を UHS1 SD card (Micro SD card) または Super speed USB memory に 合う様に調整してあります。遅い USB memory をプロットしてスケールや範囲が合わない場合はスクリプトを 修正してください。USB 3.0 Super Speed 対応の早い USB memory や UHS1 対応の Micro SD, SD card をテスト した結果をプロットする場合は plotlogmix_uhs1.sh の方が適している場合があります。 |
グラフのスケールと範囲が適切でなく、結果がプロットされない、はみ出す、振れ幅が小さいなどの 問題が起きた場合は、スクリプト plotlogseq_usbmems.sh, plotlomix_usbmems.sh, plotlogseq_uhs1.sh, plotlogmix_uhs1.sh で設定している次の環境変数を調整してください。
Exporting environment variable | Description |
---|---|
SEQUENTIAL_TRANSFER_SPEED_MIN | シーケンシャルアクセスの最低転送速度を指定します。 |
SEQUENTIAL_TRANSFER_SPEED_MAX | シーケンシャルアクセスの最高転送速度を指定します。 |
RANDOM_TRANSFER_SPEED_MIN | ランダムアクセスの最低転送速度を指定します。 |
RANDOM_TRANSFER_SPEED_MAX | ランダムアクセスの最高転送速度を指定します。 |
シーケンシャルアクセステスト結果をプロットします。PNG ファイルが生成されます。 htmlplot.sh で使用する情報も生成します。
$ ${tool_path}/plotlogseq.sh [-L model_name] [log_directory] $ ${tool_path}/plotlogseq_usbmems.sh [-L model_name] [log_directory] $ ${tool_path}/plotlogseq_uhs1.sh [-L model_name] [log_directory]
parameter | description |
---|---|
グラフのタイトル部分を構成するモデル名を model_name に差し替えます。 空白を含めることはできません。 | |
log_directory |
ssdtest.sh が生成したログ結果を保存したディレクトリです。
省略するとカレントディレクトリを指定した事になります。ディレクトリ名は次の様な書式です。
log-${Model}-${TestDateTime}-${TestFileSize} |
ランダムアクセステスト結果をプロットします。PNG ファイルが生成されます。 htmlplot.sh で使用する情報も生成します。
$ ${tool_path}/plotlogmix.sh [-L model_name] [log_directory] $ ${tool_path}/plotlogmix_usbmems.sh [-L model_name] [log_directory] $ ${tool_path}/plotlogmix_uhs1.sh [-L model_name] [log_directory]
parameter | description |
---|---|
グラフのタイトル部分を構成するモデル名を model_name に差し替えます。 空白を含めることはできません。 | |
log_directory |
ssdtest.sh が生成したログ結果を保存したディレクトリです。
省略するとカレントディレクトリを指定した事になります。ディレクトリ名は次の様な書式です。
log-${Model}-${TestDateTime}-${TestFileSize} |
プロットした図を HTML ページにまとめます。次の様にコンソール出力結果をリダイレ クトしてページファイルに格納してください。
$ ${tool_path}/htmlplot.sh [-L model_name] [log_directory] > html_page_file.html
parameter | description |
---|---|
ページのタイトル部分を構成するモデル名を model_name に差し替えます。 空白を含めることはできません。 | |
log_directory |
ssdtest.sh が生成したログ結果を保存したディレクトリです。
plotlogseq.sh, plotlogseq_usbmems.sh, plotlogseq_uhs1.sh,
plotlogmix.sh, plotlogmix_usbmems.sh, plotlogmix_uhs1.sh で
プロットした PNG ファイルも含んでいるディレクトリです。
省略するとカレントディレクトリを指定した事になります。
ディレクトリ名は次の様な書式です。
log-${Model}-${TestDateTime}-${TestFileSize} |
html_page_file.html | htmlplot.sh から HTML 形式でテキストが出力されるのでリダイレクトして html_page_file.html に格納してください。 |
テストを連続実行をする環境で同時プロットをするとテスト結果に影響を与える可能性 が有ります。テスト環境とプロット環境を分離することをお勧めします。
NFS を使用して分離する環境例を次に示します。
Machine execute SSD test (test) Machine execute plot (plot) +---------------------------+ +-------------------------------+ | Execute ssdtestloop.sh |-- Network --| Execute pageupdaterloop.sh | | NFS client | | NFS server | | | | | +---------------------------+ +-------------------------------+
NFS client として設定し、NFS マウントポイント以下にテスト結果を格納する様にし ます。マウントオプションは -o rw です。これ以外のオプションは環境に合わせて 設定してください。
NFS server として設定し、NFS export ディレクトリ以下のテスト結果をプロットする 様にします。export オプションは rw,async,anonuid=UserId,anongid=GroupId です。 UserId, GroupId はプロットを行うプログラムを走らせる user ID と group ID です。普通は自分自身の User ID, Group ID を指定することになります。これ以外の オプションは環境に合わせて設定してください。
anonuid, anongid は ssdtestloop.sh (およびこれから起動されるプログラム群) が root 権限で書き込むファイルに付与される uid, gid となります。
以下に NFS 設定、SDD マウントが済んだ後の操作例を示します。plot# はプロット 実行マシン (plot) 上での操作、test# はテスト実行マシン (test) での操作です。 plot 上でプロットを実行する userid, groupid は 1000, 1000 としています。
ノート: | ${tool_path} は plot, test 両マシンでそれぞれ、適したパスに置き換えてください。 |
plot# mkdir -p /export/share1 plot# cd /export/share1 plot# chmod a+rw . plot# chmod +t . plot# mkdir loop_test plot# chown 1000:1000 loop_test
plot# vi /etc/exports /export/share1 test(rw,async,anonuid=1000,anongid=1000) この行を追加 plot# exportfs -a
test# mkdir -p /mnt/shared1 test# mount -o rw plot:/export/share1 /mnt/share1 test# cd /mnt/shared1 test# cd loop_test test# ${tool_path}/ssdtestloop.sh -C 20 /ssd/mount/point
Note: | /ssd/mount/point は SSD をマウントしたポイントです。 |
plot$ cd /export/share1/loop_test plot$ ${tool_path}/pageupdaterloop.sh .
ssdtest.sh を連続実行します。
# ${tool_path}/ssdtestloop.sh -C LoopCount [-L ModelNameLabel] /path/to/test
Option or Argument | Description |
---|---|
連続実行する回数を LoopCount 回にします。 | |
SSD のモデル名に付加したい文字列を ModelNameLabel で指定します。 モデル名の接尾辞として扱われます。USB Memory の場合はモデル名を 採取できない場合があります。この場合は必ず指定してください。 | |
テストしようとする SSD をマウントしたパス、またはそれより深い 階層のパスを指定します。ディレクトリを指定すれば、そのディレクトリに UUID 形式 の名前が付いたファイルを生成してテストをします。ファイル名を指定すれば、その名 前でファイルを生成してテストをします。 |
テスト結果(テストログ)はカレントディレクトリの下に次の名前で作ったディレクトリ に格納されます。テストの繰り返し毎に、TestDateTime がテスト開始時刻に 更新されて新しいディレクトリの下に結果が格納されます。
log-${ModelName}${ModelNameLabel}-${TestDateTime}-${テストファイルサイズ}
カレントディレクトリの下に ssdtestloop_$PID_loop.txt というファイルが作成され ます。$PID の部分はプロセス ID です。このファイル書かれた数値を増減させると、 連続実行する回数を調整できます。
ssdtestloop.sh で連続実行して生成した複数のログ(ディレクトリ)の HTML ページを 生成し、連続実行結果をまとめたページを生成します。pageupdaterloop.sh から呼び出 されるスクリプトです。
$ ${tool_path}/pageupdater.sh [update-directory]
update-directory は ssdtestloop.sh を実行した(実行している)カレントディレクト リを指定します。update-directory 以下にテスト結果を格納した log-* ディレクトリ が ssdtestloop.sh によって作られた(作られている)ディレクトリです。省略した場合は update-directory はカレントディレクトリになります。
ssdtestloop.sh で逐一生成されるログを一定間隔でプロット、 HTML ページ更新をするツールです。
$ ${tool_path}/pageupdaterloop.sh \ [-T IntervalTime] [update-directory] > html_page_file.html
Option or Argument | Description |
---|---|
更新周期を IntervalTime 秒に指定します。(既定 60) | |
ssdtestloop.sh を実行した(実行している)カレントディレクト リを指定します。update-directory 以下にテスト結果を格納した log-* ディレクトリ が ssdtestloop.sh によって作られた(作られている)ディレクトリです。省略した場合 は update-directory はカレントディレクトリになります。 | |
各 log-* ディレクトリ以下に作られたページにリンクを貼った インデックスページを格納するファイルを html_page_file.html に格納します。 リダイレクトで保存してください。 |
乱数生成アルゴリズム MT19937 が正しく動作するか検査する機能です。検証用の既知 結果と照合します。
$ cd ${tool_path} $ make mtTest
SSD をマウントする際に -o discard を付けると、ファイルシステムが対応して いれば TRIM コマンドが使われます。ssdtest の場合、ファイルの削除は殆ど しないため、効果が薄いかもしれません。次のコマンドライン入力例は SSD の /dev/sdb1 パーティションを discard オプションを付けてマウントする例です。
# mkdir /mnt/sdb1 # mount -o discard /dev/sdb1 /mnt/sdb1
パーティションアラインメントを確認するには /sbin/fdisk に -u オプションを 指定して起動しパーティションテーブルを LBA 単位で表示して下さい。
測定プロットのタイトルなどに入る単語 O_DIRECT はファイルを open する際の フラグです。
O_DIRECT が付いているテスト (with O_DIRECT) は、OS のキャッシュを使わない アクセスをします。SSD の性能をそのまま測定します。
O_DIRECT が付いていないテスト (without O_DIRECT) は、OS のキャッシュを使う アクセスをします。実際の使用感に近い測定結果となります。SSD の機種によっては アクセス時間が長くなる傾向が出てきます。例えば 1~2MiBytes のアクセスにも 関わらず 1 ~ 10 秒程掛かる場合が出てきます。
カーネルパラメータを調整して SSD の性能が出やすいようにしています。
シーケンシャルアクセステストでは Linux の既定値と同じ 128KiByte に 設定しています。環境変数 SEQUENTIAL_READ_AHEAD_KB で設定できます。
ランダムアクセステストでは、0KiByte に設定しています。環境変数 RANDOM_READ_AHEAD_KB で設定できます。Linux の既定値と違うので、実使用状態で 出る性能と違う測定結果が得られる可能性が有ります。測定の方が転送速度が高め に出る傾向が有ると考えられます。
1 回のデバイスに対するトランザクションで read/write する最大セクタ数の 上限値です。次の max_sectors_kb の上限値を決めています。 Linux kernel version, device driver, 転送経路のコントローラチップ, アクセス先のデバイスによってはこのノードが存在しないこともあります。
ノードが存在し書き込み可能な場合は、値を増やすと転送効率が上昇し 性能が上がります。
しかし、何らかの不具合を起こす可能性もあります。ssdtest ツールはこの パラメータを変更しません。デバイスの純粋な性能を見るためには値が大きい方が 望ましいです。大きくする場合は転送データを比較するなど入念なテストを行う ことをお勧めします。
1 回のデバイスに対するトランザクションで read/write する 最大セクタ数です。max_sectors または ドライバ内の制限値がこのパラメータの最大値を決めています。
標準的な Linux の環境では、シーケンシャルアクセステスト、 ランダムアクセステスト双方で 30Mi byte を設定しています。 Linux の既定値は 512Ki byte です。既定値に対して大きな値にして性能向上を 狙っています。
hung_task_timeout_secs が存在する場合、テスト中は 0 に設定し、長時間処理が 滞った場合でも強制 kill しない様にしています。テスト中 1 回の system call による read/write 時間が 100 秒を超えることが有り、さらに既定値の 120 秒を 超えた場合テストが中断してしまう場合が有りました。
テスト終了後、カーネルパラメータはテスト実行前に設定されていた値に 戻ります。
ssdstress プロセスで約 6.5GiByte 使用します。page lock を試みます。常に 6.5GiByte を主記憶に保持できる環境が理想です。他のプロセスでメモリを多く使用 しない様にして下さい。例えば、runlevel 3 にして GUI を停止してください。
swap の設定は変更していません。外乱を少なくするため、メモリが 8GiByte 以上 ある場合は、メモリを多く専有するプロセスを停止し swap を off にするとよりよい 結果になると考えられます。
シーケンシャルアクセステストとランダムアクセステストの間、パラメータを 変えたランダムアクセステストの間、一定のテスト休止時間を設けています。OS の cache に残留したアクセスの消化、遅延されているファイルシステムを 構成している管理情報の更新、SSD 内の処理収束を待つ時間です。休止期間が 無い場合、シーケンシャルアクセスに於いて、転送速度が大きく乱れる現象を 確認しています。
SSD 内の処理については推定するしかないのですが、wear leveling, 保留していたエラー訂正後の書き戻し処理が行われている可能性が有ります。
書き込みデータは MT19937 アルゴリズムを使用した疑似乱数で生成しています。 書き込みデータの破損が無いか検査用の符号を付加しています。検査用の符号は ブロック位置とチェックサムで構成されています。
圧縮手法を使用して高速化している SSD ではその効果が出ずに、結果が低い 転送速度を示すことがあります。
ランダムアクセステスト、シーケンシャルアクセステストの read にて破損が 発見された場合、テストは Fail します。破損検査は、転送速度に影響が出ない 程度で軽く行っています。
万が一、テスト対象の SSD が書き込みデータパターン照合等により、テスト用の 特殊な挙動をしていると考えられる場合は環境変数 SEED に乱数の種値を設定して ください。SEED 値を変更するとランダムアクセスパターンも変化します。
検査符号生成と符号検査するもう一つの目的は OS のページ管理による影響を 減らすことを狙っています。
Linux ではまだ積極的に取り入れていないはずですが、read() システムコールで 読み出したデータをプログラムから memory read するまで主記憶に配置しない場合が あるOS が存在します。memory read をしなければ read() システムコールはデバイス から何も読みだしません。アクセスエラー等の例外的な事象の正確性は犠牲に なりますが、多くの場合、支障をきたすことはありません。
この様な OS の最適化の影響を減らすため符号検査を実施しています。 memory_access_time, Tmem_access_total の異様な増加が認められる場合、read() システムコールに何らかの最適化が施されている可能性が有ります。
ssdstress は mmap でメモリを確保する際 page lock を試みます。page lock をして常に主記憶上に read と write バッファを確保します。page lock が 出来なかった場合は、ランダムアクセス時 read 前は 0x0 を、write 前は 検査符号をバッファに書き込み、バッファを出来る限り主記憶に配置されている 状態にします。
ssdstress.c は 32bit プロセッサ上でもコンパイル・実行可能です。 32 bit プロセッサ上で ssdtest_usbmem.sh, ssdtest_light_usbmem.sh が使用可能です。これらの必要メモリ量は 120Mibyte です。 主記憶が少ない環境でも実行可能です。
ssdtest_usbmem.sh, ssdtest_light_usbmem.sh を SSD に対して 使用することが可能です。使用した場合、テスト規模が縮小され、 ランダムアクセステストの転送長は最長 32Mi byte になります。 得られる性能データにピーク性能が含まれない場合が有ります。 あるいは SSD 内のキャッシュメモリが 16Mi byte 以上ある場合、 書き込み速度はキャッシュメモリに書き込むまでの処理を測る事になり、 不揮発メモリへの書き込み速度が測定されない場合があります。
性能測定範囲、必要メモ量を調整するには ssdtest_usbmem.sh, ssdtest_light_usbmem.sh スクリプト内で設定している次の 環境変数の値を調節してください。
Exporting environment variable | Description |
---|---|
RANDOM_BLOCKS_MAX | ランダムアクセスで一度に read/write するブロック数の最大値。 必要メモリ量は約 BLOCK_SIZE * RANDOM_BLOCKS_MAX * 3 + 32Mi byte です(BLOCK_SIZE = 512)。テスト中に同時にプロットする場合は +100Mi byte 程度を見込んで下さい。 |
SEQUENTIAL_BLOCKS | シーケンシャルアクセスで一度に read/write するブロック数。 RANDOM_BLOCKS_MAX * 2 以下の値であること。 |
主な変更点は次の通りです。
Version | Date | Updates |
---|---|---|
0.7 | 2012/11/18 |
|
0.71 | 2012/12/23 |
|
1.0 | 2012/12/31 |
|
1.01 | 2013/01/02 |
|
2.00 | 2017/1/17 |
|
次のファイル群は 2 条項 BSD ライセンスです。
htmlplot.sh, pageupdater.sh, pageupdaterloop.sh, plotlogmix.sh, plotlogmix_uhs1.sh, plotlogmix_usbmems.sh, plotlogseq.sh, plotlogseq_uhs1.sh, plotlogseq_usbmems.sh, ssdtest.sh, ssdtest_light.sh, ssdtest_light_usbmems.sh, ssdtest_usbmems.sh, ssdtestcommon.sh, ssdtestloop.sh, random-ts_at.gnuplot, random-at_tl.gnuplot, random-ts_tl.gnuplot, sequential-ts_pr.gnuplot, ssdstress.c, Makefile, readme.html
次の MT19937 アルゴリズムソースと文書は Makoto Matsumoto 博士と Takuji Nishimura 博士と が作成したソフトウエアであり、3 条項 BSD ライセンスです。
mt19937ar.c, mt19937ar.h, mt19937ar.out, mtTest.c, readme-mt.txt
公開に感謝します。プログラム間の整合性と 64bit 環境でコンパイルできる様に するための修正、コメント部分を doxygen スタイルにする修正を施しています。
Copyright 2012, 2017 Akinori Furuta <afuruta
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.