スポンサーリンク

Linux でディスクのアクセス速度を測定する その1 【準備編】

autumn_full_moon
記事内に広告が含まれています。
スポンサーリンク

はじめに

Synology の DS218plus の HDD を 4TB -> 8TB に更新した際に、内蔵2基 + Hyper Backup 用1基の合計3基の 4TB HDD が遊休となりました。

この3基の HDD は PC に内蔵し、特に用途を決めないで色々な実験に使おうと考えていました。その一つとして、Windows11 の Software RAID に相当する記憶域について試した記事を、私のはてなブログで記事にしました。

この時のまとめとして、記憶域シンプル (RAID0相当)、記憶域双方向ミラー (RAID1相当)、記憶域パリティ (RAID5相当) の3種類を比較して、

  • HDD を3台使用した記憶域シンプルは、PowerShell で作成する必要はありますし耐障害性は落ちますが、SATA の限界である 550 MB/sec の Sequential Read / Write を実現できます。もちろん NVMe M.2 SSD には敵いませんし Random Access は遅いですが、4 TB 以上の容量をそれなりの速度と価格で準備できるというのは魅力的です。
  • 記憶域の双方向ミラーとパリティは、別のハードウェアを使用せずに Windows の機能だけで耐障害性を担保できる有用な機能です。記憶域パリティは Write の速度が極端に落ちますが、Read は HDD 単体と同等か少し速いので、3台の HDD を準備できるのであれば記憶域パリティを選ぶのが良いかと思います。

と記載しました。

この当時から「次は Linux で試してみよう」という考えがあったのですが、下調べに時間を要して、中々取り組めずに1年以上経過してしまいました。

情報収集がある程度済みましたので、この記事では Linux のディスクのアクセス速度を測定する方法と、アクセス速度を実測し、様々な環境のデータを比較しようと考えています。

今回は【準備編】として

  • テスト環境
  • ディスクのアクセス速度を測定する方法
  • Linux の代表的なファイルシステムである Ext4 を使用した実測結果

について記載します。

現時点では、次回以降は次の項目についてまとめる予定です。

  • 【ファイルシステム比較編】… Ext4 以外の主要なファイルシステムのアクセス速度を測定。今の所、Ext4 に追加して Btrfs、XFS、ZFS、JFS について試そうと考えています。
  • 【ソフトウェア RAID 編1】… mdadm を使用した Software RAID を構成し、RAID0 / RAID 1 / RAID 5 のそれぞれについて、Ext4、Btrfs、XFS、ZFS、JFS のファイルシステムを使用してみようと考えています。
  • 【ソフトウェア RAID 編2】… Btrfs と ZFS はファイルシステムの機能の中に RAID とストレージプールを有しています。この二つのファイルシステムでは mdadm を使用せずに RAID を構成してみようと考えています。

新しい記事を作成した際には、以下にリンクを記載します。

その2として diskspd for linux の試行回数を増やして確認しました。diskspd for linux のアクセス速度はバラツキが大きく、ファイルシステムの種類によっては O_DIRECT が意図せず無効となっているような傾向も見られました。diskspd for linux は、私はディスクのアクセス速度の評価には使用できないと判断しました。

その3として fio の試行回数を増やして確認しました。fio のアクセス速度は、測定条件の微調整及びデータサイズを 3GB とする事によってバラツキが小さくなりました。fio はディスクのアクセス速度の評価に使用できます。今後は、他のファイルシステムでも試してみます。

その4として fio で filesystem 4種類 (Ext4, XFS, Btrfs, JFS) のアクセス速度を比較しました。O_DIRECT が素直に効かない、或いは Cache 有効で sync した際に長時間を要する、等の測定の不具合に対処しました。現時点の個人的な結論は、Ext4 = XFS >= Btrfs > JFS です。

その5として mdadm で RAID 0 (2、3基) / 1 / 5 の RAID array を作成し、3種類の filesystem (Ext4, XFS, Btrfs) でフォーマットし、fio でディスクのアクセス速度を測定しました。Sequential access は RAID0 でディスクの数を増やすとリニアにアクセス速度が向上し、3基では SATA SSD 並みの大容量の記憶領域が確保できます。ただし、RAID 0 は冗長性がないので、Random access の低さを考慮した上で RAID 5 を使用するのが良さそうです。

また、メインメモリの Cache を使用すると、Cache の効果が大きく RAID によるアクセス速度向上の効果は見えにくくなります。sync に要する時間は短縮されますので、急な電源断等によるデータの消失のリスクは下げられます。

スポンサーリンク

テスト環境

PC 仕様 全体

2023年9月現在の私の PC の構成です。

種類名称
CPUAMD Ryzen 7 3800x
CPU CoolerNoctua NH-U14S
MotherboardASUS TUF GAMING X570-PLUS
Memory 116ATF2G64AZ-3G2J1
Micron DDR4-3200 (16GB x 2)
Memory 2CT16G4DFRA32A.M8FB
Crucial DDR4-3200 (16GB x 2)
Video CardnVidia GeForce RTX3060 12GB
NVMe M.2_1Western Digital SN850 2TB
SSD1SATA SanDisk Ultra3D 1TB
SSD2SATA CFD CSSD-SM128WJ3 128GB
HDD1SATA Hitachi HDS721010CLA332 1TB
HDD2SATA Western Digital Red WD40EFRX-RT2 4TB
HDD3SATA Western Digital Red WD40EFRX-RT2 4TB
HDD4SATA Seagate IronWolf ST4000VN008 4TB
DVD/Blu-ray DrivePioneer BD-RW BDR-209M
CaseFractal Design DEFINE R6 Black
PowerSupplyFractal Design ION+ 660P
MonitorAcer VG270Kbmiipx 27inch 4k IPS
Digital Amp.Sabaj A3 (Optical)
SpeakerMicca COVO-S
KeyboardKeychron K8 RGB Backlight Brown switch (USB)
MouseLogicool G604 (USB, LIGHTSPEED)
2023年9月現在の PC の構成

2020年1月に購入し、旧 PC から一部の機器を転用、周辺機器を少しずつ揃えながら今の形になりました。

SSD / HDD 一覧

PC に接続している SSD / HDD の用途は以下の通りです。

