ストレージシステムの性能測定ツール”fio”を使ってみる

Linux

ブログ運営者
さいとう

閲覧いただきありがとうございます!"さいとう"と申します。わたしは異業種・未経験からIT業界に転職し、現在インフラエンジニアとしてクラウド環境の設計や構築・運用の支援を行っています。

Linuxシステムの性能を測定することは、システム管理者、開発者、そして運用チームにとって非常に重要です。わたしは現在、運用プロジェクトに参加していて、Linuxを利用したサーバ群の性能をモニタリングしています。


性能情報の取得は主に、問題の予防と迅速な対応のために測定していますが、設計段階では容量計画や性能ベースラインの確立に役立つはずです。「[試して理解]Linuxのしくみ ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】」を読んでいて、ストレージシステムの性能を測定するためのツール"fio"を知りました。



今回の記事は、"fio"について調べたことのまとめと、簡単なハンズオンを実施した内容です。

fioについて調べてみた

■fioとは

fio(Flexible I/O Tester)は、ストレージシステムの性能を測定するための強力なツールで、特にディスクI/Oの性能評価に使用されます。Linuxをはじめとする多くのプラットフォーム( Linux、Solaris、AIX、HP-UX、OSX、NetBSD、OpenBSD、Windows、FreeBSD、および DragonFly )で利用可能です。Fioはもともと、パフォーマンス上の理由またはバグの発見/再現のために特定のワークロードをテストしたいときに、特別なテストケースプログラムを作成する手間を省くために作成されたようですね。fioは、特定のI/Oワークロードをシミュレートでき、ユーザーが指定した特定の種類のI/Oアクションを実行する多数のスレッドまたはプロセスを生成します。

fioの主な特徴は以下の通りです

特徴1.多様なI/Oパターン

ランダム読み書きやシーケンシャル読み書きといったさまざまなI/Oパターンでテストを行うことができます。

特徴2.フレキシブルなワークロード

単一のプロセスから多数のスレッド、さらには複数のジョブを同時に実行することが可能です。それぞれのジョブで異なる設定を用いることができます。

特徴3.詳細なメトリクス

IOPS(1秒間に処理できる入出力操作の回数)、スループット(単位時間当たりのデータ量)、レイテンシ(応答時間)、CPU使用率といった詳細なメトリクスを提供します。

特徴4.スクリプトによるカスタマイズ

ユーザーはテストのパラメータを詳細に設定できるスクリプトを作成することができます。これにより、特定のストレージ設定に最適化したテストを行うことが可能です。

特徴5.実用的な出力形式

標準的なテキスト出力のほか、JSON形式での出力が可能で、プログラムからの読み取りや分析が容易です。

■fioのユースケース

fioはその汎用性と詳細なデータ提供能力により、ITインフラの重要な判断材料を提供するためのツールとして位置付けられています。主に以下のようなユースケースで活用されます。

ユースケース1.性能ベンチマークとベースライン設定

新しいストレージシステムの導入前に、期待される性能を定義し、様々な条件下での性能を測定します。既存のシステムにおいて、アップグレードや変更前の性能ベースラインを確立します。

ユースケース2.設計段階の検証(キャパシティプランニング)

ストレージの設計段階で、異なる構成や技術がシステム性能に与える影響を評価します。異なるハードウェアやソフトウェアの組み合わせをテストして、最適な構成を見つけ出します。

ユースケース3.トラブルシューティング

性能の低下や不具合が発生した際に、問題の原因を特定するために使用します。システムの異なる部分に負荷をかけることで、ボトルネックを特定します。

ユースケース4.性能チューニング

ストレージシステムの設定を調整し、特定のワークロードに最適化するために利用します。システムの変更が性能にどのような影響を与えるかを試験し、改善策を見つけ出します。

ユースケース5.リサーチと開発

新技術や新製品の開発過程で、性能の評価や比較を行います。

