2

RTPを受信するC++プログラムでパケット損失の問題をデバッグしています。私のプログラムは、大量のRTPデータを受信して​​かなり長い間実行された後、パケットを失い始めます。

Wiresharkでトレースすると、欠落しているパケットが表示されますが、アプリケーションがそれらを受信することはありません。ネットワークスタックは、それらをアプリケーションに配信する前にそれらをドロップするようです。アプリケーションを再起動すると、すべてが正常に戻ります。

エラー状態を生成するために、RTPでマシンを過負荷にすると、その時点でパケット損失が発生しますが、これには正当な理由があります。しかし、過負荷を停止して適度な速度で送信を開始した後でも、パケット損失が発生するため、すべてのデータを再度受信するには、アプリケーションを再起動する必要があります。

これはLinuxの受信バッファ処理の問題ですか?欠落しているパケットがどこに行くかを確認するために、どのLinux統計を確認できますか?

4

1 に答える 1

4

UDP 入力を十分な速度で消費していません。これを軽減するために実行する通常の手順を次に示します。

  • recvmmsg(2)システムコールのオーバーヘッドを減らすために、カーネルがサポートしている場合に切り替えます。
  • 入力処理中に使用されるすべてのメモリを事前に割り当てます。
  • アプリのプロファイルを作成し、ホット スポットを見つけて最適化し、
  • 処理を別のスレッドにファームするかもしれませんが、ロック スコープをできるだけ小さく保ちます。
  • ソケットの受信バッファを増やします( setsockopt(2))。
于 2012-12-18T14:05:33.423 に答える