内存 占用过高
大部分情况下进程本身并不会占用太多内存, 但是每个 TCP / UDP 连接需要内存
场景
部分用户可能会开多线程下载导致转发机器内存爆炸, 这种基本上是 TCP 缓冲区导致的内存爆满
可以使用以下命令查看有问题的 TCP 连接
# 二选一即可
ss -nt | awk 'NR==1 || ($1 == "ESTAB" && ($2 > 0 || $3 > 0))'
netstat -nt | awk 'NR==1 || ($6 == "ESTABLISHED" && ($2 > 0 || $3 > 0))'
这里以
0
为判断依据, 实际应用中只有当值特别大时才能说明这个连接有问题 (大概率为1000000
以上)
接下来查看系统内所有连接吃掉的总内存大小
查看
/proc/net/sockstat
文件, 其中的mem
字段值是一个整数, 表示已分配的套接字缓冲区的数量, 以页面为单位 (页面的大小通常是系统的页面大小 例如4KB
)
cat /proc/net/sockstat # IPv4
cat /proc/net/sockstat6 # IPv6
如果这个 mem
值特别高就说明系统内存在异常连接!
解决方案
-
调整系统 TCP 缓冲区大小 (TCP 窗口)
可能会导致单线程速度降低