Linuxの勉強を始めたい方におすすめです


■fioを使ってみる

AWSクラウド環境を利用して、Amazon Linux 2023でfioを試すための簡単なハンズオンガイドを用意しました。fioをインストールし、基本的なI/O性能テストを行う手順をご紹介します。

ステップ1: fioのインストール

Amazon Linux 2023インスタンスにログインします。次のコマンドを実行してfioをインストールします。

sudo dnf install fio -y


【実行結果】

Last metadata expiration check: 0:08:40 ago on Sat May 18 07:05:35 2024.
Dependencies resolved.
=====================================================================================================================================
 Package                            Architecture            Version                               Repository                    Size
=====================================================================================================================================
Installing:
 fio                                x86_64                  3.32-2.amzn2023.0.3                   amazonlinux                  5.2 M
Installing dependencies:
 librdmacm                          x86_64                  48.0-1.amzn2023.0.1                   amazonlinux                   73 k
Installing weak dependencies:
 fio-engine-http                    x86_64                  3.32-2.amzn2023.0.3                   amazonlinux                   20 k
 fio-engine-libaio                  x86_64                  3.32-2.amzn2023.0.3                   amazonlinux                   17 k
 fio-engine-rdma                    x86_64                  3.32-2.amzn2023.0.3                   amazonlinux                   23 k

Transaction Summary
=====================================================================================================================================
Install  5 Packages

Total download size: 5.3 M
Installed size: 7.6 M
Downloading Packages:
(1/5): fio-engine-http-3.32-2.amzn2023.0.3.x86_64.rpm                                                310 kB/s |  20 kB     00:00    
(2/5): fio-engine-libaio-3.32-2.amzn2023.0.3.x86_64.rpm                                              213 kB/s |  17 kB     00:00    
(3/5): fio-engine-rdma-3.32-2.amzn2023.0.3.x86_64.rpm                                                574 kB/s |  23 kB     00:00    
(4/5): fio-3.32-2.amzn2023.0.3.x86_64.rpm                                                             29 MB/s | 5.2 MB     00:00    
(5/5): librdmacm-48.0-1.amzn2023.0.1.x86_64.rpm                                                      720 kB/s |  73 kB     00:00    
-------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                 23 MB/s | 5.3 MB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                             1/1 
  Installing       : librdmacm-48.0-1.amzn2023.0.1.x86_64                                                                        1/5 
  Installing       : fio-engine-http-3.32-2.amzn2023.0.3.x86_64                                                                  2/5 
  Installing       : fio-engine-libaio-3.32-2.amzn2023.0.3.x86_64                                                                3/5 
  Installing       : fio-engine-rdma-3.32-2.amzn2023.0.3.x86_64                                                                  4/5 
  Installing       : fio-3.32-2.amzn2023.0.3.x86_64                                                                              5/5 
  Running scriptlet: fio-3.32-2.amzn2023.0.3.x86_64                                                                              5/5 
  Verifying        : fio-3.32-2.amzn2023.0.3.x86_64                                                                              1/5 
  Verifying        : fio-engine-http-3.32-2.amzn2023.0.3.x86_64                                                                  2/5 
  Verifying        : fio-engine-libaio-3.32-2.amzn2023.0.3.x86_64                                                                3/5 
  Verifying        : fio-engine-rdma-3.32-2.amzn2023.0.3.x86_64                                                                  4/5 
  Verifying        : librdmacm-48.0-1.amzn2023.0.1.x86_64                                                                        5/5 

Installed:
  fio-3.32-2.amzn2023.0.3.x86_64             fio-engine-http-3.32-2.amzn2023.0.3.x86_64 fio-engine-libaio-3.32-2.amzn2023.0.3.x86_64 
  fio-engine-rdma-3.32-2.amzn2023.0.3.x86_64 librdmacm-48.0-1.amzn2023.0.1.x86_64

Complete!


ステップ2: fioを使用した基本的なテストの実行

