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

     2023-02-21     186

关键词:

【中文标题】每个 TCP/IP 网络连接的 Linux 内核消耗多少内存?【英文标题】:How much memory is consumed by the Linux kernel per TCP/IP network connection? 【发布时间】:2012-01-28 14:12:57 【问题描述】:

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

【问题讨论】:

你能更详细地描述一下情况吗?没有它,任何人都能给出的最佳估计值将是“1K 到 10M 之间”之类的东西,这对你没有多大帮助。我假设您的意思是 TCP/IP 连接,其中一端(服务器?)是您的机器。你能假设连接当前是空闲的,或者至少它没有挂起(即一切都在合理的时间内被确认)? 【参考方案1】:

对于一个 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开始,每个连接都会使用默认值的读写缓冲区。 随着连接数的增加,这些缓冲区将减少[最多直到指定的最小值] 最大缓冲区值也是如此。

可以使用sysctl -w KEY=KEY VALUE 设置这些值

例如。下面的命令确保每个连接的读写缓冲区都是 4096。

sysctl -w net.ipv4.tcp_rmem='4096 4096 4096'

sysctl -w net.ipv4.tcp_wmem='4096 4096 4096'

【讨论】:

【参考方案2】:

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

【讨论】:

你能解释一下ss -m输出中的4个字符(r、w、f、t)吗?【参考方案3】:

这取决于。在很多事情上。 我认为空闲连接将占用数百个字节。 但是,如果发送和/或接收数据中有数据,则消耗会增加。窗口大小可以大致限制这种消耗。 数据的额外消耗不仅仅是接收/发送队列中的字节。有开销,所以一个字节的段可能需要大约 2K。 TCP 试图减少这种情况,例如通过将段合并到单个 sk_buff 中,但它并不总是成功。

【讨论】:

linux下的socket网络编程tcp/ip(代码片段)

网络学习过linux后了解到,在linux系统下的网络编程很有意思,在此,先要说一下TCP/IP,它是一个面向连接且可靠的一组协议,并且是全双工通信。它的存在使得网络世界缤纷多彩。linux内核将会提供一系列函... 查看详情

更新 GNU/Linux 内核以每个数据包发送 n 个 TCP 数据包

】更新GNU/Linux内核以每个数据包发送n个TCP数据包【英文标题】:UpdatingtheGNU/LinuxKernaltosendnnumberofTCPpacketsperpacket【发布时间】:2019-02-1404:05:46【问题描述】:我正在使用基于Debian的发行版(LinuxMint18)。我想对操作系统进行更改,... 查看详情

netstat备忘清单_开发速查表分享

...示端口80上的活动连接数仅显示外部IP地址显示活动SYNC_REC每个远程IP的连接数检查开放端口(ipv4和ipv6)检查开放端口(ipv4和ipv6)每个IP的打开连接数活跃的互联网连接 查看详情

linuxnetstat详解

 Linuxnetstat命令用于显示网络状态。利用netstat指令可让你得知整个Linux系统的网络情况。在InternetRFC标准中,Netstat的定义是:Netstat是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存... 查看详情

linux内核tcp/ip协议栈运行时序|配图

TCP/IP协议栈在Linux内核中的运行时序分析【万字长文】               查看详情

tcp/ip(网络通讯协议)

...系列处理数据通信的协议:tcp、udp、icmp、dhcp ip负责将每个包路由至它的目的地.(网络层)tcp用于应用程序之间的通信,负责处理ip包.(传输层) RFC是tcp/ip协议的标准文档.tcp/ip,又名:网络通讯协议 查看详情

linux里面netstat-ntlp命令作用是啥?

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。参考技术Anetstat-显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组-ntlp表示显... 查看详情

linux网络设置

我在VM上装了一个红旗linux6.0系统,可是网络老是连接不上哎,设置固定IP显示已连接,但打不开网站,使用DHCP网络又直接打叉,到底该怎么设置?我说明下我的网络环境:猫一个,路由器一个,电脑一台,路由网关192.168.100.100... 查看详情

网络调优

 关于网络调优,尤其是TCPTuning(你可以以这两个关键词在网上找到很多文章),这里面有很多很多东西可以说。看看Linux下TCP/IP的那么多参数就知道了(顺便说一下,你也许不喜欢Linux,但是你不能否认Linux给我们了很多可以... 查看详情

linux网络协议栈开发基础篇——使用wireshark分析tcp/ip协议中tcp包头的格式

...(TCP把数据看成是有序的字节流,TCP隐式地对数据流的每个字节进行编号)。这样理解可能更直观&#x 查看详情

linux网络协议栈开发基础篇——使用wireshark分析tcp/ip协议中tcp包头的格式

...(TCP把数据看成是有序的字节流,TCP隐式地对数据流的每个字节进行编号)。这样理解可能更直观&#x 查看详情

tcp/ip简记

...传输互联网协议规定了数据(包)的发送从上层到下层,每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,明确标明了协议应该如何读取数据。数据的接收则从下层到上层,每个分层中,都... 查看详情

linux网络协议栈开发基础篇(十三)——tcp/ip协议各报文头格式

一、TCP报文    TCP是TCP/IP体系中面向连接的运输层协议,提供全双工的和可靠交付的服务。TCP报文段的格式如下图所示源端口和目的端口:各占2个字节,是运输层与应用层的服务接口。序号:占4个字节。TCP连接... 查看详情

一般优化linux的内核,需要优化啥参数

...4、默认的TCP发送窗口大小5、最大的TCP数据发送窗口6、在每个网络接口接收数据包的速率比内核处理这些包速率快时,允许送到队列的数据包最大数目7、定义了系统中每一个端口最大的监听队列长度8、探测消息未获得相应时,... 查看详情

每天一个linux命令(netstat)

...能:1.监控TCP/IP网络2.显示路由表、实际的网络连接以及每个网络接口设备的状态信息3.查询端口 主要参数:-a:列出所有端口[[email protected]~]#netstat-aActiveInternetconnec 查看详情

如何添加共享打印机

...物理连接网卡是网络连接的基本设备,在桌面计算机中,每个网卡后面的指示灯应该是亮的,这表示连接是正常的。如果不亮,请检查集线器或交换机是打开的,而且每个客户端连接的指示灯都是亮的,这表示链接是正常的。接... 查看详情

关于linux内核的tcpip网络框架实现

关于linux内核的tcpip网络框架实现上图是linux内核的tcpip网络框架实现需要注意的是,linux采用函数指针的方式来模拟“面向对象”概念的动态函数绑定。所以需要仔细看上面的函数指针实际指向的函数,才能知道上面的tcp、ip的函... 查看详情

tcp/ip的底层队列是如何实现的?(代码片段)

...的IO模型。Linux中网络处理都用同步阻塞的方式,也就是每个请求都分配一个进程或者线程,那么要支持1万并发,难道就要使用1万个线程处理请求嘛?这1万个线程的调度、上下文切换乃至它们占用的内存,都会成为瓶颈。解决C1... 查看详情