对于每个TCP/IP网络连接,Linux内核(在内核地址空间中)平均消耗多少内存?
发布于 2012-01-05 02:55:21
对于TCP连接,所消耗的内存取决于
缓冲区的大小可以根据需要进行调整
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将对每个连接使用缺省值read和write buffer。随着连接数量的增加,这些缓冲区将最多减少,直到指定的最小值与最大缓冲值的情况相同。
可以使用此sysctl -w KEY=KEY VALUE设置这些值
例如:下面的命令确保每个连接的读写缓冲区分别为4096。
sysctl -w net.ipv4.tcp_rmem='4096 4096 4096'
sysctl -w net.ipv4.tcp_wmem='4096 4096 4096'发布于 2012-01-04 03:05:57
还取决于哪一层。在纯桥接的情况下,只有桥接级的FDB。当路由开始发挥作用时,有路由表和IP级FDB/邻居数据库。最后,一旦有了本地套接字,当然还有窗口大小、套接字缓冲区(发送和接收,上次我检查时都默认为128k )、片段列表(如果使用),所以这就是你的内存所在,但是很难用所有正在使用的部分来做出明确的答案。您可以使用ss -m来获取本地流套接字的一些内存统计信息。
发布于 2011-12-27 23:24:17
那得看情况。在很多很多事情上。
我认为一个空闲的连接需要几百个字节。
但是如果在发送和/或接收数据中有数据,那么消耗就会增加。窗口大小可以大致限制这种消耗。
额外的数据消耗不仅仅是接收/发送队列中的字节。有开销,所以一个字节的数据段可能需要2K。TCP试图减少这种情况,例如通过将数据段合并到单个sk_buff中,但并不总是成功。
https://stackoverflow.com/questions/8646190
复制相似问题