从日志中可以知道当服务在处理请求大数据业务接口时,由于网络会通过I/O操作将业务数据发送给客户端,当I/O流读写的操作数据量过大时,Tomcat服务器会主动断开连接,并且报出客户端与服务端连接的管道通道爆裂的异常错误
可以使用netstat指令查看服务器当前网络通信情况
[root@sdfassd logs]# netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}' CLOSE_WAIT 3853 ESTABLISHED 285 TIME_WAIT 40
CLOSE_WAIT表示等待关闭的通信数量,当参数值过大时存在多余的网络资源开销,这是由于操作系统对于网络通讯有一个默认的链接参数设定,当一个通讯来请求服务器建立通道的时候,操作系统会给这次链接设定一个默认的链接时间
通过sysctl指令可以查询操作系统的一些状态
[root@sdfassd logs]# sysctl -a |grep keepalive net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_intvl = 75
由于请求tomcat处理的时候,大量数据的读写操作导致耗时过程,客户端与tomcat(基于CXF框架)的管道爆裂
根据打印日志,从数据库查询到生成json数据返回过程都正常,但是在CXF框架回写给客户端的过程就报错,开始以为是tomcat链接超时时间导致(默认超时时间2000毫秒),
处理方案:
一、优化数据查询量:
因此加大了超时时间为1分钟,没有任何效果。故又重新检查代码,猜测是否是批量查询的时候耗时太长导致,将对应表的字段 where条件里的字段加索引。
二、优化tomcat配置:修改tomcat的,server.xml配置文件
另外,将tomcat默认启动方式(bio方式-性能比较低)改为nio方式,提高处理请求的性能。
默认protocol 为 HTTP/1.1, 改为 org.apache.coyote.http11.Http11NioProtocol
————————————————
<Connector port="8760" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
tomcat有三种启动方式: bio、nio、ajp. 性能bio< nio< apr.
参考资料: