1

2 つの Linux ボックスがあり、一方のボックスでメッセージを送信し、もう一方のボックスで受信する C/C++ プログラムを作成している場合、最速の方法は何ですか?

私が耳にするさまざまなソケット/ネットワーク技術が、基礎となる技術の単なるラッパーなのか、それとも別の可能性なのかはわかりません。アプリケーションから実装できる「ベアメタル」に最も近いものを知りたいだけです。

プログラムをドライバーとして記述し、これをカーネルにロードすることを含む最速の方法を考えていました。ただし、このアイデアで使用する最速のソケット実装を知る必要があります。

4

3 に答える 3

3

最新の PC は、イーサネット チップ バッファを完全にロードした状態に保つことができるため、「ベア メタル」プログラミングは何のメリットもありません。カーネルによって追加される遅延は、ネットワークの遅延 (つまり、光の速度の制限) に比べて非常に小さいため、最適化する価値はありません。

接続された 2 つの Linux ボックス間での高帯域幅データ移動のような「高速」の場合、TCP はあなたの味方です。TCP は、自分で検出して調整する必要なく、最大のネットワーク能力に最適化するからです。直接接続では、パケット損失はごくわずかであり、一般的にレイテンシが低いため、ウィンドウ サイズなどについて心配する必要はありません。

小さなリクエストをすばやく処理するなど「高速」が必要な場合は、UDP を使用します。

「高速」の他の定義がある場合は、詳しく説明する必要があります。

于 2012-10-13T02:01:27.637 に答える
1

高速でなければならないことを除いて、要件を指定していないため、質問は不完全です。ここでは、使用するプロトコル (信頼性のための TCP、ストリーミングのための UDP など)、シリアル化 (ネットワーク経由で送信する予定のデータの種類、次のようなシリアル化ライブラリを使用できますか) など、考慮すべき多くの側面があります。 Google Protobuf?) など。

私の提案は、Apache Thrift、Apace Etch、ZeroC Ice などのさまざまな RPC フレームワークを見て、ベンチマークを行ってから、BSD ソケット API や同様の低レベルの抽象化を本当に使用する必要があると判断することです。

于 2012-10-12T23:55:34.177 に答える
1

イーサネットを介したカスタム通信用のカーネル モジュールを構築したい場合を除き、libc の最速のユーザー空間 API は Berkley Sockets API です。はい、これはカーネル TCP/IP および UDP/IP のラッパーです。これは IP 上のレイヤーであり、WWAN、LAN、およびイーサネットのレイヤーであり、他の何か上のレイヤーです。と正確なパフォーマンス、私はより低いものを使用する必要があるカーネルモジュールを書くのではなく、ユーザーランドの単純なものにとどまることをお勧めします。私が完全に間違っていない限り、ハードウェアに実際にアクセスするどころか、ユーザー空間から生のイーサネット、WWAN、または LAN にアクセスする方法はありません。

注: UNIX ネットワーク スタック全体とネットワーク カード ドライバーを数年かけて書き直す場合は、この呼び出しで root として実行すると、ユーザー空間から x86 I/O ポート アクセスを取得できますが、ioperm()UNIX ネットワーク全体を書き直すことはお勧めしません。スタック。それはほぼ20年の仕事です。また、サードパーティ製アプリケーションから直接ハードウェアにアクセスすると、セキュリティ上の問題が発生するのを待っています。

注: ネットワークに従来のハードウェアを使用しなくても問題ない場合は、両端 USB ケーブル用のカスタム ドライバーを作成し、それを介してカスタム ネットワーク プロトコルを作成することができます。おそらく、Linux USB デバイス ドライバーを作成するのが最も簡単な種類のドライバーです。 、そのための大きな API があるためです。ただし、USB 2.0 は古いイーサネット規格よりも高速であるため、ここで速度がどのように積み重なるかは本当にわかりませんが、現在は SUB 3.0 があるため、1 Gbps イーサネットが使用され始めているため、これはより高速または低速になる可能性があります。利用可能なハードウェアによって異なります。これは、使いやすさに関するものです。

編集: スピードのためにカーネルにコードを入れないでください。お願いします。マシンに設置した巨大なセキュリティ ホールは、パフォーマンスをわずかに向上させるだけの価値はありません。システムコールが非常に高価だった時代があり、最小化してカーネルに追加することがオプションでしたが、Intel のsysenter/sysexitや AMD のsyscall/などの新しい標準sysretでは、セキュリティ ホールを保証しないほど安価です。

于 2012-10-12T23:56:37.033 に答える