ossfs 2.0 を使用して OSS(Object Storage Service)と対話する場合、OSS サーバーに送信されるメタデータリクエストの数を適切に最適化することで、サービス呼び出しコストを削減するだけでなく、システムの同時処理能力を向上させ、マウントポイントの読み取りおよび書き込みパフォーマンスを向上させることができます。
基本原則
ossfs 2.0 は、FUSE(Filesystem in Userspace)フレームワークに基づいて開発されており、ファイルシステムのメタデータ操作インターフェイスを対応する OSS リクエストに変換することで、ファイルシステム操作を介して OSS ストレージリソースへのアクセスを可能にします。
コマンド | インターフェイス変換ルール |
|
GetObjectMeta リクエストが 404 応答(オブジェクトが存在しないことを示す)を返した場合、さらに ListObject(max-keys=1) リクエストを送信して、同じ名前の仮想フォルダオブジェクトが存在するかどうかをクエリします。 |
| |
|
ossfs 2.0 はデフォルトで |
|
シナリオ分析
ファイルシステム内のファイルへのアクセスと、OSS 内の同じ名前のオブジェクトへのアクセスには、大きな違いがあります。
ファイルアクセス方法
OSS は、ルートディレクトリからトップダウン方式のアクセス方法を使用してファイルにアクセスします。たとえば、/dir/object パスにあるオブジェクトファイルの属性情報を取得するには、stat /dir/object コマンドの実行フローは次のとおりです。
最初に、/dir に対して操作を実行し、GetObjectMeta dir リクエストを送信します。404 Not Found が返された場合は、オブジェクトが存在しないことを示しており、ListObject (max-keys=1)dir/ リクエストが送信されます。200 OK が返された場合は、対応する仮想フォルダが存在することを示します。
/dir/object に対して操作を実行し、GetObjectMeta dir/object リクエストを送信します。200 OK が返された場合は、オブジェクト属性情報が正常に取得されます。
上記の分析に基づくと、単一の stat /dir/object コマンドの実行は、最終的に 2 つの GetObjectMeta リクエストと 1 つの ListObject リクエストに変換されます。さらに、ファイルシステムのメタデータリクエストは複数の OSS リクエストに変換され、その数はファイルの深さとともに増加するため、パフォーマンスが大幅に低下します。
ファイルメタデータキャッシュの影響
ossfs 2.0 は、デフォルトでファイルメタデータキャッシングを有効にしており、デフォルトのキャッシュ有効期間は 60 秒です。メタデータのキャッシュ容量は FUSE 低レベル API に基づいて実装されており、いつエビクトされるかはオペレーティングシステムカーネルによって決定されます。より多くのメモリを搭載したマシンは、通常、より多くのメタデータ情報をキャッシュできます。
/dir/ ディレクトリにある 100 個の子ファイルの属性情報を取得する例を取り上げて、ファイルメタデータキャッシングがパフォーマンスに及ぼす影響を説明します。
メタデータキャッシングなし
既知のファイルリストを使用してファイルにアクセスする:
ループ内で
stat /dir/object-<i>コマンドを実行する場合、各stat操作は 1 つの GetObjectMeta リクエストに変換され、最終的にファイル属性を取得するために OSS に送信される GetObjectMeta リクエストが 100 個生成されます。これにより、メタデータリクエストが多すぎてパフォーマンスに影響が出ます。不明なファイルリストを使用してファイルにアクセスする:
lsコマンドを実行すると、この操作はファイルリストを取得するために OSS に送信される 1 つの ListObject リクエストに変換され、取得したファイルリストに基づいてファイル属性を取得するためにループ内でstat /dir/object-<i>コマンドが実行されます。これにより、最終的に OSS に送信される ListObject リクエストが 1 つと GetObjectMeta リクエストが 100 個生成され、メタデータリクエストが多すぎてパフォーマンスに影響が出ます。
メタデータキャッシングあり
既知のファイルリストを使用してファイルにアクセスする:
ループ内で
stat /dir/object-<i>コマンドを実行する場合、各stat操作は 1 つの GetObjectMeta リクエストに変換され、最終的に 100 個の GetObjectMeta リクエストが生成されます。これらの 100 個のリクエストは、キャッシュの有効期間内にローカルメタデータキャッシュに直接ヒットしてファイル属性を取得するため、OSS に送信されるリクエストの数が効果的に削減されます。不明なファイルリストを使用してファイルにアクセスする:
lsコマンドを実行すると、この操作はローカルメタデータキャッシュを更新しながら OSS に送信される 1 つの ListObject リクエストに変換されます。キャッシュの更新が完了した後、ループ内でstat /dir/object-<i>コマンドを実行すると、メタデータは既にローカルキャッシュにあるため、追加の OSS リクエストは送信されません。
上記の分析に基づくと、メタデータキャッシング機構は OSS に送信される繰り返しのリクエストの数を効果的に削減できます。フォルダ内のすべてのファイルをトラバースする場合、ls を使用するとメタデータキャッシュをプリロードできるため、子ファイルの後続の OSS リクエストが効果的に削減されます。
最適化手法
以下の方法で、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 と AccessKey Secret(ossfs 2.0.1 以降のバージョンではオプション) --oss_access_key_id=LTAI****************** --oss_access_key_secret=8CE4**********************
ファイルリストを取得した後に操作する
ディレクトリ内のすべてのファイルをトラバースする場合、最初に ls コマンドを使用するか、ListObject リクエストを送信して、ターゲットフォルダ内のすべてのファイルのメタデータをローカルメタデータキャッシュにプリロードし、より長いキャッシュ有効期間と組み合わせることで、繰り返されるメタデータリクエストを削減し、最終的に全体的なパフォーマンスを向上させることができます。
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を実行すると、ファイルが OSS に存在するかどうかをクエリするために GetObjectMeta リクエストと ListObjects リクエストも送信します。
したがって、新しいファイルを作成するプロセスには、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 で指定されます。高いデータ整合性が要求されるシナリオでは、この機能を有効にすることはお勧めしません。
パフォーマンス比較
テスト方法:ターゲット OSS バケットと同じリージョンにある ECS インスタンスで、ossfs 2.0 ツールを使用して内部同一リージョンエンドポイント経由でメタデータキャッシングを有効にして OSS バケットをマウントし、マウントされたバケットディレクトリにある 10000 ファイルのメタデータを読み取ります。
テスト結果
操作 | 消費時間 |
メタデータキャッシュをプリロードしない(事前に | 111 秒 |
メタデータキャッシュをプリロードする(事前に | 18 秒 |
テストの結論:ファイルメタデータの読み取りが多いシナリオでは、メタデータキャッシュを事前にプリロードし、適切なメタデータキャッシュ有効期間と組み合わせることで、OSS に送信されるメタデータリクエストの数を大幅に削減し、全体的なパフォーマンスを向上させることができます。