Answers:
如果您可以修改源代码,则使用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调整和如何清楚地了解网络堆栈中正在发生的事情。
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