Linux でストリーミング ネットワーク アプリケーションのソケット バッファ サイズを増やす正しい方法を理解しようとしています。アプリケーションは、多数の UDP ソケットでストリーミングされた可変ビットレート データを受信します。ストリームの開始時のデータ量はかなり多く、私が使用したのは次のとおりです。
# sar -n UDP 1 200
UDP スタックがパケットを破棄していることを示し、
# ss -un -pa
sysctl net.core.rmem_default
パケットが破棄される前に、各ソケット Recv-Q の長さがほぼ限界 (124928. から) に達することを示します。これは、アプリケーションがストリームの開始に追いつかないことを意味します。十分な量の初期パケットを破棄すると、データ レートが低下し、アプリケーションが追いつきます。Recv-Q は 0 に近づき、その間その状態が続きます。
rmem_default 値を大幅に大きくすることで、パケット損失に対処できます。これにより、ソケット バッファ サイズが大きくなり、アプリケーションが大きな初期バーストから回復する時間が得られます。私の理解では、これによりシステム上のすべてのソケットのデフォルトの割り当てが変更されます。グローバルなデフォルトを変更せずに、特定の UDP ソケットの割り当てを増やしたいだけです。
私の最初の戦略は、rmem_max を変更し、個々のソケットで setsockopt(SO_RCVBUF) を使用することでした。ただし、この質問は、UDP だけでなく、すべてのソケットの Linux 自動チューニングを無効にすることを懸念させます。
udp(7)は udp_mem の設定について説明していますが、これらの値が rmem_default および rmem_max の値とどのように相互作用するのか混乱しています。使用する言語は「すべてのソケット」であるため、これらの設定は個々の UDP ソケットではなく、完全な UDP スタックに適用されるのではないかと思います。
udp_rmem_min は私が探している設定ですか? 個々のソケットに適用されるようですが、システム上のすべての UDP ソケットにグローバルです。
グローバル設定を変更せずに、アプリケーションで使用される特定の UDP ポートのソケット バッファー長を安全に増やす方法はありますか?
ありがとう。