小编Mik*_*her的帖子

如何判断 TCP 缓冲区实际使用了多少内存?

我有一台前端机器,它有大约 1k 个持久的、非常低带宽的 TCP 连接。它有点内存受限,所以我试图弄清楚几百 MB 的去向。TCP 缓冲区是一个可能的罪魁祸首,但我无法回答这些问题:

  1. 内存报告在哪里?它是 中buff/cache项目的top一部分,还是流程RES指标的一部分?
  2. 如果我想在每个流程级别上减少它,我如何确保我的减少达到预期的效果?
  3. 即使流量最小,缓冲区是否会继续占用一些内存,或者它们是否动态增长,缓冲区大小只是允许的最大大小?

我意识到一个可能的答案是“相信内核会为你做这件事”,但我想排除 TCP 缓冲区作为内存压力的来源。

调查:问题 1

该页面写道,“‘缓冲区’内存是 Linux 用于缓冲网络和磁盘连接的内存。” 这意味着,他们不是的部分RES指标在top

找到实际的内存使用情况,/proc/net/sockstat是最有希望的:

sockets: used 3640
TCP: inuse 48 orphan 49 tw 63 alloc 2620 mem 248
UDP: inuse 6 mem 10
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
Run Code Online (Sandbox Code Playgroud)

是我能找到的最好的解释,但mem没有在那里解决。它在此处解决,但 248*4k ~= 1MB,或大约系统范围最大值的 1/1000,对于具有数百个持久连接和持续 .2-.3Mbit/sec 网络流量的服务器来说,这似乎是一个低得离谱的数字.

当然,系统内存限制本身是:

$ grep …
Run Code Online (Sandbox Code Playgroud)

tcp

16
推荐指数
2
解决办法
4万
查看次数

标签 统计

tcp ×1