FJcloud実践
LVMを使ったボリュームの性能検証
今回の記事では、以前ご紹介した「LVMを利用してFJcloud-Vのディスク容量制限2,000GBを回避する方法」の追加検証を実施します。
LVM(logical volume manager)を利用したボリュームを2つ作成し、性能検証を実施した後、ボリュームの性能について考察します。
前回の内容をご覧になっていない方はまず前回の記事をご覧ください。
LVMを利用してFJcloud-Vのディスク容量制限2,000GBを回避する方法
前提条件
本記事は、以下の前提知識がある方を想定しています。
- FJcloud-Vの基本的なコントロールパネルの操作、サービスを利用する知識
- Linuxサーバーの基本的な操作、知識
検証概要
前回の記事では、通常のボリュームとLVMで2つのディスクから作成した論理ボリュームの2種類のボリュームを使って性能検証を実施しました。
今回の検証では追加で以下の2種類のボリュームの検証を実施し、性能を比べてみます。
- ストライプ[1]を設定した論理ボリューム
- 3つのディスクで作成した論理ボリューム
ストライプを設定した論理ボリュームはスループットの向上が見込まれます。
参考:Red Hat Documentation 1.2. LVMの利点
また、3つのディスクで作成した論理ボリュームでは性能へどのような影響が出るのか確認します。
性能比較には前回と同様にfioというツールを利用します。fioはディスクにI/Oを発行してディスク性能を測ることができるツールです。
[1] ストライプ:データを読み書きする際にデータを細かく分割して複数台のディスクへ並列に読み書きすること
利用リソース
検証準備
まずは検証準備として、以下の2種類のボリュームを作成します。
- ストライプを設定した論理ボリューム
- 3つのディスクで作成した論理ボリューム
前回の記事と同様の検証を実施するため、12GBでそれぞれのボリュームを作成します。
ストライプを設定した論理ボリュームの作成
LVMを利用して2台の増設ディスクからストライプを設定した12GBのボリュームを作成します。
前回同様、以下の流れで論理ボリュームを作成します。
ただし、前回の検証と違い「5. 論理ボリューム作成」でストライプを設定しています。
ストライプ設定の方法のみを確認したい方は「5. 論理ボリューム作成」のみご覧ください。
- 1. 増設ディスクの作成・追加
- 2. パーティション作成
- 3. 物理ボリューム初期化
- 4. ボリュームグループ作成
- 5. 論理ボリューム作成
- 6. 論理ボリュームのマウント
1. 増設ディスクの作成・追加
1.1 増設ディスク作成・追加
まずはじめにクラウド操作方法ガイドを参考に増設ディスクを2つ作成します。
作成できたら以下のコマンドでサーバーにディスクを認識させます。
# for i in $(find /sys/class/scsi_host -name 'scan') $(find /sys/devices -name 'scan') ;do echo "- - -" > $i ; done
1.2 増設ディスク確認
fdiskコマンドで増設ディスクの確認を実施します。
# fdisk -l
~中略~
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdc: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
追加した増設ディスクを2つ確認できました。
今回はこの2つの増設ディスクからパーティションを切り出して、1つの論理ボリュームを作成します。
2. パーティション作成
fdiskコマンドを使ってパーティションを作成していきます。
12GBのボリュームを作成するため、2つのディスクにそれぞれ6GBのパーティションを作成します。
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048): 2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): +6GB
Created a new partition 2 of type 'Linux' and of size 954 MiB.
Command (m for help): w
3. 物理ボリューム初期化
2で作成したパーティションをLVMの物理ボリュームとして初期化します。
# pvcreate /dev/sdb1
# pvcreate /dev/sdc1
4. ボリュームグループ作成
3で初期化した物理ボリュームからボリュームグループを作成します。
# vgcreate vgstr_test /dev/sdb1 /dev/sdc1
5. 論理ボリューム作成
4で作成したボリュームグループからストライプを設定した論理ボリュームを作成します。
# lvcreate -n lvstr_test -l 100%FREE -i2 vgstr_test
'-i2'のオプションでストライプを設定しています。
ストライプの数は物理ボリュームの数より多くすることはできません。
今回は2つの物理ボリュームを使用しているため、ストライプ数が2となります。
6. 論理ボリュームのマウント
6.1 論理ボリュームのフォーマット
5で作成した論理ボリュームをフォーマットします。
# mkfs -t xfs /dev/vgstr_test/lvstr_test
6.2 マウントポイント作成
論理ボリュームをマウントするためのマウントポイントを作成します。
# mkdir /lvstrdisk
6.3 論理ボリュームマウント
論理ボリュームを作成したマウントポイントへマウントします。
# mount /dev/vgstr_test/lvstr_test /lvstrdisk
dfコマンドで正しくマウントできているか確認します。
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 32G 0 32G 0% /dev
tmpfs tmpfs 32G 0 32G 0% /dev/shm
tmpfs tmpfs 32G 8.9M 32G 1% /run
tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/sdd1 xfs 12G 112M 12G 1% /normaldisk
/dev/sda3 xfs 28G 2.5G 25G 10% /
/dev/sda1 xfs 507M 337M 170M 67% /boot
tmpfs tmpfs 6.3G 0 6.3G 0% /run/user/0
/dev/mapper/vgstr_test-lvstr_test xfs 12G 112M 12G 1% /lvstrdisk
一番下の行が今回マウントしたボリュームです。
ストライプ設定した論理ボリューム(lvstr_test)がマウントポイント(lvstrdisk)へマウントされていることを確認できました。
3つのディスクで作成した論理ボリューム
続いて3つのディスクで作成した論理ボリュームを作成します。
作成の流れはストライプを設定した論理ボリュームと同じです。3つのディスクで論理ボリュームを作成する場合は、増設ディスクを3つ準備し、「4. ボリュームグループ作成」で3つの物理ボリュームを指定します。
また、3つのディスクで作成するボリュームはスパンボリュームで作成し、ストライプボリュームではありません。
- 1. 増設ディスクの作成・追加
- 2. パーティション作成
- 3. 物理ボリューム初期化
- 4. ボリュームグループ作成
- 5. 論理ボリューム作成
- 6. 論理ボリュームのマウント
1. 増設ディスクの作成・追加
1.1 増設ディスク作成・追加
まずはじめにクラウド操作方法ガイドを参考に増設ディスクを3つ作成します。
作成できたら以下のコマンドでサーバーにディスクを認識させます。
# for i in $(find /sys/class/scsi_host -name 'scan') $(find /sys/devices -name 'scan') ;do echo "- - -" > $i ; done
1.2 増設ディスク確認
fdiskコマンドで増設ディスクの確認を実施します。
# fdisk -l
~中略~
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdc: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdd: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
追加した増設ディスクを3つ確認できました。
この3つの増設ディスクからパーティションを切り出して、1つの論理ボリュームを作成します。
2. パーティション作成
fdiskコマンドを使ってパーティションを作成していきます。
12GBのボリュームを作成するため、3つのディスクにそれぞれ4GBのパーティションを作成します。
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048): 2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): +4GB
Created a new partition 2 of type 'Linux' and of size 954 MiB.
Command (m for help): w
3. 物理ボリューム初期化
2で作成した3つのパーティションをLVMの物理ボリュームとして初期化します。
# pvcreate /dev/sdb1
# pvcreate /dev/sdc1
# pvcreate /dev/sdd1
4. ボリュームグループ作成
3で初期化した物理ボリュームからボリュームグループを作成します。ここで3つの物理ボリュームを指定し、3つの物理ボリュームを持ったボリュームグループを作成します。
# vgcreate vg3_test /dev/sdb1 /dev/sdc1 /dev/sdd1
5. 論理ボリューム作成
4で作成したボリュームグループから論理ボリュームを作成します。
# lvcreate -n lv3_test -l 100%FREE vg3_test
6. 論理ボリュームのマウント
6.1 論理ボリュームのフォーマット
5で作成した論理ボリュームをフォーマットします。
# mkfs -t xfs /dev/vg3_test/lv3_test
6.2 マウントポイント作成
論理ボリュームをマウントするためのマウントポイントを作成します。
# mkdir /lv3disk
6.3 論理ボリュームマウント
論理ボリュームを作成したマウントポイントへマウントします。
# mount /dev/vg3_test/lv3_test /lv3disk
dfコマンドで正しくマウントできているか確認します。
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 32G 0 32G 0% /dev
tmpfs tmpfs 32G 0 32G 0% /dev/shm
tmpfs tmpfs 32G 8.9M 32G 1% /run
tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/sdd1 xfs 12G 112M 12G 1% /normaldisk
/dev/sda3 xfs 28G 2.5G 25G 10% /
/dev/sda1 xfs 507M 337M 170M 67% /boot
tmpfs tmpfs 6.3G 0 6.3G 0% /run/user/0
/dev/mapper/vg3_test-lv3_test xfs 12G 112M 12G 1% /lv3disk
一番下の行が今回マウントしたボリュームです。3つのディスクで作成した論理ボリューム(lv3_test)がマウントポイント(lv3disk)へマウントされていることを確認できました。
以上で事前準備は完了です。
検証①
計測条件・項目
前回の結果との比較も実施するため、検証条件や項目は前回の検証と合わせます。
まず1回目の検証は1GBのデータで計測します。
以下の組み合わせのパターンで実施していきます。
計測に使用するfioコマンドは以下のとおりオプションを指定します。
上記図の検証パターンに合わせて対象ボリューム、ブロックサイズを書き換えて実行していきます。
fio --filename=/<対象ボリュームのマウントポイント> /1G.dummy --size=1G --direct=1 --rw=<Read,Write比率> --bs=<ブロックサイズ> --ioengine=libaio --iodepth=256 --numjobs=5 --runtime=180 --time_based --name=<ジョブ名> --group_reporting
それぞれのパターンの検証を複数回実施しその平均値を取得し、結果を確認します。
結果
今回計測して取得した値を、レイテンシー・スループット・IOPSの項目でグラフ化しました。
比較のため、前回の検証で取得した値も併記しています。
それぞれ項目ごとのグラフを確認していきます。
グラフ内の項目の説明は以下のとおりです。
ボリューム | 説明 | 備考 |
---|---|---|
通常 | 1つのディスクから構成したボリューム | 前回検証時の結果 |
LVM(2DISK) | LVMで2つのディスクから構成したスパンボリューム | 前回検証時の結果 |
LVM(ストライプ) | LVMで2つのディスクから構成したストライプボリューム | 今回検証した結果 |
LVM(3DISK) | LVMで3つのディスクから構成したスパンボリューム | 今回検証した結果 |
レイテンシー
まずはレイテンシーから確認します。
レイテンシーでは、LVM(ストライプ)の数値が小さく応答が早いという結果となりました。
スループット
続いてスループットを確認します。
スループットでは、LVM(ストライプ)のみ数値が大きく、他のボリュームはほとんど差がみられない結果となりました。
IOPS
最後にIOPSを確認します。
IOPSでは、LVM(ストライプ)のみ数値が大きく、他のボリュームはほとんど差がみられない結果となりました。
検証①まとめ
1GBの実施結果では以下のとおりとなりました。
- LVM(ストライプ)はどの項目でも数値がよい結果となった
- 通常、LVM(2DISK)、LVM(3DISK)の3つはどの項目でもほとんど差が見られなかった
検証②
計測条件・項目
続いてはデータサイズを大きくし、10GBで検証を実施します。
こちらも前回の結果との比較も実施するため、検証条件や項目は前回の検証と合わせます。
1GBでの検証と同様に、以下の組み合わせを各複数回実施しその平均値を取得し、結果を確認します。
結果
検証①と同様に今回計測して取得した値を、レイテンシー・スループット・IOPSの項目でグラフ化しました。
比較のため、前回の検証で取得した値も併記しています。
それぞれ項目ごとのグラフを確認していきます。
グラフ内の項目の説明は以下のとおりです。
ボリューム | 説明 | 備考 |
---|---|---|
通常 | つのディスクから構成したボリューム | 前回検証時の結果 |
LVM(2DISK) | LVMで2つのディスクから構成したスパンボリューム | 前回検証時の結果 |
LVM(ストライプ) | LVMで2つのディスクから構成したストライプボリューム | 今回検証した結果 |
LVM(3DISK) | LVMで3つのディスクから構成したスパンボリューム | 今回検証した結果 |
レイテンシー
まずはレイテンシーから確認します。
レイテンシーでは、LVM(ストライプ)の数値が小さく応答が早いという結果となりました。
スループット
続いてスループットを確認します。
スループットでは数値が大きいほうから順に、LVM(3DISK)、LVM(ストライプ)、LVM(2DISK)、通常という結果となりました。
IOPS
最後にIOPSを確認します。
IOPSでも数値が大きいほうから順に、LVM(3DISK)、LVM(ストライプ)、LVM(2DISK)、通常という結果となりました。
しかし、LVM(ストライプ)、LVM(2DISK)の2つはほとんど差が見られませんでした。
検証②まとめ
10GBの実施結果では以下のとおりとなりました。
- LVM(3DISK)のボリュームはどの項目でも数値がよい結果となった
- LVM(ストライプ)とLVM(2DISK)の比較ではLVM(ストライプ)が同等か少しよい程度の性能で、検証①のような大きな差はなかった
考察
ここからは検証①と検証②についてどうしてこのような結果になったのか考察していきます。
検証①考察
1GBでの性能検証の結果、LVM(ストライプ)が最も高い性能となりました。
これはストライプ設定をしたことにより、1Gというアクセス範囲でもI/Oが複数のディスクに分散され、ディスクへのアクセスが並列で実施されたためと考えられます。
一方、同様に複数本構成となっているLVM(2DISK)、LVM(3DISK)は、スパンボリュームかつアクセス範囲が1Gであったため、ランダムアクセスでもアクセス範囲が1つのディスクに収まり並列処理が実施されず、性能向上が見られませんでした。
結果、通常ボリューム、LVM(2DISK)ボリューム、LVM(3DISK)ボリュームはディスクの本数に差はありますが、アクセスできるディスクが1本に制限され、ほとんど同等の結果になったと推測されます。
検証②考察
10GBでの性能検証の結果、LVM(3DISK)が最も高い性能となりました。
これはデータ容量の増大でアクセス可能な範囲が3つのディスクに広がり、ランダムアクセスにより広がった範囲全体にアクセスが実施され、3つのディスクに並列処理が行われたためと考えられます。
LVM(2DISK)も同様の動作で2つのディスクに並列でアクセスが実施されたため、LVM(ストライプ)とほぼ同等の数値となりました。
通常ボリュームは、並列でアクセスできるディスクがなく、1つのディスクに処理が集中したため最も低い性能となりました。
最後に
今回の記事では、LVMを用いて3つのディスクで構成したスパンボリュームとストライプボリュームの性能検証を実施し、その結果を比較しました。
LVM(ストライプ)は検証①と検証②の両方で性能向上を確認できました。FJcloud-Vにおいて、高速ディスクでも性能が不足する場合に、LVMのストライプ設定の利用をご検討ください。
LVM(2DISK)、LVM(3DISK)でも通常ディスクより性能が向上し、ディスクを増やしても性能劣化がないことを確認できました。FJcloud-Vでは増設ディスクの最大容量が4TBのため、4TB以上の容量が必要な場合に利用をご検討ください。
上記のようにデータの特性等を考慮し適切な設計を行うことが大切です。本記事の結果が、皆様のLVM利用の参考になれば幸いです。
注意事項
- 本記事の他社サイトへのリンクにつきまして、リンク切れの際はご容赦ください。
- 本計測は、あくまで筆者の環境を使った計測時点での値であり、計測環境・計測時間によって異なる場合あります。参考程度に留めてください。
- 本記事ではOS上の操作についても記載していますが、FJcloud-VではOS以上はご利用者様の責任範囲となりますのでご留意ください。
- 本記事に記載されている会社名、製品名等の固有名詞は各社の商号、登録商標または商標です。
- 本記事は、2024年10月時点の情報です。