ossfs 2.0.9 以降では、ローカルの一時ディレクトリに基づいたランダム書き込みをサポートしています。--temp_dir マウントオプションを設定することで、ossfs 2.0 は書き込みデータをローカルディスクにステージングし、マウントポイントに、任意のオフセットでの書き込み、任意のサイズへの切り捨て、書き込み中の読み取りといった完全な POSIX ランダム書き込みセマンティクスを付与します。このトピックでは、ランダム書き込みの動作原理、設定方法、使用上の制約、および推奨事項について説明します。
背景情報
OSS でオブジェクトが一度作成されると、部分的に変更することはできません。コンテンツを変更するには、オブジェクト全体を上書きする必要があります。ossfs 2.0 のデフォルトモードでは、書き込みパスでストリーミングアップロードを使用します。データは書き込みと同時にシーケンシャルなパートとして OSS にアップロードされるため、以下の制限があります:
シーケンシャル書き込みのみがサポートされています。ファイルの末尾を超える位置への
pwriteの呼び出しはサポートされていません。truncateは 0 への切り捨てのみをサポートします。 0 以外のサイズに切り捨てようとすると、ENOTSUPが返されます。書き込み中の (クローズされる前の) ファイルを読み取ろうとすると、
EBUSYが返されます。
AI エージェントのコード実行、スクリプトのインプレース編集、科学計算の中間結果などのシナリオでは、一般的にランダム書き込みセマンティクスが利用されます。ossfs 2.0 のランダム書き込み機能は、書き込みデータをローカル一時ディレクトリにステージングし、チャンク管理と増分アップロードを組み合わせることで、オブジェクトストレージ上でのランダム書き込みを実現します。
ossfs 2.0 のランダム書き込みモードには、以下の機能があります:
完全な POSIX ランダム書き込みセマンティクス: 任意のオフセットでの
pwrite、O_APPEND、および任意のサイズへのtruncate(拡大または縮小) をサポートします。書き込み中の読み取り: ファイルの書き込み中に読み取りが可能です。変更部分はローカルのステージング領域から、未変更の部分は OSS から直接読み取られます。
増分アップロード:
flushまたはclose時に、変更されたデータブロックのみをローカルディスクからアップロードします。未変更の部分は OSS 上のサーバー側のコピーで処理するため、ローカル I/O とアップロード帯域幅を消費しません。ディスク容量の保護: ステージングディスクの空き容量が不足すると、組み込みのグローバルディスクバジェットが書き込みに対して
ENOSPCを返します。マウント時に空き容量のしきい値を予約して、システムディスクが満杯になるのを防ぐことができます。
ローカル一時ディレクトリは、書き込みパスにのみ使用されます。これは、読み取りキャッシュであるローカルデータキャッシュ (--disk_data_cache_dir) とは独立しています。異なるディレクトリを使用することで、両方を相互に干渉させることなく同時に有効にできます。
デフォルトでは、ossfs 1.0 はローカル一時ディレクトリとして /tmp ディレクトリを使用します。パスを ossfs 1.0 のデフォルトパスと一致させるには、--temp_dir=/tmp を設定します。
ランダム書き込みを有効にすると、書き込みパフォーマンスは、ローカル一時ディレクトリが存在するディスクの読み書きパフォーマンスによって制限されます。大きなファイルのコピーなど、一括でのシーケンシャル書き込みを含むシナリオでは、パフォーマンスはデフォルトモードよりもはるかに低くなります。この機能は、ワークロードが真にランダム書き込みセマンティクスを必要とする場合にのみ有効にしてください。
動作原理
ローカルステージングとマージアップロード
ランダム書き込みを有効にすると、ossfs 2.0 はランダムに書き込まれるファイルごとにローカル一時ディレクトリにステージングファイルを作成し、最新の変更を固定データブロック (チャンク) 単位でローカルに保存します。
書き込みデータは、直接ローカルのステージングファイルに格納されます。書き込みがクラウドに既に存在するデータブロックと部分的にしか重複しない場合、ossfs はまず OSS からそのブロックをフェッチして、ローカルにステージングされたデータの完全性を保証します。
fsyncまたはclose時に、ローカルでステージングされた変更はクラウド上のデータと自動的にマージおよびアップロードされます。変更された部分はローカルディスクからアップロードされ、変更されていない部分は OSS のサーバーサイドコピーによって処理されるため、ファイル全体を再送信したり、ローカルディスクの読み取り帯域幅を消費したりすることはありません。アップロードが成功すると、ステージングディスク領域は自動的に解放されます。
書き込み中の読み取り
ファイルの書き込み中に読み取ることも可能です。変更部分はローカルのステージング領域から、未変更の部分は OSS から直接読み取られます。
ディスク領域の保護
マウント時に、ossfs は一時ディレクトリが配置されているディスクの空き容量が予約領域の要件を満たしているかを確認し、満たしていない場合はマウントを拒否します。 予約ディスク容量が不足している場合、ディスクがいっぱいになってプロセスがクラッシュすることはなく、書き込みは ENOSPC を返します。
設定方法
設定項目 | 必須 | 説明 | デフォルト値 |
temp_dir | いいえ | ローカル一時ディレクトリのパス。絶対パスである必要があります。空でない値を設定すると、ランダム書き込みが有効になります。この機能を無効にするには、空のままにします。 | 空 |
temp_dir_free_bytes | いいえ | 一時ディレクトリが存在するディスク上で予約する最小空きディスク領域 (バイト単位、K、M、G などの単位をサポート)。ossfs2 はこの予約領域をステージングデータには使用しません。ディスクの空き容量がこのしきい値を下回ると、新しい書き込みは | 1 GiB |
random_write_max_file_size | いいえ | ランダム書き込みモードでの単一ファイルの最大論理サイズ (バイト単位、K、M、G などの単位をサポート)。この制限を超える書き込みや切り捨ては | 100 GiB |
制約事項:
--temp_dirが指すディレクトリが存在しない場合、自動的に作成されます。システムディスクや他のワークロードとの領域の競合を避けるため、独立したパーティションまたはディスクを使用することをお勧めします。書き込み中のファイルのデータは、ローカルの一時ディレクトリに保存されます。ディスク容量が不足している場合、書き込みは ENOSPC を返します。残りの空きディスク容量から
temp_dir_free_bytesによって予約された領域を差し引いたものが、書き込み可能なディスク容量と呼ばれます。ossfs2 は、書き込み中のデータを保存するために、この領域のみを使用します。書き込み可能なディスク容量は、同時に書き込まれるすべてのファイルの合計サイズより大きい必要があります (最悪の場合、ファイル全体がローカルに書き込まれる可能性があります)。同じマシンに複数の ossfs2 インスタンスがマウントされている場合、ステージングファイル名が衝突しないため、同じ一時ディレクトリを共有できます。ただし、複数のインスタンスがディスクの領域と I/O を競合するため、独立したディレクトリを使用することを推奨します。
--temp_dirと--enable_appendable_objectは相互に排他的であり、同時に有効にすることはできません。
マウントコマンドの例:
ossfs2 mount /mnt/oss/ \
--oss_bucket <your-bucket> \
--oss_endpoint <your-endpoint> \
--oss_access_key_id <ak> \
--oss_access_key_secret <sk> \
--temp_dir /mnt/disk/ossfs2/temp \
--temp_dir_free_bytes 1 G環境要件
パラメーター | 要件 |
一時ディレクトリのディスクタイプ | Elastic ephemeral disk、ローカル NVMe、または ESSD を推奨します。ディスクの書き込みスループットは、ランダム書き込みのレイテンシとアップロード速度に直接影響します。 |
Disk available space | Not less than |
機能の効果
--temp_dir の有効化前後における書き込み性能の比較:
操作 | デフォルトモード | ランダム書き込みモード |
シーケンシャルな追記書き込み | サポート | サポート |
任意のオフセットでの pwrite (ファイルの末尾を超える) | 非対応 | サポート |
0 への truncate | サポート | サポート |
任意のサイズへの truncate (拡大または縮小) | 非対応 ( | サポート |
既存ファイルへの O_APPEND 書き込み | 非対応 | サポート |
書き込み中のファイルの読み取り | 非対応 ( | サポート |
複数のハンドルによる同じファイルへの同時書き込み | 非対応 | サポート |
耐久性のセマンティクス:
デフォルトでは、ランダム書き込みモードは
fsyncのセマンティクスに従います。fsyncは、ローカルの変更をクラウド上のデータとマージしてアップロードします。正常にリターンすると、データは OSS に永続化されます。ファイルが閉じられると、残りのデータもアップロードされます。アップロードの失敗はエラーとしてアプリケーションに返され、アプリケーションは
fsyncを通じて再試行できます。アップロードが最終的に失敗し、ファイルが閉じられた場合、永続化されていないデータは失われ、ファイルの内容はリモートエンドで最後に正常にアップロードされたバージョンに戻ります。プロセスが異常終了した場合、アップロードされていないステージングデータは失われますが、OSS 内のオブジェクトは最後に成功したアップロードの状態を維持します。破損したオブジェクトは生成されません。
使用に関する推奨事項
ローカル一時ディレクトリに基づくランダム書き込みは、OSS マウントポイントでローカルファイルシステムのような書き込みセマンティクスを必要とするシナリオに適しています。
ランダム書き込みの有効化に適したシナリオ:
シナリオ | 使用に関する推奨事項 |
AI エージェントのコード実行 / サンドボックス環境 (エージェントとコードインタープリターがファイルに対して任意の読み書きやインプレース編集を実行) | ランダム書き込みを有効にします。一時ディレクトリには独立した高性能ディスクを使用し、同時に書き込まれるファイルの合計サイズに基づいて書き込み可能なディスク領域を予約することを推奨します。 |
科学計算またはシミュレーションアプリケーションの中間結果ファイル | ランダム書き込みを有効にします。同時に書き込まれるファイルの合計サイズに基づいて書き込み可能なディスク領域を計画してください。 |
ランダム書き込みの有効化が推奨されないシナリオ:
シナリオ | 使用に関する推奨事項 |
大きなファイルのコピー (cp、rsync、および同様のツールを使用したマウントポイントへの一括書き込み) | このシナリオでは、書き込みパフォーマンスはローカルディスクに制限されるため、デフォルトモードよりもはるかに低くなります。代わりにデフォルトのストリーミングアップロードモードを使用してください。 |
Pure sequential append writes (streaming log writes) | The default streaming upload path has lower overhead, so enabling random writes is unnecessary. If read-while-write is required, consider |
ディスクバジェットに関する推奨事項:
ステージングされたデータによってシステムディスクがいっぱいになり、ホストの安定性に影響が及ぶのを防ぐため、一時ディレクトリはシステムディスクから分離してください。マシンにディスクが 1 つしかない場合は、
temp_dir_free_bytesをより大きな値 (例: 10G) に設定して、システム用に十分な空き領域を確保することを推奨します。書き込み可能なディスク領域 (上記の制約事項を参照) は、同時に書き込まれるファイルの合計サイズよりも大きい必要があります。
100 GiB を超える単一ファイルの場合、
--random_write_max_file_sizeを明示的に増やす (例:--random_write_max_file_size=500G) ことに加えて、書き込み可能なディスク容量がそのファイルのサイズを超えていることを確認する必要もあります。