Linux下判断socket消耗多少内存的公式是什么?

Tim*_*art 11 linux memory tcp

我正在做一些容量规划,我想知道是否有一个公式可以用来预测(从内存的角度)我可以在我的服务器上处理多少 TCP 连接。目前,我只关心内存要求。

我认为会出现在公式中的一些变量是:

  • sysctl 的 net.ipv4.tcp_wmem(最小值或默认值)
  • sysctl 的 net.ipv4.tcp_rmem(最小值或默认值)
  • sock、sock_common、proto 和其他 per-socket 数据结构的大小。

我不确定实际分配了多少 tcp_wmem 和 tcp_rmem 以及何时分配了该内存。在套接字创建时?一经请求?

Mic*_*ega 8

tcp_mem 更重要,因为它定义了 tcp 堆栈在内存使用方面的行为方式。IMO 发送和接收缓冲区应该是 tcp_mem 的倍数。这是接收缓冲区公式的链接:http : //www.acc.umu.se/~maswan/linux-netperf.txt。简而言之:

开销是:window/2^tcp_adv_win_scale(tcp_adv_win_scale 默认为 2)所以对于接收窗口(tcp_rmem)的 linux 默认参数:87380 - (87380 / 2^2) = 65536。给定跨大西洋链路(150 ms RTT),最高性能最终达到:65536/0.150 = 436906 字节/秒或大约 400 KB/秒,这在今天真的很慢。随着默认大小的增加:(873800 - 873800/2^2)/0.150 = 4369000 字节/秒,或大约 4 兆字节/秒,这对于现代网络来说是合理的。请注意,这是默认设置,如果发送方配置了更大的窗口大小,它会很高兴地扩展到这个大小的 10 倍 (8738000*0.75/0.150 = ~40Mbytes/s),对于现代网络来说非常好。

以下是关于 tcp_mem 的文章:

您删除的是对 tcp 性能的人为限制,如果没有该限制,您将受到可用的端到端带宽和损耗的限制。因此,您最终可能会更有效地使上行链路饱和,但 tcp 擅长处理此问题。

IMO 较大的中间 tcp_mem 值会在降低安全性的情况下加快连接速度,并略微增加内存使用率。

您可以通过以下方式监控网络堆栈:

grep skbuff /proc/slabinfo
Run Code Online (Sandbox Code Playgroud)


Mic*_*lon 2

如果您可以修改源代码,则使用 rusage 数据来测量 RSS 并记录测量时正在使用的 TCP 连接数。

如果无法更改源代码,则使用top或ps报告的网络应用程序的RSS,并从 中获取测量时的网络连接数lsof -i

当您的应用程序经历峰值负载时,每分钟收集一次此数据,并根据该数据您可以得出一个将连接数与 RAM 使用情况联系起来的公式。

当然,还有很多东西可以测量,特别是您可能想要测量内核 RAM 使用情况,尽管 tcp 数据结构应该是可以提前预测和计算的。无论如何,请查看这个问题https://serverfault.com/questions/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server有关 TCP 调整和的更多信息如何清楚地了解网络堆栈中发生的情况。