種類名称用途
NVMe M.2_1Western Digital SN850 2TBWindows11 Pro 用
SSD1SATA SanDisk Ultra3D 1TBUbuntu 22.04 LTS 用
(Hyper-V, ベアメタル)
SSD2SATA CFD CSSD-SM128WJ3 128GBUbuntu 23.04 用
(Hyper-V, ベアメタル)
HDD1SATA Hitachi HDS721010CLA332 1TB汎用一時保管用
HDD2SATA Western Digital Red WD40EFRX-RT2 4TBテスト用
HDD3SATA Western Digital Red WD40EFRX-RT2 4TBテスト用
HDD4SATA Seagate IronWolf ST4000VN008 4TBテスト用
2023年9月現在の SSD / HDD の用途

NVMe M.2 の WD SN850 2TB が Windows11 Pro 用でメインで使用しています。SSD1 / SSD2 の SATA SSD には Ubuntu をインストールし、Hyper-V とベアメタルで両方で起動できるようにしています。併用する方法については、私が qiita に投稿した記事を参照下さい。

HDD2 ~ HDD4 がテスト用として使用している、NAS から外して PC に取り付けている HDD です。これら 3基の HDD を使用して、Linux のディスクのアクセス速度を測定します。2種類の HDD のスペックを以下に示します。

項目Seagate IronWolfWesternDigital Red
型式ST4000VN008WD40EFRX-RT2
容量4TB4TB
最大連続
データ転送
速度
180 MB/s150 MB/s
回転速度5900 rpm5400 rpm
キャッシュ64 MB64 MB
略称SGWD1, WD2
テスト用 HDD のスペック一覧

以下の説明では、Seagate IronWolf を SG、WesternDigital Red を WD1、WD2 と省略して表します。2種類の HDD の NTFS でフォーマットした際の CrystalDiskMark の結果です。

Seagate IronWolf 4TB CDM 結果
WesternDigital Red 4TB CDM 結果

CrystalDiskMark は測定結果のピーク値を表示しますので、WD1 の SEQ1M の結果が公称より高めですが、当時の 4TB HDD としては一般的なアクセス速度かと思います。

今回は使用しませんが、比較の為に所有している SSD / HDD の CrystalDiskMark の結果も載せておきます。

WesternDigital Black SN850 2TB CDM 結果
SanDisk Ultra3D 1TB CDM 結果
CFD SM128WJ3 128GB CDM 結果
HGST HDS721010CLA332 1TB CDM 結果

(CrystalDiskMark 8 と 6 の結果が混在しています。ご了承下さい)

Sequential もそうですが、Random 4K のアクセス速度が SSD と HDD では大違いですね。

使用する Linux : Ubuntu 22.04 LTS (Hyper-V & ベアメタル)

Linux は、SSD1 にインストールされている Ubuntu 22.04 LTS を使用します。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy

いつものように、Hyper-V で起動して各種設定を済ませ、再起動してアクセス速度を測定します。

Hyper-V Path through で HDD を接続する方法

前記 qiita のリンク先にも記載していますが、こちらのページにも記載しておきます。

Windows11 で該当ディスクをオフラインにする

Windows11 の「ディスクの管理 (パーティションの作成とフォーマット)」で該当ディスクを選択し、右クリックからオフラインを選択します。ディスクのアイコンに赤い×マークが表示されれば OK です。

Windows11 ディスクの管理 (パーティションの作成とフォーマット)からオフラインに

Hyper-V の設定でオフラインにしたディスクを接続する

Hyper-V マネージャーから仮想マシンの「設定」を開き、SCSI コントローラから新しいディスクを追加します。通常は仮想ハードディスクを選択しますが、オフラインになっているディスクが存在している場合には「物理ハードディスク」が選択できるようになります。この中から、先頭のディスク名を見て、仮想マシンに接続したい物理ディスクを選択し、OK or 適用で反映させます。

これで仮想マシンを起動すれば、SCSI デバイスとして認識されます。Windows11 上の名称とは異なり、且つ mount 等はされませんので、デバイス名を調べて操作する事になります。実際のデバイス名を調べる方法は後述します。

ディスクのアクセス速度を測定する方法

CrystalDiskMark は Windows 用のソフトウェアですので、Linux のファイルシステムのアクセス速度は測定できません。私が Linux を使い始めた約30年前から存在している手法を含め、幾つかの測定方法を試してみました。

今回はアクセス速度を測定する部分に焦点を当て、必要なオプションの説明のみを記載します。記載していないオプションについては、man ページを見るかググる等で対処下さい。

hdparm

hdparm は、昔の Parallel ATA 時代にディスクのパラメータを設定する為のコマンドでした。現在では SATA にも対応しています。

その機能の一つに、ディスクのアクセス速度を測定するオプション (-t) があります。実行した結果は以下の通りです。

$ sudo hdparm -t /dev/sdb

/dev/sdb:
 Timing buffered disk reads: 532 MB in  3.01 seconds = 176.97 MB/sec

hdparm で測定できる項目は、Sequential Read のみです。

man ページには「有意義な測定結果を得る為には、他にプロセスが動作してない状態で複数回測定する」事が推奨されています。5秒間隔で10回測定するワンライナーを以下に示します。

$ for i in {1..10} ; do sleep 5 ; sudo hdparm -t /dev/sdc | grep 'MB/sec' ; done
 Timing buffered disk reads: 514 MB in  3.01 seconds = 170.88 MB/sec
 Timing buffered disk reads: 526 MB in  3.01 seconds = 174.93 MB/sec
 Timing buffered disk reads: 526 MB in  3.00 seconds = 175.28 MB/sec
 Timing buffered disk reads: 532 MB in  3.02 seconds = 176.26 MB/sec
 Timing buffered disk reads: 540 MB in  3.01 seconds = 179.58 MB/sec
 Timing buffered disk reads: 538 MB in  3.00 seconds = 179.26 MB/sec
 Timing buffered disk reads: 546 MB in  3.00 seconds = 181.99 MB/sec
 Timing buffered disk reads: 544 MB in  3.01 seconds = 180.96 MB/sec
 Timing buffered disk reads: 530 MB in  3.01 seconds = 176.34 MB/sec
 Timing buffered disk reads: 532 MB in  3.00 seconds = 177.20 MB/sec

CrystalDiskMark の SEQ1M Q8T1 程度のアクセス速度が得られます。

dd

dd はブロックデバイスから直接データをコピー・変換する為のコマンドです。

良く使用される用途としてはパーティションやブートレコードの情報をバックアップ・リストアする事ですが、dd コマンドでもディスクのアクセス速度を測定する事が出来ます。

# Write
$ dd if=/dev/urandom of=/media/hiro/SG/1G_data bs=1M count=1000 oflag=direct
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.79696 s, 181 MB/s

