首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个TCP/IP网络连接的Linux内核消耗了多少内存?

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

Stack Overflow用户
提问于 2011-12-27 23:16:27
回答 3查看 26.2K关注 0票数 36

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-05 02:55:21

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

  1. sk_buff的大小( linux内核使用的内部网络结构)
  2. 连接的读写缓冲区

缓冲区的大小可以根据需要进行调整

代码语言:javascript
复制
root@x:~# sysctl -A | grep net | grep mem

检查这些变量

它们指定内核中所有网络连接的最大缺省内存缓冲区使用量

代码语言:javascript
复制
net.core.wmem_max = 131071

net.core.rmem_max = 131071

net.core.wmem_default = 126976

net.core.rmem_default = 126976

它们指定特定于tcp连接的缓冲区内存使用情况

代码语言:javascript
复制
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。

代码语言:javascript
复制
sysctl -w net.ipv4.tcp_rmem='4096 4096 4096'

sysctl -w net.ipv4.tcp_wmem='4096 4096 4096'
票数 48
EN

Stack Overflow用户

发布于 2012-01-04 03:05:57

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

票数 2
EN

Stack Overflow用户

发布于 2011-12-27 23:24:17

那得看情况。在很多很多事情上。

我认为一个空闲的连接需要几百个字节。

但是如果在发送和/或接收数据中有数据,那么消耗就会增加。窗口大小可以大致限制这种消耗。

额外的数据消耗不仅仅是接收/发送队列中的字节。有开销,所以一个字节的数据段可能需要2K。TCP试图减少这种情况,例如通过将数据段合并到单个sk_buff中,但并不总是成功。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8646190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档