我有一台前端机器,它有大约 1k 个持久的、非常低带宽的 TCP 连接。它有点内存受限,所以我试图弄清楚几百 MB 的去向。TCP 缓冲区是一个可能的罪魁祸首,但我无法回答这些问题:
buff/cache
项目的top
一部分,还是流程RES
指标的一部分?我意识到一个可能的答案是“相信内核会为你做这件事”,但我想排除 TCP 缓冲区作为内存压力的来源。
该页面写道,“‘缓冲区’内存是 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 ×1