# Read
$ dd if=/media/hiro/SG/1G_data of=/dev/null bs=1M count=1000 iflag=direct
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.72074 s, 183 MB/s

dd で測定できるのは Sequential Write / Sequential Read の二種類です。

Write の際の oflag=direct、Read の際の iflag=direct は、キャッシュを使用せずに読み書きする為のオプションです。このオプションを除外すると、Write の場合はあまり違いはありませんが、Read の場合は異常に速いアクセス速度が表示されるようになります。

dd も複数回測定できるようにワンライナー化しました。

# Write
$ for i in {1..10} ; do sleep 5 ; dd if=/dev/urandom of=/media/hiro/SG/1G_data bs=1M count=1000 oflag=direct 2>&1 | grep 'MB/s' ; done
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.7294 s, 183 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.86722 s, 179 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.91315 s, 177 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.89164 s, 178 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.84124 s, 180 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.93184 s, 177 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.88823 s, 178 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.87921 s, 178 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.80168 s, 181 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.62625 s, 186 MB/s

# Read
$ for i in {1..10} ; do sleep 5 ; dd if=/media/hiro/SG/1G_data of=/dev/null bs=1M count=1000 iflag=direct 2>&1 | grep 'MB/s' ; done
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.77221 s, 182 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.68375 s, 184 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.75448 s, 182 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.72405 s, 183 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.7642 s, 182 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.73436 s, 183 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.76398 s, 182 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.71424 s, 184 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.71415 s, 184 MB/s
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.69388 s, 184 MB/s

アクセス速度の有効桁が少ないので、別途、転送した bytes と sec から再計算した値を使用します。

Gnome Disks

GUI ベースですが、Gnome の「ディスク (gnome-disks)」にもディスクのアクセス速度を測定する機能があります。

左側のリストから、測定したいディスクを選択します。

ディスクの選択

右側の縦3点リーダーを押して「ディスクのベンチマーク」を選択します。(下図は Hyper-V Path through 接続のディスクを使用している為、SMART のデータ表示等は選択できなくなっています。ベアメタルで起動した場合には SMART のデータ等も選択できます)

ディスクのベンチマークを選択

ベンチマークの画面が開きます。過去にベンチマークを実行していた場合には、その結果が表示されます。青線が読み込みレート、赤線が書き込みレート、緑の点がアクセス時間になります。それぞれの平均値が下側に表示されています。

再びベンチマークを実施したい場合には「ベンチマーク開始」を押します。

転送レートの「サンプル数 (初期値100)」と「サンプルのサイズ (初期値10MiB)」、アクセス時間の「サンプル数 (初期値1000)」を設定します。書き込みのアクセス速度も測定したい場合には「書き込みベンチマークを実行する」のチェックを入れます。

「ベンチマーク開始」を押すとベンチマークが始まります。

ベンチマーク設定

瞬間値がグラフに表示されながらベンチマークが進行します。終了すると、下部に平均値が表示されます。

ベンチマーク結果

この測定方法は Sequential Read / Write だと予想しますが、サンプル数100、サンプルサイズ10MiB の結果は CrystalDiskMark の結果より低い値が表示されました。ベンチマーク開始直後が数値が高く、徐々に下がっている事から、ディスクのアクセスの速い領域・低い領域を測定して平均値を算出している為と考えられます。

Gnome Disks で書き込み速度を測定する場合は、ディスクを一旦 umount してから測定し、再び mount してから結果を表示します。root (/) に mount しているデバイスの書き込み速度は測定できないという制限があります。

diskspd for linux

diskspd for linux は、Microsoft が公開している、Linux 用のディスクのアクセス速度を測定するソフトウェアです。

Windows 版もあり、こちらは CrystalDiskMark のバックエンドに使用されています。Windows と Linux でファイルシステム等の環境は異なりますが、同じ測定方法を使用していると思いますので、使ってみる事にしました。

diskspd for linux は CUI のみで GUI はありません。Ubuntu のバイナリパッケージもありませんので、github から clone して実行ファイルを作成する必要があります。

README.md に記載されていますが、make と gcc (g++)、libaio が必要です。

$ sudo apt install make gcc libaio-dev
$ gcc -v 2>&1 | grep 'gcc version'
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
$ make --version
GNU Make 4.3
$ dpkg -l | grep libaio-dev | tr -s ' ' ' '
ii libaio-dev:amd64 0.3.112-13build1 amd64 Linux kernel AIO access library - development files

$ mkdir diskspd && cd diskspd
$ git clone https://github.com/microsoft/diskspd-for-linux
$ cd diskspd-for-linux && ls -a
.   .git        CONTRIBUTING.md  LICENSE   PERFTESTING.md  SECURITY.md  tests.sh
..  .gitignore  HOWITWORKS.md    Makefile  README.md       src
$ make
g++ -MT src/IoBucketizer.o -MMD -MP -MF .d/IoBucketizer.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/IoBucketizer.o src/IoBucketizer.cc
g++ -MT src/diskspd.o -MMD -MP -MF .d/diskspd.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/diskspd.o src/diskspd.cc
g++ -MT src/job.o -MMD -MP -MF .d/job.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/job.o src/job.cc
g++ -MT src/kernel_aio.o -MMD -MP -MF .d/kernel_aio.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/kernel_aio.o src/kernel_aio.cc
g++ -MT src/options.o -MMD -MP -MF .d/options.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/options.o src/options.cc
g++ -MT src/posix_aio.o -MMD -MP -MF .d/posix_aio.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/posix_aio.o src/posix_aio.cc
g++ -MT src/profile.o -MMD -MP -MF .d/profile.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/profile.o src/profile.cc
g++ -MT src/result_formatter.o -MMD -MP -MF .d/result_formatter.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/result_formatter.o src/result_formatter.cc
g++ -MT src/sys_info.o -MMD -MP -MF .d/sys_info.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/sys_info.o src/sys_info.cc
g++ -MT src/thread.o -MMD -MP -MF .d/thread.Td -g -std=c++11 -D_FILE_OFFSET_BITS=64   -c  -o src/thread.o src/thread.cc
g++ -o bin/diskspd src/IoBucketizer.o src/diskspd.o src/job.o src/kernel_aio.o src/options.o src/posix_aio.o src/profile.o src/result_formatter.o src/sys_info.o src/thread.o -lpthread -lrt -laio

$ ls -l bin/
total 4084
-rwxrwxr-x 1 hiro hiro 4179808 Aug 26 20:35 diskspd

