web-dev-qa-db-ja.com

TCP / IPネットワーク接続ごとに、Linuxカーネルによってどのくらいのメモリが消費されますか?

TCP/IPネットワーク接続ごとに、平均でどのくらいのメモリがLinuxカーネルによって(カーネルアドレス空間で)消費されますか?

30
user811773

TCPの場合、消費される接続メモリは

  1. sk_buffのサイズ(Linuxカーネルで使用される内部ネットワーク構造)

  2. 接続の読み取りおよび書き込みバッファ

バッファのサイズは必要に応じて調整できます

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'
44
daya

また、どのレイヤーに依存します。純粋なブリッジングシナリオの場合、ブリッジレベルのFDBだけがあります。ルーティングが機能するようになると、ルーティングテーブルとIPレベルのFDB /ネイバーデータベースがあります。そして最後に、ローカルソケットがプレイされると、当然、ウィンドウサイズ、ソケットバッファー(送信と受信の両方、および前回チェックしたときにデフォルトで128k)、フラグメントリスト(使用されている場合)があります。記憶は行きますが、使用中のすべての部品で明確な答えを出すのは困難です。 ss -mを使用して、ローカルストリームソケットのいくつかのメモリ統計を取得できます。

2
jørgensen

場合によります。多くのことについて。
アイドル接続には数百バイトかかると思います。
しかし、送信および/または受信データにデータがある場合、消費量は増加します。ウィンドウサイズは、この消費を大まかに制限できます。
データの余分な消費は、受信/送信キューのバイトだけではありません。オーバーヘッドがあるので、1バイトのセグメントは2Kのようなものになります。 TCPは、たとえばセグメントを1つのsk_buffにマージすることでこれを削減しようとしますが、常に成功するとは限りません。

0
ugoren