我们的应用程序是使用CometProcessor开发的,用于提供长期连接。
但是,在建立多个连接然后丢弃之后(在任何时候,只有200个连接正在运行)。 Tomcat将停止响应新请求。
这是 server.xml
中的配置%.d
Tomcat以以下 JAVA_OPTS
开始<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" acceptCount="50" processorCache="50" connectionTimeout="20000" keepAliveTimeout="20000" maxKeepAliveRequests="-1" maxThreads="500" acceptorThreadCount="2" maxConnections="-1" redirectPort="8443" />
服务器具有 3.7GB RAM和2个CPU核心。
当发生这种情况时,我们也看到许多TCP连接进入CLOSE_WAIT状态。
-Djava.awt.headless=true -Xms512m -Xmx3072m -XX:MaxNewSize=768m -XX:MaxPermSize=192m -Xss4096k -XX:+UseConcMarkSweepGC
在CLOSE_WAIT状态下可以有多达200-300个连接
当我检查父PID状态时:
tcp6 1 0 10.36.0.29:8080 119.75.45.206:22621 CLOSE_WAIT 2936/java
tcp6 1 0 10.36.0.29:8080 10.36.0.85:50096 CLOSE_WAIT 2936/java
..
限制是:
Name: java
State: S (sleeping)
Tgid: 2936
Ngid: 0
Pid: 2936
PPid: 1
TracerPid: 0
Uid: 104 104 104 104
Gid: 107 107 107 107
FDSize: 1024
Groups: 107
VmPeak: 5583268 kB
VmSize: 5558668 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 405980 kB
VmRSS: 405980 kB
VmData: 5452352 kB
VmStk: 136 kB
VmExe: 4 kB
VmLib: 23304 kB
VmPTE: 2076 kB
VmSwap: 0 kB
Threads: 235
SigQ: 0/15034
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001002
SigCgt: 2000000181004ccd
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
Seccomp: 0
Cpus_allowed: 7fff
Cpus_allowed_list: 0-14
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
nonvoluntary_ctxt_switches: 2
HTOP显示CPU正在运行<5%而内存为843MB / 3774MB。事实上,Tomcat Log中没有显示任何内容,所有新请求都没有记录在catalina.out中。
所以,我试图分析PID:
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 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 15034 15034 processes
Max open files 4096 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 15034 15034 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
发现这是旧Linux内核中的一个错误,但是,我们还将Linux内核更新为版本3.16:
sudo strace -p 2936
Process 2936 attached
futex(0x7f23022749d0, FUTEX_WAIT, 2937, NULL
一旦发生这种情况,重新启动Tomcat是唯一的出路。
这个问题困扰了我很长一段时间,所以任何帮助将不胜感激。