diskspd コマンド単体でも使用できますが、Windows 版の CrystalDiskMark の条件を模したスクリプトを公開されている方がいましたので、流用させて頂きました。diskspd for linux のオプションについても下記ページが詳しいです。

$ cd ~/diskspd
$ git clone https://github.com/haxyier/DiskMark-linux-sh

こちらのスクリプトは CrystalDiskMark の Ver.8 系と同等の測定が出来るスクリプトです。diskspd コマンドの場所を指定できるように修正した DiskMark-linux_local.sh を以下に示します。(DISKSPD 変数の内容は実際の diskspd の実行ファイルの場所に置き換えてください)

#! /bin/bash

# This script is derived from CrystalDiskMark
# (https://crystalmark.info/ja/software/crystaldiskmark/)

DISKSPD="../diskspd-for-linux/bin/diskspd"

TEST_FILE=$1
INTERVAL_TIME=5

dm_interval() {
    echo "Wait for the next test for $INTERVAL_TIME seconds..."
    sleep $INTERVAL_TIME
}

echo "Executing Sequential Read (SEQ1M Q8T1)..."

# TODO: Create test file manually for better randomization and less effect on the performance.
${DISKSPD} -c1G -Zr -b1M -d5 -o8 -t1 -W0 -Sd -w0 -L $1
dm_interval

echo "Executing Sequential Read (SEQ1M Q1T1)..."
${DISKSPD} -Zr -b1M -d5 -o1 -t1 -W0 -Sd -w0 -L $1
dm_interval

echo "Executing Random Read (RND4K Q32T1)..."
${DISKSPD} -Zr -b4K -d5 -o32 -t1 -W0 -Sd -w0 -L -r $1
dm_interval

echo "Executing Random Read (RND4K Q1T1)..."
${DISKSPD} -Zr -b4K -d5 -o1 -t1 -W0 -Sd -w0 -L -r $1
dm_interval

echo "Executing Sequential Write (SEQ1M Q8T1)..."
${DISKSPD} -Zr -b1M -d5 -o8 -t1 -W0 -Sd -w100 -L $1
dm_interval

echo "Executing Sequential Write (SEQ1M Q1T1)..."
${DISKSPD} -Zr -b1M -d5 -o1 -t1 -W0 -Sd -w100 -L $1
dm_interval

echo "Executing Random Write (RND4K Q32T1)..."
${DISKSPD} -Zr -b4K -d5 -o32 -t1 -W0 -Sd -w100 -L -r $1
dm_interval

echo "Executing Random Write (RND4K Q1T1)..."
${DISKSPD} -Zr -b4K -d5 -o1 -t1 -W0 -Sd -w100 -L -r $1
dm_interval

rm -f $TEST_FILE

echo "DiskMark is completed!"

diskspd for linux の難点は出力フォーマットを指定できない事です。次に示すように結果がテキストで出力されます。

$ ./bin/diskspd -c1G -Zr -b1M -d5 -o8 -t1 -W0 -Sd -w0 -L /media/hiro/SG/testfile.data

Command Line: ./bin/diskspd -c1G -Zr -b1M -d5 -o8 -t1 -W0 -Sd -w0 -L /media/hiro/SG/testfile.data

System info:
        processor count: 8
        caching options: fua=0

Input parameters:

        job:   1
        ________
        duration: 5s
        warm up time: 0s
        measuring latency
        random seed: 0
        total threads: 1
        path: '/media/hiro/SG/testfile.data'
                size: 1073741824B
                using O_DIRECT
                performing mix test (read/write ratio: 100/0)
                block size: 1048576
                using sequential I/O (stride: 1048576)
                number of outstanding I/O operations: 8)
                thread stride size: 0
                filling I/O buffers with random data
                threads per file: 1
                block device: sdb
                device scheduler: none

Results for job 1:
test time:         5s
*****************************************************

 CPU  |  Usage  |   User  |  Kernel | IO Wait |   Idle
-------------------------------------------------------
    0 |   0.20% |   0.20% |   0.00% |   0.00% |  99.80%
    1 |   0.20% |   0.20% |   0.00% |   0.00% |  99.80%
    2 |   0.00% |   0.00% |   0.00% |   0.00% | 100.00%
    3 |   0.00% |   0.00% |   0.00% |   0.00% | 100.00%
    4 |   0.00% |   0.00% |   0.00% |   0.00% | 100.00%
    5 |   0.00% |   0.00% |   0.00% |   0.00% | 100.00%
    6 |   0.00% |   0.00% |   0.00% |   8.60% |  91.40%
    7 |   0.40% |   0.00% |   0.40% |   0.00% |  99.60%
-------------------------------------------------------
 avg:     0.10% |   0.05% |   0.05% |   1.07% |  98.82%

Total IO
thread |           bytes |         I/Os |       MB/s |  I/O per s | AvgLat(ms) | LatStdDev  | file
-------------------------------------------------------------------------------------------------------
     0 |       804257792 |          767 |     153.40 |     153.40 |    73607.534 |    716463.944 | /media/hiro/SG/testfile.data (1073741824B)
-------------------------------------------------------------------------------------------------------
total:         804257792 |          767 |     153.40 |     153.40 |    73607.534 |    716463.944

Read IO
thread |           bytes |         I/Os |       MB/s |  I/O per s | AvgLat(ms) | LatStdDev  | file
-------------------------------------------------------------------------------------------------------
     0 |       804257792 |          767 |     153.40 |     153.40 |    73607.534 |    716463.944 | /media/hiro/SG/testfile.data (1073741824B)
-------------------------------------------------------------------------------------------------------
total:         804257792 |          767 |     153.40 |     153.40 |    73607.534 |    716463.944
Write IO
thread |           bytes |         I/Os |       MB/s |  I/O per s | AvgLat(ms) | LatStdDev  | file
-------------------------------------------------------------------------------------------------------
     0 |               0 |            0 |       0.00 |       0.00 |       0.000 |       N/A | /media/hiro/SG/testfile.data (1073741824B)
-------------------------------------------------------------------------------------------------------
total:                 0 |            0 |       0.00 |       0.00 |       0.000 |          N/A


  %-ile |       Read (ms) | Write (ms) | Total (ms)
----------------------------------------------
    min |     16.189 |        N/A |     16.189
   25th |     34.910 |        N/A |     34.910
   50th |     54.942 |        N/A |     54.942
   75th |     65.018 |        N/A |     65.018
   90th |     77.420 |        N/A |     77.420
   95th |    105.153 |        N/A |    105.153
   99th | 7052220.46 |        N/A | 7052220.460
