确定Linux下套接字消耗多少内存的公式是什么?


11

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

我认为公式中会显示一些变量:

  • sysctl net.ipv4.tcp_wmem(最小值或默认值)
  • sysctl net.ipv4.tcp_rmem(最小值或默认值)
  • sock,sock_common,proto和其他按套接字数据结构的大小。

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

Answers:


2

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

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

在应用程序通过峰值负载时,每分钟收集一次此数据,然后您可以从这些数据中得出一个将连接数与RAM使用率相关联的公式。

当然,您还可以测量更多的事情,特别是您可能要测量内核RAM的使用情况,尽管tcp数据结构应该预先可预测和可计算。无论如何,请查看以下问题/server/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server以获得有关TCP调整和如何清楚地了解网络堆栈中正在发生的事情。


感谢您强调测量并向我指出显示如何收集这些指标的链接!
蒂姆·斯图尔特

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字节/秒,或大约4Mbytes / s,这对于现代网络是合理的。请注意,这是默认设置,如果发送方配置了较大的窗口大小,它将很高兴地扩展到此大小的10倍(8738000 * 0.75 / 0.150 =〜40Mbytes / s),对于现代网络而言,这是相当不错的。

这是关于tcp_mem的文章:

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

IMO较大的中间tcp_mem值会加快连接速度,但会降低安全性,并会稍微增加内存使用量。

您可以使用以下方法监视网络堆栈:

grep skbuff /proc/slabinfo

1
感谢您提供的信息。它显示了我需要学习多少知识。
蒂姆·斯图尔特

1

David为所提出的问题提供了很好的答案,但是,除非您仅使用LFN,否则即使在基于事件的服务器上,TCP缓冲区也可能仅占每个连接占用空间的一小部分。

对于容量规划,没有替代方法可以测试服务器并按负载计算内存使用量的回归。


谢谢,用一个简单的公式就能达到很好的效果,但是有时候您只需要测量。
蒂姆·斯图尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.