ユーザーデータは、2つのかなり大きな(1 PBを超える)OpenStack Swiftストレージクラスターに保存されます。それらをクラスターAおよびクラスターBとします。
さらに、そのデータとやり取りする必要があるPoPがいくつかあります。これらのPoPのサーバーは事実上ディスクレスです。つまり、ユーザーデータがサーバーに保存されたりダウンロードされたりすることはありません。PoPは、一般的な世界の地域(北米、南アフリカ、中央ヨーロッパなど)にグループ化できます。
一部のPoPは、任意のクラスターのSwiftエンドポイントからかなり離れているため、望ましくない遅延が発生します。これをある程度緩和するために、各リージョンにキャッシングゲートウェイサーバーをセットアップします。これにより、最も近いクラスターへのr / w要求がキャッシュされます。
現在、PoPのいずれかのクライアントは、Swift Object Storageをブロックデバイス(多かれ少なかれ)としてマウントするFUSEモジュールである、永続的にマウントされた迅速な仮想ファイルシステムによってユーザーデータにアクセスします。ただし、そもそもsvfsは安定しているわけではなく、将来的にはクライアントはNFS経由でキャッシュサーバーにアクセスする必要があります。
これは、目的のアーキテクチャの1つのブランチの図です。
+------------------+ +------------------+ NFS +------------------+
| Cluster A | SVFS | Region 1 Cache +----------> R1 PoP a Client |
| +----------------> | | |
|Persistent Storage| |Ephemeral Storage+----+ |Generates R/W Load|
+-----------------++ +------------------+ | +------------------+
| |
| +------------------+ | NFS +------------------+
| SVFS | Region 2 Cache | +-----> R1 PoP b Client |
+-----------------> | | |
|Ephemeral Storage| |Generates R/W Load|
+------------------+ +------------------+
質問は次のとおりです。利用可能なすべてのリソース(指定されたキャッシュパーティション、RAM)を使用して、svfsマウントポイントに書き込む前にできるだけ積極的かつできるだけ多くのデータをキャッシュするようにキャッシュサーバーを設定するにはどうすればよいですか?基本的には、Linuxでディレクトリをキャッシュするにはどうすればよいですか?
可能であれば、キャッシュをクラスターに書き込む必要がある場合にスループットを最大化し、レイテンシーを最小化するために、読み取りと書き込みを統合し、可能であればFUSE要求のブロックサイズを少なくとも128kにする必要があります。
補遺1:いくつかのサーバーでクラスターマウントモジュールをsvfsからS3QLに切り替えました。S3QLのキャッシュにより、パフォーマンスが少し改善されました。完全を期すために、パフォーマンスデータの取得を試みます。