3-nines | 7052258.02 |        N/A | 7052258.025
4-nines | 7052258.02 |        N/A | 7052258.025
5-nines | 7052258.02 |        N/A | 7052258.025
6-nines | 7052258.02 |        N/A | 7052258.025
7-nines | 7052258.02 |        N/A | 7052258.025
8-nines | 7052258.02 |        N/A | 7052258.025
9-nines | 7052258.02 |        N/A | 7052258.025
    max | 7052258.02 |        N/A | 7052258.025

DiskMark-linux_local.sh の出力を別ファイルで一旦保存しておいて、アクセス速度のみ表示するワンライナーを作成しました。Executing の行から条件を抜き出し、Total IO の結果からアクセス速度を抜き出しています。

$ ./DiskMark-linux_local.sh /media/hiro/SG/testdata 2>&1 > ./diskspd_SG.log
$ cat ./diskspd_SG.log | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)...      136.40
Read(SEQ1MQ1T1)...      175.80
Read(RND4KQ32T1)...     1.08
Read(RND4KQ1T1)...      0.48
Write(SEQ1MQ8T1)...     143.20
Write(SEQ1MQ1T1)...     175.00
Write(RND4KQ32T1)...    1.21
Write(RND4KQ1T1)...     1.24

Windows 版の CrystalDiskMark と比較すると、Sequential Read / Write の結果が高かったり低かったりと、近い値にはなりませんでした。ファイルシステムも異なりますので、条件を変更した場合の相対値としてみる方が良いかと思います。

また、Btrfs 等の RAID やストレージプールの機能を有するファイルシステムでは、diskspd for linux ではアクセス速度が測定できませんでした (github にも issue が出ています)。回避方法はありますので機会があれば記事にまとめたいと思います。

fio

fio は Linux で一般的に使用されているディスクのアクセス速度を測定するソフトウェアです。

Read / Write を併用できたり、定期的な測定に対応していたり、と非常に多機能なソフトウェアです。今回はあくまでシンプルに、Windows 版の CrystalDiskMark Ver.8 系と似た条件でディスクのアクセス速度を測定してみます。

以下のページを参考にしました。

fio は Ubuntu のパッケージに含まれていますので、apt コマンドでインストールできます。

$ sudo apt install fio
$ fio --version
fio-3.28

Windows 版 CrystalDiskMark Ver.8 系と同等の測定が出来るような設定ファイルを作成しました。

$ cat fio_setting.txt
[global]
ioengine=libaio
size=1g
direct=1
runtime=60
stonewall

[SEQ1M_Q8T1_READ]
rw=read
bs=1m
iodepth=8
numjobs=1

[SEQ1M_Q8T1_WRITE]
rw=write
bs=1m
iodepth=8
numjobs=1

[SEQ1M_Q1T1_READ]
rw=read
bs=1m
iodepth=1
numjobs=1

[SEQ1M_Q1T1_WRITE]
rw=write
bs=1m
iodepth=1
numjobs=1

[RND4K_Q32T1_READ]
rw=randread
bs=4k
iodepth=32
numjobs=1

[RND4K_Q32T1_WRITE]
rw=randwrite
bs=4k
iodepth=32
numjobs=1

[RND4K_Q1T1_READ]
rw=randread
bs=4k
iodepth=1
numjobs=1

[RND4K_Q1T1_WRITE]
rw=randwrite
bs=4k
iodepth=1
numjobs=1

この設定ファイルを読み込み、測定したいパーティションに含まれるフォルダを指定すると、結果が取得できます。

$ fio --directory=/media/hiro/SG/ fio_setting.txt
SEQ1M_Q8T1_READ: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=8
SEQ1M_Q8T1_WRITE: (g=1): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=8
...snip...
fio-3.28
Starting 8 processes
Jobs: 1 (f=1): [_(7),w(1)][53.4%][w=1273KiB/s][w=318 IOPS][eta 07m:00s]
SEQ1M_Q8T1_READ: (groupid=0, jobs=1): err= 0: pid=5271: Mon Sep 11 21:07:54 2023
  read: IOPS=167, BW=167MiB/s (176MB/s)(9.82GiB/60043msec)
    slat (usec): min=20, max=335, avg=29.80, stdev=15.44
    clat (msec): min=24, max=479, avg=47.74, stdev=16.21
     lat (msec): min=24, max=479, avg=47.77, stdev=16.21
    clat percentiles (msec):
     |  1.00th=[   36],  5.00th=[   41], 10.00th=[   41], 20.00th=[   41],
     | 30.00th=[   42], 40.00th=[   43], 50.00th=[   44], 60.00th=[   48],
     | 70.00th=[   48], 80.00th=[   52], 90.00th=[   53], 95.00th=[   65],
     | 99.00th=[  132], 99.50th=[  159], 99.90th=[  176], 99.95th=[  201],
     | 99.99th=[  443]
   bw (  KiB/s): min=116736, max=203158, per=100.00%, avg=171528.27, stdev=19546.75, samples=119
   iops        : min=  114, max=  198, avg=167.42, stdev=19.08, samples=119
  lat (msec)   : 50=74.46%, 100=23.77%, 250=1.73%, 500=0.04%
  cpu          : usr=0.08%, sys=0.64%, ctx=10058, majf=1, minf=2059
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=99.9%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.1%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=10053,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=8
SEQ1M_Q8T1_WRITE: (groupid=1, jobs=1): err= 0: pid=5283: Mon Sep 11 21:07:54 2023
  write: IOPS=168, BW=168MiB/s (177MB/s)(9.87GiB/60045msec); 0 zone resets
    slat (usec): min=17, max=51457, avg=90.18, stdev=1386.56
    clat (msec): min=3, max=259, avg=47.43, stdev=19.55
     lat (msec): min=4, max=262, avg=47.52, stdev=19.75
    clat percentiles (msec):
     |  1.00th=[   24],  5.00th=[   38], 10.00th=[   41], 20.00th=[   41],
     | 30.00th=[   41], 40.00th=[   42], 50.00th=[   44], 60.00th=[   44],
     | 70.00th=[   47], 80.00th=[   51], 90.00th=[   53], 95.00th=[   73],
     | 99.00th=[  146], 99.50th=[  167], 99.90th=[  201], 99.95th=[  230],
     | 99.99th=[  257]
   bw (  KiB/s): min=106496, max=210944, per=100.00%, avg=172375.50, stdev=24675.47, samples=120
   iops        : min=  104, max=  206, avg=168.25, stdev=24.09, samples=120
  lat (msec)   : 4=0.01%, 10=0.54%, 20=0.31%, 50=77.78%, 100=17.96%
  lat (msec)   : 250=3.38%, 500=0.02%
  cpu          : usr=0.47%, sys=0.45%, ctx=10060, majf=0, minf=12
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=99.9%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.1%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,10107,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=8

