ossfs 2.0 が Object Storage Service (OSS) に送信するメタデータリクエストを最適化することで、API 呼び出しコストを削減し、同時実行性を向上させ、マウントポイントでの読み取り/書き込み操作を高速化します。
基本原則
ossfs 2.0 は、FUSE (ユーザー空間ファイルシステム) フレームワークに基づいて構築されています。ファイルシステムのメタデータ操作を OSS リクエストに変換し、標準のファイルシステムインターフェイスを介して OSS ストレージリソースにアクセスできるようにします。
|
コマンド |
インターフェイス変換ルール |
|
|
GetObjectMeta リクエストが 404 レスポンス (オブジェクトが存在しないことを示す) を返した場合、さらに ListObjects(max-keys=1) リクエストを送信して、同名の仮想フォルダーオブジェクトが存在するかどうかを照会します。 |
|
|
|
|
|
ossfs 2.0 は、デフォルトで |
|
|
シナリオ分析
ファイルシステムを介してファイルにアクセスすることと、OSS 内の対応するオブジェクトに直接アクセスすることには大きな違いがあります。
ファイルアクセス方法
ossfs は、ルートディレクトリからトップダウンでファイルパスを解決します。たとえば、/dir/object の属性を取得するために、stat /dir/object コマンドは次のように実行されます:
-
まず、/dir に対して操作を実行し、GetObjectMeta dir リクエストを送信します。「404 Not Found」が返された場合、オブジェクトが存在しないことが示され、次に
ListObjects (max-keys=1)dir/リクエストが送信されます。「200 OK」が返された場合、対応する仮想フォルダーが存在することが示されます。 -
/dir/object に対して操作を実行し、GetObjectMeta dir/object リクエストを送信します。「200 OK」が返された場合、オブジェクトの属性情報が正常に取得されます。
1 つの stat /dir/object コマンドで、2 つの GetObjectMeta リクエストと 1 つの ListObjects リクエストが発生します。各パスコンポーネントには独自のメタデータルックアップが必要なため、ファイルの深さが増すにつれて OSS リクエストの数が増加し、パフォーマンスが低下します。
ファイルメタデータキャッシュの影響
ossfs 2.0 は、デフォルトでファイルメタデータキャッシュを有効にし、デフォルトのキャッシュ有効期間は 60 秒です。メタデータのキャッシュ容量は FUSE の低レベル API に基づいて実装され、いつエビクトするかはオペレーティングシステムのカーネルによって決定されます。通常、メモリが多いマシンほど、より多くのメタデータ情報をキャッシュできます。
次の例は、/dir/ ディレクトリ内の 100 個の子ファイルの属性を読み取る際に、メタデータキャッシュがパフォーマンスにどのように影響するかを示しています。
-
メタデータキャッシュなしの場合
-
既知のファイル一覧でファイルにアクセスする場合:
ループ内で
stat /dir/object-<i>コマンドを実行すると、各stat操作は 1 つの GetObjectMeta リクエストに変換され、最終的にファイルの属性を取得するために 100 個の GetObjectMeta リクエストが OSS に送信されます。これにより、メタデータリクエストが多すぎてパフォーマンスに影響が出ます。 -
未知のファイル一覧でファイルにアクセスする場合:
lsコマンドを実行すると、この操作はファイル一覧を取得するために OSS に送信される 1 つの ListObjects リクエストに変換されます。その後、取得したファイル一覧に基づいてファイルの属性を取得するためにstat /dir/object-<i>コマンドをループで実行します。これにより、最終的に 1 つの ListObjects リクエストと 100 個の GetObjectMeta リクエストが OSS に送信され、メタデータリクエストが多すぎてパフォーマンスに影響が出ます。
-
-
メタデータキャッシュありの場合
-
既知のファイル一覧でファイルにアクセスする場合:
ループ内で
stat /dir/object-<i>コマンドを実行すると、各stat操作は 1 つの GetObjectMeta リクエストに変換され、最終的に 100 個の GetObjectMeta リクエストが生成されます。これらの 100 個のリクエストは、キャッシュ有効期間内にローカルのメタデータキャッシュに直接ヒットしてファイル属性を取得するため、OSS に送信されるリクエストの数を効果的に削減します。 -
未知のファイル一覧でファイルにアクセスする場合:
lsコマンドを実行すると、この操作は OSS に送信される 1 つの ListObjects リクエストに変換され、同時にローカルのメタデータキャッシュが更新されます。キャッシュの更新が完了した後、stat /dir/object-<i>コマンドをループで実行する際、メタデータはすでにローカルキャッシュにあるため、追加の OSS リクエストは送信されません。
-
メタデータキャッシュは、OSS への繰り返しリクエストを効果的に削減します。フォルダー内のすべてのファイルを走査する際、最初に ls を実行するとキャッシュがプリロードされ、その後のファイルごとの OSS リクエストが不要になります。
最適化方法
次の方法を使用して、OSS へのメタデータリクエストを削減し、パフォーマンスを向上させます:
メタデータキャッシュ時間の延長
アップロード後にデータが不変であるか、キャッシュ期間に対して変更が頻繁でない場合は、attr_timeout マウントオプションを増やしてメタデータキャッシュ有効期間を延長し、繰り返しリクエストを削減します。
-
ビジネスシナリオ:データアノテーションシナリオでは、システムは以前に収集された生データのバッチを読み取り、それを処理してから、新しいデータのバッチを生成します。このシナリオでは、生データは OSS にアップロードされた後は変更されません。
-
マウント設定:ossfs 2.0 設定ファイルで、メタデータキャッシュ有効期間を 7200 秒に設定します。
# バケットのエンドポイント (リージョンノード) --oss_endpoint=https://oss-cn-hangzhou-internal.aliyuncs.com # バケット名 --oss_bucket=bucketName # メタデータキャッシュ有効期間 --attr_timeout=7200 # アクセスキーの AccessKey ID とシークレットアクセスキー (ossfs 2.0.1 以降のバージョンではオプション) --oss_access_key_id=LTAI****************** --oss_access_key_secret=8CE4**********************
ファイル一覧取得後の操作
ディレクトリ内の個々のファイルにアクセスする前に、ls コマンドを実行するか、ListObjects リクエストを送信して、すべてのファイルメタデータをローカルキャッシュにプリロードします。より長いキャッシュ有効期間と組み合わせることで、ファイルごとの OSS への繰り返しリクエストが不要になります。
ls コマンドは、ディレクトリの内容を読み取る任意のプログラムに置き換えることができます。次の例では、/mnt/data/ ディレクトリ内のファイルを一覧表示します。
Python
os.listdir('/mnt/data/')
Go
entries, err := os.ReadDir("/mnt/data/")
C
dir = opendir("/mnt/data/");
if (dir != NULL) {
struct dirent *entry;
while((entry = readdir(dir)) != NULL) {}
closedir(dir);
}
ネガティブキャッシュによるファイル作成の高速化
新しいファイルを作成するために、ファイルシステムは lookup と create の 2 つのシステムコールを順番に実行します。
-
lookup操作は、対応するファイルが存在するかどうかを判断します。ossfs 2.0 では、この操作は GetObjectMeta リクエストと ListObjects リクエストに解析されます。 -
「404 Not Found」エラーが返された場合、ossfs は
create操作を使用してファイルを作成します。ossfs 2.0 がcreateを実行する際にも、GetObjectMeta リクエストと ListObjects リクエストを送信して、ファイルが OSS に存在するかどうかを照会します。
したがって、新しいファイルを作成するプロセスには、4 つの OSS メタデータクエリ操作が含まれます。
ossfs 2.0 は、OSS から返される 404 リクエストのキャッシュをサポートしており、その後の重複リクエストを削減します。この機能を有効にするには、ファイルシステムをマウントする際に次のオプションを指定します:
-
--oss_negative_cache_timeout=30(デフォルト値は 0 秒です。この値はattr_timeoutの値より小さく設定することを推奨します。) -
--oss_negative_cache_size=10000(デフォルト値:10000)
OSS のネガティブキャッシュが有効になっていると、新しいファイルの lookup 操作からの 404 リクエストがキャッシュされます。その結果、create 操作中の後続のクエリはネガティブキャッシュにヒットし、OSS にリクエストは送信されません。これにより、ファイル作成プロセスの OSS リクエスト数が 4 つから 2 つに削減されます。
OSS のネガティブキャッシュを有効にした後、object-A という名前のファイルの 404 キャッシュエントリがキャッシュされた場合、たとえ OSS ですぐに object-A を作成したとしても、そのファイルはキャッシュエントリが期限切れになった後にのみマウントポイントで表示されるようになります。キャッシュ有効期間は oss_negative_cache_timeout で指定されます。高いデータ整合性が要求されるシナリオでは、この機能を有効にすることは推奨しません。
パフォーマンス比較
テスト方法:同一リージョン内の Elastic Compute Service (ECS) インスタンス上で、ossfs 2.0 を使用して OSS バケットをマウントします。この際、内部エンドポイントを使用し、メタデータキャッシュを有効にします。その後、マウントされたディレクトリ内にある 10,000 ファイルのメタデータを読み取ります。
テスト結果
|
操作 |
所要時間 |
|
メタデータキャッシュのプリロードなし (事前に |
111 秒 |
|
メタデータキャッシュのプリロードあり (事前に |
18 秒 |
テスト結論:一括ファイルアクセスの前にメタデータキャッシュをプリロードし、適切なキャッシュ有効期間と組み合わせることで、OSS のメタデータリクエストが大幅に削減され、全体的なパフォーマンスが向上します。