サイトアイコン 協栄情報ブログ

ストレージシステムの性能測定ツール”fio”について調べてみた

saitou-fio-handsonアイキャッチ

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の主な特徴は以下の通りです。

 

 

 

 

 

 

 

■fioのユースケース

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

 

 

 

 

 

 

 

■fioを使ってみる

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

 

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

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

sudo dnf install fio -y

 

【実行結果】

[ec2-user@ip-10-0-1-48 ~]$ 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

 

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

 
【実行結果】

[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を利用)

 

 

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

 

●オプション

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

man fio

 

 

■fioを使う際の注意点

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

 

 

 

 

 

 

まとめ

fioは非常に強力で柔軟なツールであるため、その全ての機能を完全に使いこなすには少し学習が必要そうです。

 

しかし、紹介したコマンド例を見ていただくとわかるように、基本的なテストを行うことはそれほど難しくありません。

 

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

 

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

 

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

 

 

↓ほかの協栄情報メンバーのLinuxについての記事を公開しています。ぜひ参考にしてみてください。
 

 
【Linux】rsyncコマンドについて理解を深める(ito.d)

 
linuxでのプロセスの監視について(ito.d)

 
カーネルコマンドラインを使ってブート時にSELinuxを無効化する。(yamada.y)

 

モバイルバージョンを終了