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.リサーチと開発
新技術や新製品の開発過程で、性能の評価や比較を行います。
■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
このコマンドは以下のパラメータを使用しています。
- 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.9kIOPSと報告されています。これは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を使う際の注意点
fioを使う際には、いくつかの重要な注意点があります。これらを理解し、適切に対処することで、テストの信頼性を保ち、システムに不意の影響を与えないようにすることが重要です。
- 注意点1.データの上書き
fioはディスクに直接書き込みを行うため、特に実稼働環境での使用時には慎重にデータの上書きを避けるようにしてください。テストが実データを上書きしないように、テスト用のパーティションやドライブを用意することが望ましいです。
- 注意点2.システムリソースの消費
fioはシステムリソース(CPU、メモリ、I/O帯域)を大量に消費する可能性があるため、他のアプリケーションのパフォーマンスに影響を与えることがあります。リソース使用量を適切に調整するか、低負荷の時間帯にテストを実施することを推奨します。
- 注意点3.テストパラメータの選定
fioは非常に多くのパラメータを設定できますが、それぞれのパラメータがテスト結果にどのような影響を与えるかを理解することが重要です。テストの目的に応じて適切な読み書きパターン、ブロックサイズ、ランタイムなどを選択してください。
- 注意点4.テスト結果の解釈
fioから出力される結果には多くの情報が含まれていますが、これを正しく解釈し、適切な改善策に結びつけることが必要です。特にIOPS、スループット、レイテンシなどの指標を正しく理解し、それぞれのワークロードにどのような影響を与えるかを把握することが重要です。
- 注意点5.安定した状態でのテスト実施
テストの再現性を保証するために、システムが安定した状態でテストを行うことが重要です。バックグラウンドプロセスやその他のアプリケーションがテスト結果に影響を与えないように、必要に応じてそれらを停止しておくことをお勧めします。
まとめ
fioは非常に強力で柔軟なツールであるため、その全ての機能を完全に使いこなすには少し学習が必要そうです。
しかし、紹介したコマンド例を見ていただくとわかるように、基本的なテストを行うことはそれほど難しくありません。
最初はシンプルなコマンドから始めて、徐々にオプションを追加していく方法がお勧めです。また、fioには広範囲にわたるドキュメントとコミュニティがあり、多くの例やチュートリアルが利用可能です。これらの情報を活用することで、より複雑なシナリオの設定や解析が用意になり、自身が参加しているプロジェクトに合ったテストを提供できるようになります。いろいろ試して、ものにしていきましょう!
次回もLinuxの性能を測定するためのツールを紹介していきます。※後日追記予定
参考リンク: 公式ドキュメント、GitHubリポジトリ
↓ほかの協栄情報メンバーのLinuxについての記事を公開しています。ぜひ参考にしてみてください。
■【Linux】rsyncコマンドについて理解を深める(ito.d)
■linuxでのプロセスの監視について(ito.d)
■カーネルコマンドラインを使ってブート時にSELinuxを無効化する。(yamada.y)