...snip...

Run status group 0 (all jobs):
   READ: bw=167MiB/s (176MB/s), 167MiB/s-167MiB/s (176MB/s-176MB/s), io=9.82GiB (10.5GB), run=60043-60043msec

Run status group 1 (all jobs):
  WRITE: bw=168MiB/s (177MB/s), 168MiB/s-168MiB/s (177MB/s-177MB/s), io=9.87GiB (10.6GB), run=60045-60045msec

...snip...

Disk stats (read/write):
  sdb: ios=46719/57277, merge=0/147, ticks=2523560/2610975, in_queue=5162991, util=99.13%

fio には結果の出力形式として json や terse (';' でセパレートされた CSV のようなもの) が選択できます。アクセス速度のみを表示するワンライナーは以下の通りです(上記リンク元を参考にしました)。

$ fio --directory=/media/hiro/SG/ fio_setting.txt --output-format=terse | awk -F ';' '{print $3, ($7+$48) / 1000 }'
SEQ1M_Q8T1_READ 174.268
SEQ1M_Q8T1_WRITE 173.461
SEQ1M_Q1T1_READ 167.157
SEQ1M_Q1T1_WRITE 180.976
RND4K_Q32T1_READ 1.449
RND4K_Q32T1_WRITE 1.292
RND4K_Q1T1_READ 0.525
RND4K_Q1T1_WRITE 1.387

fio のアクセス速度の結果は、絶対値は異なりますが、傾向は概ね Windows 版の CrystalDiskMark の結果と似ていると思います。

Ext4 ファイルシステムの準備

初めに注意事項です。

これ以降の操作は、Linux の root 権限が必要なコマンドが多く存在しています。また、パーティションの変更やファイルシステムの作成等、ディスクの全てのデータを消去する操作が含まれています。デバイス名の入力ミス等により重要なデータが消去されてしまう可能性もありますので、デバイス名と機器の対応を十分に確認した上で作業して下さい。データの消失等が発生した場合に備えて、重要なデータのバックアップを行って置く事を推奨します。

この記事に記載されている操作によって発生した損害等の一切の責任を負いかねますのでご了承下さい。

GUI で操作するなら gnome-disks

GNOME のアプリケーションで「ディスク (gnome-disks)」がありますので、パーティションの作成とExt4 形式のファイルシステムのフォーマット、マウントは GUI でも操作可能です。

私は CUI での操作を好みますので gnome-disks の使い方は省略します (CUI で操作できる方であれば GUI の gnome-disks は感覚で操作方法は分かると思います)。以下の説明では CUI で実行する手順を示します。

ディスクの認識状況の確認

Linux に接続されているディスクは、NVMe M.2 SSD を除き、SCSI 機器として認識されています。/proc/scsi/scsi から認識されている機器の一覧が取得できます。

$ cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: SanDisk  Model: SDSSDH31000G     Rev: X611
  Type:   Direct-Access                    ANSI  SCSI revision: 00
Host: scsi0 Channel: 00 Id: 00 Lun: 01
  Vendor: Msft     Model: Virtual DVD-ROM  Rev: 1.0
  Type:   CD-ROM                           ANSI  SCSI revision: 00
Host: scsi0 Channel: 00 Id: 00 Lun: 02
  Vendor:          Model: ST4000VN008-2DR1 Rev: SC60
  Type:   Direct-Access                    ANSI  SCSI revision: 00
Host: scsi0 Channel: 00 Id: 00 Lun: 03
  Vendor: WDC      Model: WD40EFRX-68N32N0 Rev: 82.0
  Type:   Direct-Access                    ANSI  SCSI revision: 00
Host: scsi0 Channel: 00 Id: 00 Lun: 04
  Vendor: WDC      Model: WD40EFRX-68N32N0 Rev: 82.0
  Type:   Direct-Access                    ANSI  SCSI revision: 00

Lun : 00 が起動用の SSD、Lun : 02 ~ 04 に 3基の HDD が接続されています。

ブロックデバイスの接続状況を lsblk で調べます。

$ lsblk | grep sd
sda      8:0    0 931.5G  0 disk
├─sda1   8:1    0   476M  0 part /boot/efi
└─sda2   8:2    0   931G  0 part /var/snap/firefox/common/host-hunspell
sdb      8:16   0   3.6T  0 disk
└─sdb1   8:17   0   3.6T  0 part
sdc      8:32   0   3.6T  0 disk
└─sdc1   8:33   0   3.6T  0 part
sdd      8:48   0   3.6T  0 disk
└─sdd1   8:49   0   3.6T  0 part

/dev/sda が起動ドライブの SSD、/dev/sdb・/dev/sdc・/dev/sdd がテスト用の HDD になります。3基の HDD がどのデバイス名に割り当てられたのか調べるには、linux kernel の起動時のログを確認します。

