OracleCloud Strage の検証。
最初に
OCIにStrageは2種類ある。
価格表
-- ファイル ストレージ
\46.50 1か月あたりのギガバイトストレージ容量
-- ブロック・ボリューム・ストレージ
\3.9525 1か月あたりのギガバイトストレージ容量
Block Volumeパフォーマンス単位
\0.2635 1 GB/月あたりのパフォーマンス単位
(最低価格パフォーマンス)
価格差はおよそ10倍。
FileStrageの方は保存している全ファイルサイズによって課金される。
BlockVolumeStrageは、指定したサイズが割り振られ課金される。
-- OCI上にコンピュートを複数作成しファイルの共有を行いたい。
FileStrageは保存しているサイズx時間で課金されれるので、小さいファイルをちょこちょこ共有して削除するならFileStrage の方が安価になりそう。
BlockVolumeStrageはサイズを決めてしまうと、決めたサイズによる課金になるので共有するファイルサイズが比較的大きく保存期間が長い場合、FileStrageより安価になりそう。
OCI コンピュートでアプリの連携に使うならBlockVolumeStrageと思いきや複数のコンピュートからアクセスするにはocfs2 を利用するか、代表のコンピュートにマウントしてnfs で他のコンピュートからアクセスする形になる。
いっぽう、FileStrageは全てのコンピュートからnfsマウントしてアクセス可能になる。
ocfs2 構築は以下を参考にした(結構メンドクサイ)
OCIでブロック・ボリュームを複数インスタンスにアタッチする
本題。
ocfs2を使ってBlockVolumeStrageを複数のコンピュートからアクセスするように構築したら、writeがとても遅い! これでは支障が!! と、なって検証した。
-- 構成 OSは全て OracleLinux 9 Minimal
・ap1 VM.Standard2.2(OCPU 2 メモリ30GB 前世代CPUの安いインスタンス)
・ap2 VM.Standard.A1.Flex(OCPU 4 メモリ24GB arm CPU でFreeひと月使える)
・ap3 VM.Standard.E2.1.Micro (OCPU 1 メモリ 1GB FreeTire)
書き込み速度を調べたいと、同じマウントポイントで実行したシェル
#!/bin/bash
for i in {1..5}
do
echo "This is loop number $i"
date
dd if=/dev/zero of=testfile_$(date +"%Y%m%d%H%M%S") bs=1024k count=1000 conv=fdatasync
echo "number $i is end."
date
done
-- 結果(だいたいの値)
ap1 1048576000 bytes (1.0 GB, 1000 MiB) copied, 26.6604 s, 39.3 MB/s
ap2 1048576000 bytes (1.0 GB, 1000 MiB) copied, 186.149 s, 5.6 MB/s
ap3 1048576000 bytes (1.0 GB, 1000 MiB) copied, 196.786 s, 5.3 MB/s
おそい・・・と、思いませんか?
ocfs2でファイルを書き込むjobが多い場合は最低でも課金しないとダメかと思いました。
各コンピュートのネットワーク帯域幅(Gbps):は ap1(課金)よりap2(無料枠)の方が優秀で謎です。ap3だけ遅いのなら理解できる・・・が。
ap1 ネットワーク帯域幅(Gbps):2
ap2 ネットワーク帯域幅(Gbps):4
ap3 ネットワーク帯域幅(Gbps):0.48
-- 改善策
「Block Volumeパフォーマンス単位」を変更する!!
パフォーマンス・ベースの自動チューニング -> ON
最大をUHPに設定(40くらい?
ap1 1048576000 bytes (1.0 GB, 1000 MiB) copied, 26.6616 s, 39.3 MB/s
ap2 1048576000 bytes (1.0 GB, 1000 MiB) copied, 34.4893 s, 30.4 MB/s
ap3 1048576000 bytes (1.0 GB, 1000 MiB) copied, 28.4843 s, 36.8 MB/s
ap2 が一番遅いように感じるけど許容範囲内に思える。
コスト的に考えてもVM.Standard2.2を複数台そろえるよりFreeTire 使ってBlock Volumeパフォーマンス単位を上げた方がコスパがいいはず。
-- 改善策(案 -> 没。
ap1 にBlockVolumeStrageをマウントし、ap1をnfsの親にして ap2,ap3 から nfsマウントする。
没にしたのは就業時間だけコンピュートを動作させる様にしたいと考えているから。
ap1が必ず先に稼働しなくてはならず、ap2の1台だけ動かしたい場合などもったいないなーっと。
-- 結論
取り敢えずBlockVolumeStrageのパフォーマンスを上げる。