DISK 管理の性能差を検証してみよう ~直接xfs、LVM、nfsの性能差~

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

こんにちは。サイオステクノロジーの橋本です。

今回は DISK (ボリューム) 管理方法の違いによる性能差を見ていきたいと思います。

よくこういう意見耳にしませんか?
 LVM はオーバヘッドがあるから遅い
 NFS は非常に遅いのでバックアップ用に適している
 物理ボリュームに直接ファイルシステムを作成する方法が一番無難 (そして DISK 拡張できず運用になやむ)
実際にどれくらいの性能差があるのか以下の 4 パターンで検証してみます。

検証パターン

1: 物理ボリュームに直接ファイルシステム (以下、「直 xfs」と呼称)
 50 GB の DISK 1 本をサーバにアタッチ
 LVM など用いずに DISK 上に直接ファイルシステム (xfs) を作成

2: 物理ボリューム 1 本で 1 つのボリュームグループ作成 (以下、「LVM ×1」と呼称)
 50 GB の DISK 1 本をサーバにアタッチ
 LVM を用いて対象の DISK 論理的に管理しファイルシステム (xfs) を作成

3: 物理ボリューム 25 本で 1 つのボリュームグループ作成 (以下、「LVM ×25」と呼称)
 2 GB の DISK を 25 本用意し、すべてをサーバにアタッチ
 LVM を用いて 25 本の DISK を 1 つのボリュームグループとして束ね、ファイルシステム (xfs) を作成

4: NFS
 文字通り NFS (Network File System) 
 DISK 管理方法と異なるレイヤーですが、NFS 上に PostgreSQL のデータを格納し検証してみます。

なお、NFS サーバは同一 AZ 内に別サーバとして用意しました。

※raw デバイスは RHEL 9 から利用できなくなったので
 今回は検証しません(できません)

前提

主要なパッケージやOSのバージョン

OS バージョンRed Hat Enterprise Linux release 9.4
Kernelkernel-5.14.0-427.13.1.el9_4.x86_64
PostgreSQLpostgresql16-16.2-1PGDG.rhel9.x86_64
LVMlvm2-2.03.23-2.el9.x86_64
nfsnfs-utils-2.5.4-25.el9.x86_64

サーバのリソース

CPU2コア
メモリ8GB

DISK

OS 領域15GB
検証用 (DB) 領域50GB

 

OS 領域はいずれの検証パターンでも LVM を用いず DISK 上に直接ファイルシステム (XFS) を作成したものを利用

DISK サイズはすべての検証パターンで 50 GB になるように調整しサーバにマウントしました。
マウントした 50 GB を PostgreSQL のデータ領域 ($PGDATA) として利用します。

当然いずれの検証パターンにおいても DISK そのものの性能差はありません。

検証方法

検証はすべて pgbench を用います。
以下のコマンドを用いて検証用のデータを作成しました。

pgbench -i -s 2500 TESTDB

以下のように負荷を掛けることで DISK 性能を計測します。

# pgbench -c 200 -t 100 TESTDB
pgbench (16.2)
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 2500
query mode: simple
number of clients: 200
number of threads: 1
maximum number of tries: 1
number of transactions per client: 100
number of transactions actually processed: 20000/20000
number of failed transactions: 0 (0.000%)
latency average = 182.821 ms
initial connection time = 754.209 ms
tps = 1093.966050 (without initial connection time)
#

噛み砕いていうと同時に 200 クライアントが DB に接続を行い、
それぞれのクライアントが 100 トランザクションを実行します。

今回、以下の 2 点の結果を見ます。
・latency average
 1トランザクションの実行時間 (単位は ms)
 数値が短い程高速に完了していることを示します。

・tps = xxxxxx (without initial connection time)
 1 秒あたりの実行トランザクション数 (接続確立に要した時間を考慮せず)
 数値が大きい程大量のトランザクションを処理していることを示します。

なお、検証はブレを考慮してそれぞれのパターンで 10 回行います (計40回検証)。

検証結果 : latency average

検証 10回のサマリ

平均値最小値最大値
直 xfs185.8769 ms181.374 ms189.893 ms
LVM ×1185.5508 ms180.168 ms198.081 ms
LVM ×25188.4649 ms182.428 ms197.622 ms
nfs243.9293 ms227.067 ms254.882 ms

個別の結果 (単位はすべて ms)

1回目2回目3回目4回目5回目6回目7回目8回目9回目10回目
直 xfs182.821185.401181.519188.62185.515189.893181.374189.672184.623189.331
LVM ×1180.691180.168182.824192.308181.503198.081183.759191.254182.587182.333
LVM ×25182.428186.594185.742192.513187.926197.622185.209187.631186.238192.746
nfs227.067229.767248.523254.183244.819247.029254.882236.622254.582241.819

検証結果 : tps

検証 10回のサマリ

平均値最小値最大値
直 xfs1076.2941053.2221102.692
LVM ×11078.8861009.691110.075
LVM ×251061.7421012.0331096.325
nfs821.1957784.6754880.7962

個別の結果

1回目2回目3回目4回目5回目6回目7回目8回目9回目10回目
直 xfs1093.9661078.7421101.811060.3351078.0791053.2221102.6921054.4511083.291056.351
LVM ×11106.8641110.0751093.9471039.9991101.9131009.691088.3811045.731095.3711096.891
LVM ×251096.3251071.8441076.7651038.8891064.2461012.0331079.8611065.9231073.8941037.636
nfs880.7962870.4461804.7554786.8345816.9299809.6224784.6754845.2306785.601827.0654

所感

所感としては「直 xfs」と「LVM ×1」の差はほぼ無いと言えます。
平均値として 0.3 ms の差なので誤差の範疇だと推測します。
※ 0.3 ms の差が致命的になるシステムも金融、証券系などで存在するため
 そういう場合はより厳密な検証が必要です

しかしながら、LVM で束ねている物理 DISK の数が多くなると、
3 ms と有意な差が現れ始めました。
おそらくですが物理 DISK が多くなるとこの差はより広がると推測されます。
「気にする程度か?」という気もしますが、
ここら辺になるとチリも積もればで影響が出るシステムもあるかもしれません。

nfs は DB として利用できないくらい遅い、、、と検証前思っていましたが
大分健闘した数値となりました。
※同一 AZ 内だったのでこれくらいの数値に収まったと推測します。

ちなみに伝わる人には伝わると思いますが、
格闘ゲームでよく言われる「フレーム」ですが
1 フレームは約 16ms です。
また、人間の反応速度の限界は(諸説ありますが) 200 ms 前後といわれます。
一般的なモニターの応答速度で5 ms前後です。

個人的な主観で言いますと、
LVM を用いた時に生じた数 ms の差は人間が知覚できない範囲の話であり、
シビアなシステムでない限り LVM の利便性を捨てる理由にはならないと考えます。

最後に

本検証はあくまで参考としていただければ幸いです。
より厳密な検証を行うには数百~数千回の検証を行い誤差をなくし精度を上げる必要があります。

また、今回は PostgreSQL で検証を行いましたが、システムや検証方法によっては
異なる結果が出る場合もあるかもしれません。

アバター画像
About 橋本 10 Articles
OSS サポートエンジニア。前職ではインフラエンジニアとしてサーバ運用なんかもしていました。現在は検証のため日々サーバを作っては壊す日々です。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる