内存 占用过高

大部分情况下进程本身并不会占用太多内存, 但是每个 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 窗口)

    可能会导致单线程速度降低

  • 启用 自动杀死内存占用过高的 TCP 连接 插件