Gateway进程中的connections数一直在上涨,但实际上没有新的客户端加进来。

JoeZing

做了集群,Gateway和Register是在同一台服务器上,BuinessWorker单独一台服务器,都是局域网,
Gateway起了2个进程,
BuinessWorker起了8个进程,
我们的客户端数量是可数的,也就2千不到,但启动服务后,status 中的 connections一直在慢慢增长,
于是我在Gateway服务中onWebSocketConnect写了日志看是否是客户端的问题导致的重复连接,发现并没有新的连接数,但connections一直在涨,基本上每2秒涨1个,甚至一下子涨了10几个连接数,慢慢的,服务器连接数上去后,导致客户端掉线,目前几台服务器iptables都是关了的;

1,请问连接数狂涨是什么情况?
2,另外我发现客户端端口后,不会走onClose方法?

/etc/sysctl.conf:

fs.file-max=65535
net.ipv4.tcp_max_tw_buckets = 20000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_max_syn_backlog = 262144
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 65535
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 1 
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_syncookies = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65000
net.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_established = 3600

/proc/进程/limit:

Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            10485760             unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             65535                65535                processes 
Max open files            65535                65535                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       15233                15233                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us  

ulimit -a:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15233
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 65535
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
3821 3 0
3个回答

walkor

长链接应用必须加心跳
长链接应用一定要加心跳,一定要加心跳,一定要加心跳。重要的话说三遍,不加心跳就是找死。

可以使用这个心跳配置

$gateway = new Gateway("Websocket://0.0.0.0:8585");
$gateway->pingInterval = 30;
$gateway->pingNotResponseLimit = 1;
$gateway->pingData = '';

心跳原理相关参考 http://doc2.workerman.net/326139

链接增多的原因
你的情况应该是客户端与服务端的长链接长时间不通讯被路由节点防火墙给清理了(或者是断网断电等极端情况关闭链接),导致链接断开,这种情况服务端无法检测到链接已经断开(因为没有给服务端发送fin包),需要用心跳来检测链接是否断开,比如上面的配置30秒收不到客户端心跳就关闭链接。

由于链接被防火墙清理或者断网断电等异常断开,服务端又不知道链接已经断开,导致linux内核认为这些链接都是有效的,会一直保持这些链接,但是实际上这些链接都是死链接,周而复始,死链接越来越多。

另外超过1000的并发连接数都需要http://doc.workerman.net/315302,而且必须装http://doc.workerman.net/315116,不然也会出现类似问题

  • JoeZing 2017-05-25

    心跳是加了的,30秒,防火墙是关了的

  • walkor 2017-05-25

    $gateway->pingNotResponseLimit = 1; 设置下,不然会有死链接

  • JoeZing 2017-05-25

    @1:可以大于1么

  • walkor 2017-05-25

    可以设置成2,太大了不灵敏。

  • JoeZing 2017-05-25

    请问下死链接这个问题要怎么排查?

  • walkor 2017-05-25

    服务端运行命令
    netstat -nt | grep ESTABLISHED | grep 端口号 | awk '{print $5}' | awk -F : '{print $1}' | sort | uniq -c | sort -rn
    其中端口号换成实际的gateway端口。
    结果类似

     79 221.226.97.95
     28 223.74.34.15
     21 116.192.14.116
     12 218.97.247.118
     10 47.90.103.189
     10 119.129.70.195
      8 39.88.21.160

    前面数字代表链接数,后面数字代表是那个ip连来的

    这样能看到哪个ip的链接最多,然后去找对应ip的客户端看看是否连了这么多链接。

walkor

当然也不排除客户端有bug,客户端不断的发起新的链接。
之前就遇到过这样的案例

xinxing

比较经典的一句话就是如果该连接被防火墙杀死,那么服务器并不会关闭它。

  • 暂无评论
年代过于久远,无法发表回答
🔝