fioを使用してランダム書き込みパフォーマンスをテストする基本的なコマンドです。以下のコマンドを実行してください。

fio --name=random-write-test --ioengine=libaio --rw=randwrite --bs=4k --size=1G --numjobs=4 --time_based --runtime=30s --group_reporting


このコマンドは以下のパラメータを使用しています。

  • name=random-write-test: テストの名前
  • ioengine=libaio: I/Oエンジンとしてlibaioを使用
  • rw=randwrite: ランダム書き込み
  • bs=4k: ブロックサイズ4キロバイト
  • size=1G: 各ジョブが処理するデータの総量は1ギガバイト
  • numjobs=4: 4つの並列ジョブを実行
  • time_based: 指定時間が経過するまでテストを続ける
  • runtime=30s: テストの実行時間は30秒
  • group_reporting: グループの統計情報を表示


【実行結果】

[ec2-user@ip-10-0-1-48 ~]$ fio --name=random-write-test --ioengine=libaio --rw=randwrite --bs=4k --size=1G --numjobs=4 --time_based --runtime=30s --group_reporting
random-write-test: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
fio-3.32
Starting 4 processes
random-write-test: Laying out IO file (1 file / 1024MiB)
random-write-test: Laying out IO file (1 file / 1024MiB)
random-write-test: Laying out IO file (1 file / 1024MiB)
random-write-test: Laying out IO file (1 file / 1024MiB)
Jobs: 4 (f=4): [w(4)][100.0%][w=119MiB/s][w=30.3k IOPS][eta 00m:00s]
random-write-test: (groupid=0, jobs=4): err= 0: pid=25504: Sat May 18 07:15:53 2024
  write: IOPS=31.9k, BW=125MiB/s (131MB/s)(3739MiB/30023msec); 0 zone resets
    slat (usec): min=2, max=69401, avg=122.94, stdev=2015.36
    clat (nsec): min=657, max=20030k, avg=1514.41, stdev=67239.92
     lat (usec): min=2, max=69405, avg=124.45, stdev=2016.60
    clat percentiles (nsec):
     |  1.00th=[   676],  5.00th=[   684], 10.00th=[   684], 20.00th=[   844],
     | 30.00th=[   900], 40.00th=[   932], 50.00th=[  1048], 60.00th=[  1080],
     | 70.00th=[  1112], 80.00th=[  1144], 90.00th=[  1176], 95.00th=[  1320],
     | 99.00th=[  1528], 99.50th=[  3024], 99.90th=[ 30336], 99.95th=[ 38144],
     | 99.99th=[374784]
   bw (  KiB/s): min=28312, max=1341000, per=100.00%, avg=127745.21, stdev=55515.10, samples=238
   iops        : min= 7078, max=335250, avg=31936.30, stdev=13878.77, samples=238
  lat (nsec)   : 750=18.71%, 1000=27.24%
  lat (usec)   : 2=53.35%, 4=0.35%, 10=0.11%, 20=0.05%, 50=0.16%
  lat (usec)   : 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 10=0.01%, 20=0.01%, 50=0.01%
  cpu          : usr=1.66%, sys=3.13%, ctx=16424, majf=0, minf=40
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 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.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,957301,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=125MiB/s (131MB/s), 125MiB/s-125MiB/s (131MB/s-131MB/s), io=3739MiB (3921MB), run=30023-30023msec

Disk stats (read/write):
  nvme0n1: ios=0/200734, merge=0/4, ticks=0/173026, in_queue=173026, util=97.80%


ステップ3: 結果の確認

テストが完了すると、IOPS(Input/Output Operations Per Second)、スループット、平均レイテンシなどの指標が表示されます。これらの指標を通じて、システムのディスク性能を評価することができます。

