做了集群,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
长链接应用必须加心跳
长链接应用一定要加心跳,一定要加心跳,一定要加心跳。重要的话说三遍,不加心跳就是找死。
可以使用这个心跳配置
$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,不然也会出现类似问题
心跳是加了的,30秒,防火墙是关了的
$gateway->pingNotResponseLimit = 1; 设置下,不然会有死链接
@1:可以大于1么
可以设置成2,太大了不灵敏。
请问下死链接这个问题要怎么排查?
服务端运行命令
netstat -nt | grep ESTABLISHED | grep 端口号 | awk '{print $5}' | awk -F : '{print $1}' | sort | uniq -c | sort -rn
其中端口号换成实际的gateway端口。
结果类似
前面数字代表链接数,后面数字代表是那个ip连来的
这样能看到哪个ip的链接最多,然后去找对应ip的客户端看看是否连了这么多链接。
当然也不排除客户端有bug,客户端不断的发起新的链接。
之前就遇到过这样的案例
这种也是加心跳包就可以解决的吗
不能
比较经典的一句话就是如果该连接被防火墙杀死,那么服务器并不会关闭它。