$ sudo dmesg -t | grep '^scsi 0:0:0:'
scsi 0:0:0:0: Direct-Access     SanDisk  SDSSDH31000G     X611 PQ: 0 ANSI: 0
scsi 0:0:0:1: CD-ROM            Msft     Virtual DVD-ROM  1.0  PQ: 0 ANSI: 0
scsi 0:0:0:2: Direct-Access              ST4000VN008-2DR1 SC60 PQ: 0 ANSI: 0
scsi 0:0:0:3: Direct-Access     WDC      WD40EFRX-68N32N0 82.0 PQ: 0 ANSI: 0
scsi 0:0:0:4: Direct-Access     WDC      WD40EFRX-68N32N0 82.0 PQ: 0 ANSI: 0
scsi 0:0:0:4: Attached scsi generic sg4 type 0
$ sudo dmesg -t | grep '^sd 0:0:0:2'
sd 0:0:0:2: Attached scsi generic sg2 type 0
sd 0:0:0:2: [sdb] Very big device. Trying to use READ CAPACITY(16).
sd 0:0:0:2: [sdb] 7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB)
sd 0:0:0:2: [sdb] 4096-byte physical blocks
sd 0:0:0:2: [sdb] Write Protect is off
sd 0:0:0:2: [sdb] Mode Sense: 0f 00 00 00
sd 0:0:0:2: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
sd 0:0:0:2: [sdb] Very big device. Trying to use READ CAPACITY(16).
sd 0:0:0:2: [sdb] Attached SCSI disk
$ sudo dmesg -t | grep '^sd 0:0:0:3'
sd 0:0:0:3: Attached scsi generic sg3 type 0
sd 0:0:0:3: [sdc] Very big device. Trying to use READ CAPACITY(16).
sd 0:0:0:3: [sdc] 7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB)
sd 0:0:0:3: [sdc] 4096-byte physical blocks
sd 0:0:0:3: [sdc] Write Protect is off
sd 0:0:0:3: [sdc] Mode Sense: 0f 00 00 00
sd 0:0:0:3: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
sd 0:0:0:3: [sdc] Very big device. Trying to use READ CAPACITY(16).
sd 0:0:0:3: [sdc] Attached SCSI disk
$ sudo dmesg -t | grep '^sd 0:0:0:4'
sd 0:0:0:4: [sdd] Very big device. Trying to use READ CAPACITY(16).
sd 0:0:0:4: [sdd] 7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB)
sd 0:0:0:4: [sdd] 4096-byte physical blocks
sd 0:0:0:4: [sdd] Write Protect is off
sd 0:0:0:4: [sdd] Mode Sense: 0f 00 00 00
sd 0:0:0:4: [sdd] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
sd 0:0:0:4: [sdd] Very big device. Trying to use READ CAPACITY(16).
sd 0:0:0:4: [sdd] Attached SCSI disk

/dev/sdb が SG、/dev/sdc と /dev/sdd が WD1 と WD2 に対応する事が分かりました。

Hyper-V 仮想マシンに Path through 接続した場合と、ベアメタルで起動した場合に、デバイス名が変わる事があります。私の環境では、Hyper-V では /dev/sd[bcd]、ベアメタルでは /dev/sd[abc] となりました。デバイス名を間違えないように注意下さい。

パーティションの作成

UEFI 環境では、後方互換性を考慮する必要が無ければ GPT 形式でパーティションを作成した方が良いと思います。MBR 方式の場合に使用するコマンドは fdisk ですが、GPT 形式の場合は gdisk になります。

$ dpkg -l gdisk
...snip...
||/ Name           Version       Architecture Description
+++-==============-=============-============-=====================================
ii  gdisk          1.0.8-4build1 amd64        GPT fdisk text-mode partitioning tool

今回は、全領域を一つのパーティションとして確保します。

問い合わせに答える形で進んでいきますので、入力箇所を赤字で示します。(ENTER) はデフォルトのままで変更なしの為、Enter キーを押す箇所です。

$ sudo gdisk /dev/sdc
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): n
Partition number (1-128, default 1): (ENTER)
First sector (34-7814037134, default = 2048) or {+-}size{KMGTP}: (ENTER)
Last sector (2048-7814037134, default = 7814037134) or {+-}size{KMGTP}: (ENTER)
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): (ENTER)
Changed type of partition to 'Linux filesystem'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

上記は /dev/sdc をターゲットとして実行していますが、/dev/sdb、/dev/sdd についても同様にパーティションを作成します。

MBR で使用していたものを転用する場合や、既にパーティションが存在しているものを全消去したい場合には、全てのパーティションを消去する 'o (オー)' Command を入力します。

' o ' command

Clear out all partition data. This includes GPT header data, all partition definitions, and the protective MBR. The sector alignment is reset to the default (1 MiB, or 2048 sectors on a disk with 512-byte sectors).

man gdisk

Ext4 形式でフォーマット

gdisk で作成したパーティションを Ext4 形式でフォーマットします。

$ sudo mkfs.ext4 /dev/sdc1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 976754385 4k blocks and 244195328 inodes
Filesystem UUID: 149b6e67-a632-47ac-9463-23d759818d76
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks):
done
Writing superblocks and filesystem accounting information: done

mkfs.ext4 (mke2fs) には様々なオプションがありますが、今回はオプションなしでフォーマットします。

マウント方法と chown

マウントポイントを作成して、フォーマットした Ext4 ファイルシステムをマウントします。

/media/username/ 以下にマウントポイントを作成します。

また、一般ユーザーで書き込みが出来るように owner と group を変更します。

$ sudo mkdir /media/hiro/SG
$ sudo mkdir /media/hiro/WD1
$ sudo mkdir /media/hiro/WD2
$ sudo mount /dev/sdb1 /media/hiro/SG
$ sudo mount /dev/sdc1 /media/hiro/WD1
$ sudo mount /dev/sdd1 /media/hiro/WD2
$ sudo chown -R hiro:hiro /media/hiro/SG
$ sudo chown -R hiro:hiro /media/hiro/WD1
$ sudo chown -R hiro:hiro /media/hiro/WD2

これで、3基の HDD を一般ユーザーで操作できるようになりました。準備が出来ましたので、それぞれの方法でディスクのアクセス速度を測定します。

Ext4 ファイルシステムの測定結果

SG、WD1、WD2 の3基の HDD を Ext4 ファイルシステムにフォーマットし、各ベンチマークを実行しました。その結果を記載します。

hdparm

hdparm (n=10)SGWD1WD2
Read [MB/sec]177.4177.6179.5
R [MB/sec]8.04.75.8
hdparm -t の結果

CrystalDiskMark SEQ1M Q8T1 Read の 93 ~ 97% の読み込み速度でした。R も小さくばらつきは少ない結果でした。

dd

dd (n=10)SGWD1WD2
Read [MB/sec]185.6182.6185.1
Write [MB/sec]155.0153.9156.0
R_Read [MB/sec]6.94.84.8
R_Write [MB/sec]8.322.122.1
dd の結果

Read は CrystalDiskMark SEQ1M Q8T1 の 95 ~ 101%、Write は 84 ~ 86% の速度でした。Read の R は小さいですが、WD1 と WD2 の Write の R は 14% 程度と大きめでした。SG の Write の R は小さいので、メーカーによる差かもしれません。

Gnome Disks

Gnome Disks (n=10)SGWD1WD2
Read [MB/sec]117.1148.9150.3
Write [MB/sec]119.6124.3123.9
Access time [msec]16.1016.6216.62
R_Read [MB/sec]3.52.01.0
R_Write [MB/sec]2.71.61.6
R_Access time [msec]0.40.30.3
Gnome Disks の結果