このFioの出力結果は、ランダム書き込み性能テストの結果を示しており、いくつかの重要な性能指標を解釈することができます。ここでの主な結果は以下の通りです。(以下の解説はChatGPT4を利用)

  • IOPS (Input/Output Operations Per Second)
    31.9k IOPS と報告されています。これは1秒間にディスクが完了できる入出力操作の数を表し、ディスクの応答性と処理能力を示します。
  • 帯域幅 (Bandwidth)
    125MiB/s (131MB/s) と報告されています。これは1秒間にディスクが読み書きできるデータの量を示しており、データ転送の速度を測定します。
  • レイテンシ (Latency)
    平均レイテンシが avg=124.45μs で、これはI/Oリクエストが完了するまでの平均時間です。
    最小レイテンシが min=2μs、最大レイテンシが max=69405μs と非常に変動があります。
  • レイテンシのパーセンタイル
    これは特定のパーセンタイルでのレイテンシを示しており、例えば 99thパーセンタイルは 1528ns です。これは全I/O操作の中で最も遅い1%がこの時間内に完了することを意味します。
  • CPU使用率
    usr=1.66%, sys=3.13% と報告されています。これはテスト中にCPUがどれだけ使用されたかを示し、システムリソースの使用効率を評価するのに役立ちます。
  • ディスク利用率
    util=97.80% と非常に高い利用率を示しており、テスト中のディスクがほぼフルキャパシティで動作していたことを示します。


この結果からディスクのランダム書き込み性能について読み取ることができるのですが、わたしにはまだ知見がないので読み取ることができません。ChatGPTに確認すると、ディスクのランダム書き込み性能が高いようです。さまざまなOSで実行し、実行結果を読み取れるようになりたいですね。

オプション

fioはカスタマイズが可能なツールです。異なる読み取り/書き込みパターン、ブロックサイズ、ランタイム等を調整して、さまざまなシナリオのテストを行うことができます。使用可能なオプションを確認するには、ターミナルで以下のコマンドを実行してください。

man fio


■Fioのコマンドオプションの例

1.EC2インスタンスの性能評価

ランダムI/Oテスト

fio --name=random-io --ioengine=libaio --rw=randrw --rwmixread=70 --bs=4k --size=500M --numjobs=4 --runtime=60s --group_reporting


rw=randrw: ランダム読み書きを行います。
rwmixread=70: 読み取りと書き込みの割合を70:30に設定します。


【実行結果】

