每个 TCP/IP 网络连接的 Linux 内核(在内核地址空间中)平均消耗多少内存?
3 回答
对于 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
指定的三个值是“最小默认最大”缓冲区大小。所以从linux开始,每个连接都会使用默认值的读写缓冲区。随着连接数的增加,这些缓冲区将减少[最多直到指定的最小值] max buffer value 的情况也是如此。
可以使用此设置这些值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/neighbor db。最后,一旦有本地套接字,你当然有窗口大小、套接字缓冲区(发送和接收,上次我检查时默认为 128k)、片段列表(如果使用),这就是你的记忆消失了,但很难对所有使用中的部件做出明确的回答。您可以使用ss -m
获取本地流套接字的一些内存统计信息。
这取决于。在很多很多事情上。
我认为空闲连接将占用数百个字节。
但是,如果发送和/或接收数据中有数据,则消耗会增加。窗口大小可以大致限制这种消耗。
数据的额外消耗不仅仅是接收/发送队列中的字节。有开销,所以一个字节的段可能需要大约 2K。TCP 试图减少这种情况,例如通过将段合并到单个 sk_buff 中,但它并不总是成功。