udpソケットは実際に内部でどのように動作しますか?

私は、私が作業している特定のプログラムの効率を向上させるためにパケットの操作を最小限に抑えようとしていますが、sendto/recvfromを使ってudpソケットを送信するのに苦労しています。私は2つの非常に基本的なプロセス(アプリケーション)を使用しています.1つは送信し、もう1つは受信します。

私はこれらの関数呼び出しを使用する際にLinuxが内部的にどのように動作するかを理解しています...

ここに私の観察があります: パケットを送信するとき:

  • 10Kbps、あるアプリケーションから別のアプリケーションにメッセージが移動するのにかかる時間は約28秒です。
  • 400Kbps、あるアプリケーションから別のアプリケーションにメッセージが移動するのにかかる時間は約25秒です。
  • 4Mbps、あるアプリケーションから別のアプリケーションへのメッセージの移動に要する時間は約20秒です。
  • 40Mbpsの場合、あるアプリケーションから別のアプリケーションにメッセージが移動するのにかかる時間は約18秒です。

異なるCPUを使用する場合、時間は明らかに異なり、それらの観察と一貫しています。ソケット上のトラフィックフローに応じていくつかのキューの読み込みをより高速に行うことができる設定が必要です。どのように制御できますか?

ノードを転送ノードとして使用する場合は、400Kbpsのフローを使用する場合、約8秒かかるので、できる限りこの値に収束したい。 25usは受け入れられず、遅くなっていると見なされます(これは、各パケット間の遅延よりもはるかに小さいことは明らかですが、最終的には処理するパケットの量が増えることになります。短縮する必要があります!)。 sendto/recvfromより速いものはありますか(2つの異なるアプリケーション(プロセス)を使用する必要があります、私はmonoliticブロックを使用できないことを知っているので、ソケット上で情報を送る必要があります)?

1
最大ネイティブパケットサイズを送信していますか?あなたの異なる "bps"スピードはどういう意味ですか?それはネットワーク上のパケット密度を表していますか? 18-30マイクロ秒は実際にはかなりよく聞こえます(それをどのように測定したかはわかりません)。オペレーティングシステムがデータをネットワークチップに配信するには時間がかかります。
追加された 著者 BitBank,
実際には、異なる流量(bps = bitperseconds)のiperfを使用して基本メッセージを送信しています。他のアプリケーションにパケットを送信することに興味がありますが、より高い流量を持つことによって、あるアプリケーションから他のアプリケーションへの変更が少ないため、読み書きを高速化するためのカーネル制御変数が必要です。私はこの分散をどのように説明するのか分かりません。その方法では、分布のばらつきによって説明できないのは、私が示した値が膨大なサンプル数の平均であるためです。
追加された 著者 pam_sim,
18-30私たちは良いと思うかもしれません...しかし、私は可能な限り処理時間をトリミングしようとしています。何かが欠落しているはずです。そうでなければ、各パケット間の遅延が18-30μsを超えているので、流量が何であれ同じ量の時間を取得する必要があります.....
追加された 著者 pam_sim,

答えはありません

0