[ec2-user@ip-10-0-1-48 ~]$ fio --name=random-io --ioengine=libaio --rw=randrw --rwmixread=70 --bs=4k --size=500M --numjobs=4 --runtime=60s --group_reporting
random-io: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
fio-3.32
Starting 4 processes
random-io: Laying out IO file (1 file / 500MiB)
random-io: Laying out IO file (1 file / 500MiB)
random-io: Laying out IO file (1 file / 500MiB)
random-io: Laying out IO file (1 file / 500MiB)
Jobs: 4 (f=4): [m(4)][100.0%][r=5272KiB/s,w=2300KiB/s][r=1318,w=575 IOPS][eta 00m:00s]
random-io: (groupid=0, jobs=4): err= 0: pid=25852: Sat May 18 07:27:08 2024
  read: IOPS=2614, BW=10.2MiB/s (10.7MB/s)(613MiB/60003msec)
    slat (usec): min=186, max=10267, avg=1525.05, stdev=704.08
    clat (nsec): min=976, max=31879, avg=1402.17, stdev=444.64
     lat (usec): min=187, max=10268, avg=1526.45, stdev=704.10
    clat percentiles (nsec):
     |  1.00th=[ 1096],  5.00th=[ 1144], 10.00th=[ 1176], 20.00th=[ 1224],
     | 30.00th=[ 1272], 40.00th=[ 1336], 50.00th=[ 1384], 60.00th=[ 1416],
     | 70.00th=[ 1464], 80.00th=[ 1512], 90.00th=[ 1608], 95.00th=[ 1720],
     | 99.00th=[ 1960], 99.50th=[ 2128], 99.90th=[ 9024], 99.95th=[ 9792],
     | 99.99th=[21120]
   bw (  KiB/s): min= 4600, max=30240, per=100.00%, avg=10503.73, stdev=889.89, samples=476
   iops        : min= 1150, max= 7560, avg=2625.93, stdev=222.47, samples=476
  write: IOPS=1127, BW=4508KiB/s (4616kB/s)(264MiB/60003msec); 0 zone resets
    slat (nsec): min=2257, max=94522, avg=4604.46, stdev=1908.10
    clat (nsec): min=687, max=30665, avg=821.90, stdev=385.97
     lat (nsec): min=3016, max=96021, avg=5426.36, stdev=2002.07
    clat percentiles (nsec):
     |  1.00th=[  708],  5.00th=[  716], 10.00th=[  716], 20.00th=[  732],
     | 30.00th=[  748], 40.00th=[  764], 50.00th=[  772], 60.00th=[  788],
     | 70.00th=[  804], 80.00th=[  836], 90.00th=[  980], 95.00th=[ 1064],
     | 99.00th=[ 1384], 99.50th=[ 1576], 99.90th=[ 8160], 99.95th=[ 9280],
     | 99.99th=[19584]
   bw (  KiB/s): min= 1456, max=13744, per=100.00%, avg=4526.92, stdev=410.07, samples=476
   iops        : min=  364, max= 3436, avg=1131.73, stdev=102.52, samples=476
  lat (nsec)   : 750=9.18%, 1000=18.44%
  lat (usec)   : 2=71.75%, 4=0.48%, 10=0.10%, 20=0.02%, 50=0.01%
  cpu          : usr=0.24%, sys=0.63%, ctx=156896, majf=0, minf=44
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 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.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=156861,67626,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
   READ: bw=10.2MiB/s (10.7MB/s), 10.2MiB/s-10.2MiB/s (10.7MB/s-10.7MB/s), io=613MiB (643MB), run=60003-60003msec
  WRITE: bw=4508KiB/s (4616kB/s), 4508KiB/s-4508KiB/s (4616kB/s-4616kB/s), io=264MiB (277MB), run=60003-60003msec

Disk stats (read/write):
  nvme0n1: ios=156847/26142, merge=0/4, ticks=237887/81546, in_queue=319432, util=99.90%
[ec2-user@ip-10-0-1-48 ~]$


【結果詳細】

■IOPS (Input/Output Operations Per Second)

  • 読み込み: 2614 IOPS
  • 書き込み: 1127 IOPS

これらの値はデバイスが1秒間にどれだけの読み書き操作を完了できるかを示しており、システムの反応性とデータ処理能力を反映します。

■帯域幅 (Bandwidth)

  • 読み込み: 10.2MiB/s (10.7MB/s)
  • 書き込み: 4508KiB/s (4616kB/s)

帯域幅はデバイスが1秒間にデータをどれだけ読み書きできるかを示し、データ転送速度を測定します。

■レイテンシ (Latency)

  • 読み込み: avg=1526.45μs
  • 書き込み: avg=5426.36ns

レイテンシはI/Oリクエストが完了するまでの時間であり、低いほど良いパフォーマンスを示します。

■CPU使用率

usr=0.24%, sys=0.63%

この低いCPU使用率は、テストがCPUリソースをほとんど消費していないことを示しています。

■ディスク利用率

util=99.90%

ディスクがほぼ最大容量で動作していたことを示します。これはディスクが高負荷状態であることを意味し、パフォーマンスのボトルネックが発生する可能性があります。

2. EBSパフォーマンスの最適化

シーケンシャル書き込みテスト

fio --name=sequential-write --ioengine=libaio --rw=write --bs=16k --size=1G --numjobs=2 --runtime=120s --group_reporting


rw=write: シーケンシャル書き込みを行います。
bs=16k: ブロックサイズを16キロバイトに設定します。


