アプリケーションが最大 TCP バッファ制限を利用するには、SO_SNDBUF と SO_RCVBUF を指定した setsockopt が必要ですか?
ホスト間に 100 ミリ秒の遅延がある 1 Gbps ネットワークがあり、カスタム クライアント サーバー C プログラムを使用してホスト間で全速力でデータを送り込もうとしています。
wmem_max、rmem_max に 124928 という小さな値を設定し、tcp_rmem と tcp_wmem の 3 番目の列に同じ値を指定してデフォルトのホスト設定を使用すると、スループットが 80Mbps に低下しました
次のように最大値を 124928 から 12582912 に変更した後、1Gbps のはるかに優れたスループットが得られました。
ソースホストとターゲットホストの現在の設定は
[root@~]# cat /proc/sys/net/core/wmem_default
124928
[root@ ~]# cat /proc/sys/net/core/rmem_default
124928
[root@~]# cat /proc/sys/net/core/wmem_max
125829120
[root@~]# cat /proc/sys/net/core/rmem_max
125829120
[root@~]# cat /proc/sys/net/ipv4/tcp_rmem
10240 87380 125829120
[root@~]# cat /proc/sys/net/ipv4/tcp_wmem
10240 87380 125829120
プログラムで setsockopt() を使用して、sysctl 設定の最大制限を利用しませんでした。setsockopt と sysctl のメモリ設定に関する私の理解では、デフォルトではすべてのプログラムが mem_default で定義されているメモリ バッファを取得し、setsockopt() 呼び出しを使用して mem_max 値まで上げることができます。しかし、setsockopt() 呼び出しを使用しなくても最大制限に達する可能性があることに混乱しています。大きなメモリ バッファを使用するように setsockopt を使用して構成されていないソケットでも、TCP は mem_max 設定を動的に使用するように自動的に調整されますか?
tcpdump の出力から、ソースの (seq-ack) が常に 50MB 程度残っていることを確認しました。これは、TCP ウィンドウが sysctl 設定のデフォルト値よりも大きいことを示しています。