アクセス速度の平均値は、Read は CrystalDiskMark SEQ1M Q8T1 の 64 ~ 78%、Write は 65 ~ 69% でした。R は Read、Write、Access time 共に小さく、ばらつきは少ない結果でした。

dd で見られた書き込み速度のばらつきは、Gnome Disks では見られませんでした。

Gnome Disks はトレンドも表示されます。10回測定した中で最後の測定時のトレンドを以下に示します。ベンチマーク開始直後は 180 ~ 190 MB/sec で CrystalDiskMark SEQ1M Q8T1 と同等でした。

Gnome Disks SG 結果
Gnome Disks WD1 結果
Gnome Disks WD2 結果

diskspd for linux

diskspd for linux は、作成するファイルサイズ (-c オプション) の大きさ、及び事前にファイルを作成するかどうかで、結果が大きく変わります。下表の結果は、1GB のファイルで1回目の測定時にファイルを作成した場合です。

diskspd for linux (n=1)SGWD1WD2
SEQ1M Q8T1 Read [MB/sec]143.00311.20378.60
SEQ1M Q1T1 Read [MB/sec]181.20153.60172.20
RND4K Q32T1 Read [MB/sec]1.191.942.21
RND4K Q1T1 Read [MB/sec]0.460.440.51
SEQ1M Q8T1 Write [MB/sec]118.80141.40155.20
SEQ1M Q1T1 Write [MB/sec]160.40153.20172.60
RND4K Q32T1 Write [MB/sec]1.221.952.14
RND4K Q1T1 Write [MB/sec]1.301.922.32
diskspd for linux の結果
  • SEQ1M Q8T1 Read の数値は SG が低く、WD1 と WD2 が高い (というか高すぎる)。
  • SEQ1M Q8T1 Write の数値は SG が特に低く、WD1 と WD2 も低め。
  • WD1 と WD2 は同一機種ですが、WD1 が低め、WD2 が高めの結果となった。

等、測定結果のばらつきが大きく、現在の測定条件は信頼性に劣ると感じています。他のパラメータを変更して、試行回数を増やして試してみようと考えています。

fio

fio もファイルサイズを 1GB で実行しました。

fio (n=1)SGWD1WD2
SEQ1M Q8T1 Read [MB/sec]181.82162.62180.63
SEQ1M Q1T1 Read [MB/sec]176.56158.04177.85
RND4K Q32T1 Read [MB/sec]1.591.972.22
RND4K Q1T1 Read [MB/sec]0.530.480.48
SEQ1M Q8T1 Write [MB/sec]174.18164.41172.89
SEQ1M Q1T1 Write [MB/sec]179.80164.74178.82
RND4K Q32T1 Write [MB/sec]1.442.022.03
RND4K Q1T1 Write [MB/sec]1.441.851.92
fio の結果
  • SG と WD2 の結果は CrystalDiskMark の結果と大きく変わらない数値でした。
  • WD1 のみ Sequential Read / Write の結果が低めでした。

diskspd for linux と同様に fio も WD1 の結果が低めでした。原因はよく分かりません。試行回数を増やして確認してみます。

Hyper-V Path through ディスクで使用した場合の結果

Hyper-V Path through で接続したディスクは Windows を間に挟むので、ベアメタルで接続した場合と比べてアクセス速度が遅くなりそうです。そこで、ベアメタルと Hyper-V 仮想マシンで同じ条件でアクセス速度を測定してみました。fio の結果です。

fio (n=1)SG BareMetalSG Hyper-V
SEQ1M Q8T1 Read [MB/sec]181.82174.21
SEQ1M Q1T1 Read [MB/sec]176.56176.97
RND4K Q32T1 Read [MB/sec]1.591.55
RND4K Q1T1 Read [MB/sec]0.530.57
SEQ1M Q8T1 Write [MB/sec]174.18174.18
SEQ1M Q1T1 Write [MB/sec]179.80173.09
RND4K Q32T1 Write [MB/sec]1.441.39
RND4K Q1T1 Write [MB/sec]1.441.46
fio の結果 ベアメタル vs. Hyper-V

fio 以外にも全てのベンチマークを測定しましたが、Hyper-V Path through ディスクのアクセス速度はベアメタルと殆ど変わらない結果でした。Windows が介在する事による速度低下は考慮しなくても良さそうです。

まとめ

この記事では、

  • ディスクのアクセス速度を測定する5種類の方法
    • hdparm
    • dd
    • Gnome Disks
    • diskspd for linux
    • fio
  • ディスクのパーティションの作成方法と Ext4 ファイルシステムのフォーマット方法
  • Ext4 ファイルシステムのアクセス速度の実測結果 (2種類3基の 4TB HDD)

について記載しました。

今回の結果より、以下の事が分かりました。

  • hdparm と dd は、手軽に測定できる利点はありますが、Sequential Read / Write のアクセス速度しか測定する事が出来ません。実際のディスクへのアクセスはランダムアクセスが多くを占めると思いますので、目安にはなりますが実際の使用状況の感覚とは合わないかもしれません。
  • Gnome Disks は、ディスクの Read / Write の平均アクセス速度を測定する事が出来ます。ディスクの読み書きの高速な箇所と低速な箇所の平均値を算出しているようですので、hdparm や dd よりも実際の使用状況の感覚に近いと思います。とはいえ、ランダムアクセスではなさそうですので、小さなファイルの読み書きの結果は含まれないと思います。また、書き込みのベンチマークでは一旦 umount する必要がありますので、root (/) に使用しているディスクは測定できません。
  • diskspd for linux と fio は、Windows の CrystalDiskMark と同様の条件でディスクのアクセス速度を測定できます。ただし、今回は試行回数が1回のデータであり、同一機種の間のシーケンシャルアクセス速度の差が大きい結果でした。測定条件や試行回数を増やして、再現性のある測定方法を模索する必要があります。

Sequential / Random access のアクセス速度を測定する場合には、diskspd for linux と fio のどちらかを選択する必要があります。次回は、この二つの方法で再現性のある測定方法・条件を調べたいと考えています。

今回のアイキャッチ画像

秋といえば月見、SDXL で満月を生成しました。img2img で変換するとぼやけた感じになるので、手動でトリミングしています。

コメント

  1. […]  今回、ラズパイ5用OSに標準で搭載されているFlexible I/O Tester (fio)を使用して簡易性能評価を実施しました。評価に使用したアクセスパターンはCrystalDiskMarkのアクセスを模したもので、こちらのWebページを参考に作成しました。 […]

タイトルとURLをコピーしました