【実行結果】

[ec2-user@ip-10-0-1-48 ~]$ fio --name=sequential-write --ioengine=libaio --rw=write --bs=16k --size=1G --numjobs=2 --runtime=120s --group_reporting
sequential-write: (g=0): rw=write, bs=(R) 16.0KiB-16.0KiB, (W) 16.0KiB-16.0KiB, (T) 16.0KiB-16.0KiB, ioengine=libaio, iodepth=1
...
fio-3.32
Starting 2 processes
sequential-write: Laying out IO file (1 file / 1024MiB)
sequential-write: Laying out IO file (1 file / 1024MiB)
Jobs: 2 (f=2): [W(2)][-.-%][w=132MiB/s][w=8436 IOPS][eta 00m:00s]
sequential-write: (groupid=0, jobs=2): err= 0: pid=26008: Sat May 18 07:30:30 2024
  write: IOPS=27.7k, BW=432MiB/s (453MB/s)(2048MiB/4737msec); 0 zone resets
    slat (usec): min=5, max=38836, avg=67.10, stdev=1084.26
    clat (nsec): min=674, max=1015.4k, avg=990.70, stdev=3560.89
     lat (usec): min=6, max=38838, avg=68.09, stdev=1084.33
    clat percentiles (nsec):
     |  1.00th=[  684],  5.00th=[  692], 10.00th=[  700], 20.00th=[  700],
     | 30.00th=[  732], 40.00th=[  916], 50.00th=[  964], 60.00th=[ 1064],
     | 70.00th=[ 1112], 80.00th=[ 1144], 90.00th=[ 1208], 95.00th=[ 1272],
     | 99.00th=[ 1416], 99.50th=[ 1528], 99.90th=[ 2768], 99.95th=[ 8768],
     | 99.99th=[27520]
   bw (  KiB/s): min=131232, max=2515456, per=100.00%, avg=486080.44, stdev=387609.98, samples=17
   iops        : min= 8202, max=157216, avg=30380.03, stdev=24225.62, samples=17
  lat (nsec)   : 750=30.46%, 1000=21.73%
  lat (usec)   : 2=47.56%, 4=0.19%, 10=0.02%, 20=0.03%, 50=0.01%
  lat (usec)   : 750=0.01%
  lat (msec)   : 2=0.01%
  cpu          : usr=2.45%, sys=13.43%, ctx=889, majf=0, minf=28
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 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.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,131072,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=432MiB/s (453MB/s), 432MiB/s-432MiB/s (453MB/s-453MB/s), io=2048MiB (2147MB), run=4737-4737msec

Disk stats (read/write):
  nvme0n1: ios=0/2680, merge=0/0, ticks=0/25846, in_queue=25846, util=92.06%


【結果詳細】

■IOPS (Input/Output Operations Per Second、入出力操作の数/秒)

  • 27.7k IOPS

この値は、1秒間にストレージが処理できる入出力操作の数を表します。シーケンシャル書き込みにおいてこのように高いIOPSを示すことは、ストレージデバイスが多くの書き込み操作を効率的に扱える能力を持っていることを示しています。

■帯域幅 (BW)

  • 432MiB/s (453MB/s)

これは、ストレージに1秒間に書き込むことができるデータの量を示します。この高帯域幅は、ストレージデバイスが大量のデータ転送を迅速に処理できることを意味し、高スループットが求められるアプリケーションに適しています。

■レイテンシ (遅延)

  • avg=68.09μs(マイクロ秒)

これは書き込み操作が完了するまでの平均時間を示しており、シーケンシャル書き込みにおける良好なパフォーマンスを示しています。

■帯域幅の変動

  • 最小値 = 131232 KiB/s
  • 最大値 = 2515456 KiB/s

この広い範囲は、テスト中に帯域幅の変動があったことを示しており、システムの負荷、ストレージデバイスの内部動作、またはキャッシングメカニズムなど、複数の要因による可能性があります。

