s3fs
を使用したバケットのマウント
NFS スタイルのファイル・システムに対する読み取りおよび書き込みを予期するアプリケーションでは、s3fs
を使用でき、ファイルのネイティブ・オブジェクト形式を保持しながら、ディレクトリーとしてバケットをマウントできます。
これにより、リスト表示用の ls
やファイルのコピー用の cp
のような使い慣れたシェル・コマンドを使用したり、ローカル・ファイルに対する読み取りおよび書き込みに依存するレガシー・アプリケーションにアクセスしたりして、クラウド・ストレージと対話できます。 詳細な概要については、プロジェクトの公式の README を参照してください。
IBM Cloud Kubernetes Service クラスターで IBM Cloud® Object Storage を使用する方法の説明をお探しですか? 代わりに、 IBM Cloud Kubernetes Service の資料 にアクセスしてください。
前提条件
- IBM Cloud アカウントおよび IBM Cloud® Object Storage のインスタンス
- Linux または macOS 環境
- 資格情報 (IAM API キーまたは HMAC 資格情報)
インストール
Debian または Ubuntu では、以下のようにします。
sudo apt-get install automake autotools-dev fuse g++ git libcurl4-openssl-dev libfuse-dev libssl-dev libxml2-dev make pkg-config
RHEL および CentOS 7 以降で EPEL を使用する場合:
sudo yum install epel-release
sudo yum install s3fs-fuse
この EPEL リポジトリーは IBMのプライベート・リポジトリーでは使用できないため、この EPEL リポジトリーをプルするには、デバイスにパブリック接続が必要です。 詳しくは、「 How to install EPEL on RHEL and CentOS Stream 」を参照してください。
公式の s3fs
資料では、libcurl4-gnutls-dev
ではなく libcurl4-openssl-dev
を使用することが推奨されています。 どちらも機能しますが、OpenSSL バージョンの方がよりパフォーマンスが向上する可能性があります。
macOSの場合は、ソースから s3fs
をビルドする必要があります。
以下のパッケージがインストールされていることを確認します (すべて Homebrew で入手できます)。
macfuse
automake
gcc
curl
libxml2
pkg-config
openssl
openssl
インストールの出力に記載されているように、以下の環境変数を設定する必要があります。
export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@3/include"
export PKG_CONFIG_PATH="/usr/local/opt/openssl@3/lib/pkgconfig"
macFUSE は、カーネル・エクステンションを含むクローズド・ソース・ソフトウェア であり、商用使用のためにライセンスが必要な場合があることに注意してください。
まず、以下のように Github リポジトリーを複製します。
git clone https://github.com/s3fs-fuse/s3fs-fuse.git
次に、以下のように s3fs
をビルドします。
cd s3fs-fuse
./autogen.sh
./configure
make
その後、以下のようにバイナリーをインストールします。
sudo make install
構成
<access_key>:<secret_key>
または :<api_key>
のいずれかを含むファイルに資格情報を保管します。 このファイルへのアクセスは制限する必要があるため、以下を実行します。
chmod 0600 <credentials_file>
これで、以下を使用してバケットをマウントできます。
s3fs <bucket> <mountpoint> -o url=http{s}://<endpoint> -o passwd_file=<credentials_file>
資格情報ファイルに API キーしかない (HMAC 資格情報がない) 場合は、以下のように ibm_iam_auth
フラグも追加する必要があります。
s3fs <bucket> <mountpoint> -o url=http{s}://<endpoint> -o passwd_file=<credentials_file> -o ibm_iam_auth
この例の <bucket>
は、既存のバケットを参照します。 <mountpoint>
は、バケットをマウントするローカル・パスです。 <endpoint>
は、 バケットのロケーション に対応している必要があります。
credentials_file
は、 API キーまたは HMAC 資格情報を使用して作成されたファイルです。
これで、 ls <mountpoint>
は、そのバケット内のオブジェクトを、それらがローカル・ファイルであるかのように (またはオブジェクト接頭部の場合は、それらがネストされたディレクトリーであるかのように) リストします。
パフォーマンス最適化
パフォーマンスは本物のローカル・ファイル・システムと等しくなることはありませんが、いくつかの拡張オプションを使用してスループットを向上させることができます。
s3fs <bucket_name> <mountpoint> -o url=http{s}://<COS_endpoint> –o passwd_file=<credentials_file> \
-o cipher_suites=AESGCM \
-o kernel_cache \
-o max_background=1000 \
-o max_stat_cache_size=100000 \
-o multipart_size=52 \
-o parallel_count=30 \
-o multireq_max=30 \
-o dbglevel=warn
cipher_suites=AESGCM
は、HTTPS エンドポイントを使用する場合にのみ関係します。 デフォルトでは、IBM COS へのセキュア接続はAES256-SHA
暗号スイートを使用します。 代わりにAESGCM
スイートを使用すると、TLS 暗号機能が原因でクライアント・マシンの CPU 負荷が大幅に軽減されると同時に、同じレベルの暗号セキュリティーが提供されます。kernel_cache
は、s3fs mountpoint
マウント・ポイントでカーネル・バッファー・キャッシュを使用可能にします。 つまり、同じファイルの反復読み取りをカーネルのバッファー・キャッシュから処理できるため、オブジェクトはs3fs
によって一度だけ読み取られます。 カーネル・バッファー・キャッシュは、他のプロセスで使用されていない空きメモリーのみを使用します。 バケットのマウント中に別のプロセス/マシンからバケット・オブジェクトが上書きされることが予想され、お客様のユースケースで最新のコンテンツにライブ・アクセスする必要がある場合、このオプションはお勧めしません。max_background=1000
は、s3fs
並行ファイル読み取りパフォーマンスを向上させます。 デフォルトでは、FUSE は最大 128 KB のファイル読み取り要求をサポートします。 これを超える読み取りを要求すると、カーネルは大きな要求を小さいサブ要求に分割し、s3fs がそれらを非同期的に処理できるようにします。max_background
オプションは、このような並行非同期要求のグローバル最大数を設定します。 デフォルトでは 12 に設定されていますが、任意の高い値 (1000) に設定すると、多数のファイルを同時に読み取る場合でも、読み取り要求がブロックされなくなります。max_stat_cache_size=100000
を設定すると、HEAD
によって送信される冗長な HTTPs3fs
要求の数が減り、ディレクトリーのリストやファイル属性の取得にかかる時間が短縮します。 標準的なファイル・システムの使用では、オブジェクト・ストレージ・システム上のstat()
要求にマップされるHEAD
呼び出しを介してファイルのメタデータに頻繁にアクセスします。 デフォルトでは、s3fs
は最大 1000 個のオブジェクトの属性 (メタデータ) をキャッシュに入れます。 キャッシュされる各項目は、最大で 0.5 KB のメモリーを占有します。 理想的には、バケット内のすべてのオブジェクトのメタデータをキャッシュに保持できるようにする必要があります。 ただし、このキャッシングによるメモリー使用の影響を考慮することをお勧めします。100000
に設定すると、占有スペースは 0.5 KB * 100000= 50 MB 以下になります。multipart_size=52
は、COS サーバーとの間で送受信する要求と応答の最大サイズを MB 単位で設定します。s3fs
は、これをデフォルトで 10 MB に設定します。 この値を大きくすると、HTTP 接続当たりのスループット (MB/秒) も向上します。 一方、ファイルから提供される最初のバイトの待ち時間も長くなります。 したがって、お客様のユースケースで各ファイルから少量のデータのみを読み取る場合は、恐らく、この値を大きくしたくないと思われます。 さらに、ラージ・オブジェクト (例えば 50 MB を超えるもの) では、この値が十分に小さく、複数の要求を使用してファイルを並行してフェッチできる場合、スループットが向上します。 このオプションの最適値は約 50 MB と思われます。 COS のベスト・プラクティスでは、4 MB の倍数の要求を使用することが推奨されるため、このオプションを 52 (MB) に設定することをお勧めします。parallel_count=30
は、単一のファイルの読み取り/書き込み操作ごとに、COS に並行して送信される要求の最大数を設定します。 デフォルトでは、これは 5 に設定されています。 非常に大きなオブジェクトの場合は、この値を増やすことによって、より多くのスループットを得ることができます。 前のオプションと同様に、各ファイルの少量のデータのみを読み取る場合は、この値を小さいままにしてください。multireq_max=30
: ディレクトリーをリストすると、リスト内のオブジェクトごとにオブジェクト・メタデータ要求 (HEAD
) が送信されます (メタデータがキャッシュ内に見つからない場合)。 このオプションは、単一のディレクトリー・リスト操作で COS に並行して送信されるそのような要求の数を制限します。 デフォルトでは、20 に設定されています。 なお、この値は、上記のparallel_count
オプション以上でなければなりません。dbglevel=warn
は、メッセージを /var/log/syslog に記録するために、デバッグ・レベルをデフォルトのレベル (warn
) ではなく、crit
に設定します。
制限
オブジェクト・ストレージ・サービスは最初のバイトまでの待ち時間が長く、ランダム書き込みアクセスがないため、s3fs はすべてのアプリケーションに適しているとは限らないことに注意してください。 ディープ・ラーニングのワークロードなど、大規模ファイルのみを読み取るワークロードでは、s3fs
を使用して良好なスループットを実現できます。