每个TCP / IP网络连接的Linux内核消耗了多少内存?

时间:2011-12-27 15:16:27

标签: linux memory-management tcp-ip

每个TCP / IP网络连接的Linux内核(在内核地址空间中)平均消耗多少内存?

3 个答案:

答案 0 :(得分:43)

对于TCP连接消耗的内存取决于

  1. sk_buff的大小(linux内核使用的内部网络结构)

  2. 连接的读写缓冲区

  3. 可以根据需要调整缓冲区的大小

    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
    

    指定的三个值是“min default max”缓冲区大小。 因此,从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'
    

答案 1 :(得分:2)

还取决于哪一层。在纯粹的桥接场景的情况下,只有桥级FDB。当路由发挥作用时,有路由表和IP级FDB /邻居数据库。最后,一旦本地套接字在播放中,你当然有窗口大小,套接字缓冲区(发送和接收,上次我检查它们默认为128k),片段列表(如果使用),所以这就是你的位置记忆力很强,但使用所有部件很难得出明确的答案。您可以使用ss -m获取本地流套接字的一些内存统计信息。

答案 2 :(得分:-1)

这取决于。关于很多事情。
我认为空闲连接需要几百个字节 但如果发送和/或接收数据中有数据,则消耗量会增加。窗口大小可以粗略地限制这种消耗 数据的额外消耗不仅仅是接收/发送队列中的字节。存在开销,因此具有一个字节的段可能需要2K。 TCP尝试减少这种情况,例如将段合并为单个sk_buff,但并不总是成功。