■CPU使用率:

  • usr=2.45%
  • sys=13.43%

ユーザー空間(usr)でのCPU使用率は低く、システム操作(sys)での使用率がやや高いです。これはI/Oリクエストの管理など、カーネルが介在する作業が多かったことを示しています。

■ディスク利用率

  • util=92.06%

この高い利用率は、ストレージデバイスがテスト中にほぼ最大能力で動作していたことを示しています。

3. ストレージ設計の検証

耐久性テスト

fio --name=endurance-test --ioengine=libaio --rw=randwrite --bs=1M --size=10G --numjobs=1 --time_based --runtime=24h --group_reporting


time_basedとruntime=24hを使用して24時間連続してテストを行います。

4. 耐久性と信頼性のテスト

長期間ランダムアクセステスト

fio --name=longterm-test --ioengine=libaio --rw=randrw --bs=512 --size=5G --numjobs=3 --time_based --runtime=12h --group_reporting

bs=512: 小さなブロックサイズでのランダムアクセスをテストします。

5. コストパフォーマンスの評価

コスト効率の良いテスト

fio --name=cost-effective-test --ioengine=libaio --rw=randread --bs=8k --size=2G --numjobs=4 --runtime=30m --group_reporting

rw=randread: ランダム読み取りを行い、特に読み込み性能を評価します。

■fioを使う際の注意点

fioを使う際には、いくつかの重要な注意点があります。これらを理解し、適切に対処することで、テストの信頼性を保ち、システムに不意の影響を与えないようにすることが重要です。

注意点1.データの上書き

fioはディスクに直接書き込みを行うため、特に実稼働環境での使用時には慎重にデータの上書きを避けるようにしてください。テストが実データを上書きしないように、テスト用のパーティションやドライブを用意することが望ましいです。

注意点2.システムリソースの消費

fioはシステムリソース(CPU、メモリ、I/O帯域)を大量に消費する可能性があるため、他のアプリケーションのパフォーマンスに影響を与えることがあります。リソース使用量を適切に調整するか、低負荷の時間帯にテストを実施することを推奨します。

注意点3.テストパラメータの選定

fioは非常に多くのパラメータを設定できますが、それぞれのパラメータがテスト結果にどのような影響を与えるかを理解することが重要です。テストの目的に応じて適切な読み書きパターン、ブロックサイズ、ランタイムなどを選択してください。

注意点4.テスト結果の解釈

fioから出力される結果には多くの情報が含まれていますが、これを正しく解釈し、適切な改善策に結びつけることが必要です。特にIOPS、スループット、レイテンシなどの指標を正しく理解し、それぞれのワークロードにどのような影響を与えるかを把握することが重要です。

注意点5.安定した状態でのテスト実施

テストの再現性を保証するために、システムが安定した状態でテストを行うことが重要です。バックグラウンドプロセスやその他のアプリケーションがテスト結果に影響を与えないように、必要に応じてそれらを停止しておくことをお勧めします。

まとめ

fioは非常に強力で柔軟なツールであるため、その全ての機能を完全に使いこなすには少し学習が必要そうです。しかし、紹介したコマンド例を見ていただくとわかるように、基本的なテストを行うことはそれほど難しくありません。最初はシンプルなコマンドから始めて、徐々にオプションを追加していく方法がお勧めです。


また、fioには広範囲にわたるドキュメントとコミュニティがあり、多くの例やチュートリアルが利用可能です。これらの情報を活用することで、より複雑なシナリオの設定や解析が用意になり、自身が参加しているプロジェクトに合ったテストを提供できるようになります。いろいろ試して、ものにしていきましょう!


次回もLinuxの性能を測定するためのツールを紹介していきます。※後日追記予定

参考リンク: 公式ドキュメントGitHubリポジトリ


Linuxの勉強を始めたい方におすすめです