3

Mono (実際には .NET も) を "ハッキング" するためのちょっとしたアドバイスを探しています。

コンテキスト: Isis2 ライブラリ (Isis2.codeplex.com) の一部として、適切な種類のハードウェア (Infiband NIC) を備えたマシン上でメモリ マップト ファイルの非常に高速な「ゼロ コピー」レプリケーションをサポートしたいと考えています。 UDP を使用した標準イーサネット。セットアップは次のとおりです。一連のプロセス {A,B....} がすべて Isis2 にリンクされており、一部のメンバー (おそらく A) が大きなメモリ マップ ファイルを持ち、それを F と呼び、Isis2 にお願いします。 F を B、D、G、および X に再複製します。ライブラリは、多くの同時イニシエーターによる大量の使用があっても、これを非常に効率的かつ非常に迅速に行います。アイデアは、ビッグデータ アプリケーションを実行している HPC およびクラウド デベロッパーにこれを提供することです。

現在、Isis2 は .NET 上の C# でコーディングされており、Mono を介して Linux にクロスコンパイルされます。.NET と Mono の両方が管理されているため、どちらもネットワーク I/O のゼロコピーを許可したくありません。通常のモデルでは、「データを管理対象の byte[] オブジェクトにコピーし、SendTo または SendAsync を使用して送信します。受信、同じ取引: Receive または ReceiveAsync を byte[] オブジェクトに変換してから、ファイル内のターゲットの場所にコピーします。" これは、ハードウェアが維持できる速度よりも遅くなります。

.NET では、通常のメモリ保護を回避できることがわかりました。私は独自のマップされたファイル ラッパーを作成しました (実際には、コロンビアの研究者によって数年前に投稿されたものに基づいています)。Win32Kernel.dll ライブラリを取得し、Win32 メソッドを使用してファイルをマップし、ソケットの Send および Receive 呼び出しなどを開始します。少しハッキングするだけで、この方法で .NET 非同期 I/O を模倣できます。かなりクリーンで完全に C# でコード化されており、.NET が安全でないコードとして認識するものは何もありません。マップされたファイルを大きな管理されていないバイト配列として扱い、不要なコピーをすべて回避します。明らかに、Isis2 ユーザーからこれらすべてを保護します。彼らは知りません。

ここで、私の質問の核心に到達します。Linux では、Win32 カーネル dll が存在しないため、明らかにロードできません。そのため、コア Linux O/S 呼び出しを使用していくつかの基本機能を実装する必要があります。fmap() 呼び出しはファイルをマップします。Linux にも独自の形式の非同期 I/O があります。Infiniband の場合は Mellanox の Verbs ライブラリを使用し、UDP の場合は生の IP 送信と完了時のシグナル (「割り込み」) を使用します。醜いですが、これを機能させることができると思います。繰り返しますが、Isis2 自体のコードをクリーンにするために、これらすべてをラップして、標準の非同期 Windows 非同期 I/O にできるだけ似せて、管理されていない安全でない混乱全体をエンド ユーザーから隠します。

一度に 1 ギガバイトほどをチャンクで送信するので、重要な目標の 1 つは、順番に送信されたデータが、理想的には非同期受信を投稿した順序で受信されるようにすることです。明らかに、信頼できないコミュニケーションについて心配する必要があります (データがドロップされてしまい、コピーする必要があります)。しかし、何もドロップされない場合は、送信する n 番目のチャンクが n 番目の受信領域になるようにします...

だからここに私の質問があります:誰かがすでにこれをやったことがありますか?.NET が頻繁に使用する非同期 I/O 呼び出しを Mono がどのように実装するかについてのヒントはありますか? きっと同じようにすればいいのに。そして、最小限の痛みでこれを行う方法について誰かアドバイスはありますか?

もう 1 つ質問があります。Win32 では、マップされたファイルは 2Gb に制限されています。クラウド システムでは、多くの場合、Win64 が実行されます。Win64 を実行しているユーザーが Win64 を最大限に活用できるようにしながら、相互運用性を最大化する方法について何か提案はありますか? (一種の O/S 反映の問題...)

4

0 に答える 0