2012-01-02 16 views
1

私は、メッセージパッシングで最高のパフォーマンスとスケーリングのためのリソースを探していました。参照の代わりに値渡しのメッセージは、NUMAスタイルの設定や、指定されたメモリアドレスの競合を減らしてうまくいくため、スケーラビリティが向上すると聞きました。スレッド - メッセージ受け渡し

値に基づくメッセージの受け渡しは、「より小さい」メッセージでのみ動作すると仮定します。 「より小さい」とは何が定義されますか?参考になるのはどんな時でしょうか?誰かがこのようにストリーム処理をしますか?

私はこれらの種類の質問に役立つヒントやリソースを探しています。

ありがとう:-)

P.S.私はC#で働いていますが、私はこの種の設計上の問題についてはそれほど重要ではないと思います。

+0

にネットのデータフローと比較されますかわかりませんか? SMP、NUMA、クラスタ? – Tudor

+0

現在私は現在解決している問題はありませんが、もしあれば私はSMP + NUMAシステムを対象としています。 – Bengie

+0

これらの質問に対する唯一の十分な短い答えは、「それは依存する」と考えています。これらの質問に対する唯一の十分な答えは、「ターゲットシステムのさまざまなオプションをベンチマークし、 "パフォーマンスは、実行しているシステムのアーキテクチャ上の詳細に非常に(多くの場合は逆に直観的に)依存するため、システム全体に信頼性をもって適用できる一般的なルールはあまりありません。とにかく、あなたはあなたのアプリでそれを測定しなければあなたが受け取った答えを信じてはいけません。 –

答えて

3

ジェレミーの優れた助言に追加するいくつかの要因:

1)は値渡しがわずかなメッセージのために効率的に動作します。データの先頭に[cache-line-size]未使用領域があり、誤った共有を避ける場合は、参照渡しが効率的なサイズに既に近づいています。

2)キューが広くなると、キューが占めるスペースが増え、メモリ使用量に影響します。

3)ワイド・キュー構造に/からデータをコピーするには時間がかかります。データの移動中の実際のCPU使用以外にも、キューはコピー中にロックされたままです。これにより、キュー上の競合が増え、キュー幅に依存する全体的なパフォーマンス・ヒットにつながります。コードにデッドロックの可能性がある場合、長期間ロックを保持しても問題は解決しません。

4)値渡しは、データサイズに固有のコードにつながります。コンパイル時に固定されます。テンプレートの厄介な感染とは別に、実行時にバッファサイズなどを調整することは非常に困難です。

5)メッセージが参照渡しとmalloced/freed/newed/deployed/GC'dによって渡された場合、メモリマネージャと頻繁で無駄なGCに対する過剰な競合が発生する可能性があります。私は通常、これを避けるために、起動時に割り当てられたメッセージの固定プールを使用します。

6)参照渡し時にバイトストリームを扱うのが厄介なことがあります。バイトストリームが1バイトの頻繁な配信によって特徴付けられる場合、参照渡しはバイトがチャンクアップされている場合にのみ有効です。これにより、部分的に満たされたメッセージがタイムリーに次のスレッドに確実にディスパッチされるように、タイムアウトが必要になることがあります。これは、複雑さと待ち時間をもたらす。

7)参照渡しの設計は、本質的に漏れやすくなります。これはテスト時間の延長やvalgrindの過剰投与(特に苦しい中毒)につながります(固定サイズのメッセージオブジェクトプールを使用する別の理由)。

8)複雑なメッセージ、たとえば。他のオブジェクトへの参照を含むものは、価値によって渡された場合、所有権と生涯管理の面倒な問題を引き起こす可能性があります。例 - サーバーソケットオブジェクトは、さまざまなサイズのバッファインスタンスの配列(IOCPサーバーの実際の例)を含むバッファリストオブジェクトへの参照を持ちます。値で渡してみてください。

9)多くのOS呼び出しでは、ポインタ以外は処理できません。あなたはPostMessage(それはWindows APIです)、1回の呼び出しで値で256バイトの構造さえできません(2つのwParam、lParamの整数だけです)。非同期コールバックを設定するコールでは、コンテキストデータがコールバックに送信されることがよくあります。このようなOS機能を使用しようとするアプリケーションは、ほとんどの場合、参照渡しに頼らざるを得ません。

0

マーティン・ジェイムスのポイントも良いですが、ジェレミー・フリズナーのコメントはこれが新しいエリアであると思われます。マイクロソフトは、コアを増やすにつれて、将来のカーネルにメッセージを送ることを検討していることを知っています。

メッセージの受け渡しを扱うフレームワークが存在し、現在の.Netプロデューサ/コンシューマジェネリックスよりもはるかに優れたパフォーマンスを持つと主張しています。私はそれはあなたがどのようなアーキテクチャを使用している4.5

https://github.com/odeheurles/Disruptor-net

関連する問題