TCP/IPネットワーク接続ごとに、平均でどのくらいのメモリがLinuxカーネルによって(カーネルアドレス空間で)消費されますか?
TCPの場合、消費される接続メモリは
sk_buffのサイズ(Linuxカーネルで使用される内部ネットワーク構造)
接続の読み取りおよび書き込みバッファ
バッファのサイズは必要に応じて調整できます
root@x:~# sysctl -A | grep net | grep mem
これらの変数を確認してください
これらは、カーネル内のすべてのネットワーク接続の最大デフォルトメモリバッファー使用量を指定します
net.core.wmem_max = 131071
net.core.rmem_max = 131071
net.core.wmem_default = 126976
net.core.rmem_default = 126976
これらは、TCP接続に固有のバッファメモリ使用量を指定します
net.ipv4.tcp_mem = 378528 504704 757056
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 87380 4194304
指定された3つの値は、「最小デフォルト最大」バッファーサイズです。そのため、Linuxで開始するには、接続ごとに読み取りおよび書き込みバッファのデフォルト値を使用します。接続数が増えると、これらのバッファーは[指定された最小値まで]減少します。最大バッファー値の場合も同様です。
これらの値は、これを使用して設定できますsysctl -w KEY=KEY VALUE
例えば。以下のコマンドは、各接続の読み取りおよび書き込みバッファーがそれぞれ4096であることを確認します。
sysctl -w net.ipv4.tcp_rmem='4096 4096 4096'
sysctl -w net.ipv4.tcp_wmem='4096 4096 4096'
また、どのレイヤーに依存します。純粋なブリッジングシナリオの場合、ブリッジレベルのFDBだけがあります。ルーティングが機能するようになると、ルーティングテーブルとIPレベルのFDB /ネイバーデータベースがあります。そして最後に、ローカルソケットがプレイされると、当然、ウィンドウサイズ、ソケットバッファー(送信と受信の両方、および前回チェックしたときにデフォルトで128k)、フラグメントリスト(使用されている場合)があります。記憶は行きますが、使用中のすべての部品で明確な答えを出すのは困難です。 ss -m
を使用して、ローカルストリームソケットのいくつかのメモリ統計を取得できます。
場合によります。多くのことについて。
アイドル接続には数百バイトかかると思います。
しかし、送信および/または受信データにデータがある場合、消費量は増加します。ウィンドウサイズは、この消費を大まかに制限できます。
データの余分な消費は、受信/送信キューのバイトだけではありません。オーバーヘッドがあるので、1バイトのセグメントは2Kのようなものになります。 TCPは、たとえばセグメントを1つのsk_buffにマージすることでこれを削減しようとしますが、常に成功するとは限りません。