Centos 下Tomcat 假死简单分析优化

一、现象分析,初步分析是tomcat 大量 TIME_WAIT 的TCP连接和 FIN_WAIT2 连接

1、由于TCP/IP协议栈有个问题,FIN_WAIT2状态是没有超时的(不像TIME_WAIT状态),所以如果CLIENT不关闭,这个FIN_WAIT_2状态将保持到系统重新启动
2、TIME_WAIT,可能是因为服务器主动关闭连接导致TIME_WAIT产生,而java服务器回收tcp线程速度比较慢,linux 关闭
TIME_WAIT状态的线程也比较慢,所以导致存在大量TIME_WAIT线程。

二、处理方案

**查看各种网络状态的命令

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

1、修改tomcat配置文件,修改最大连接数(增大)

修改tomcat 目录 conf 目录下server.xml配置文件,Connector节点中增加acceptCount和maxThreads这两个属性的值,并且使acceptCount大于等于maxThreads

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"  
  redirectPort="8443" acceptCount="500" maxThreads="400" />

2、修改linux的TCP超时时间(socket生命周期)限制

		vi /etc/sysctl.conf

#对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃,不应该大于255,默认值是5,对应于180秒左右时间
net.ipv4.tcp_syn_retries=2

#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为300秒
net.ipv4.tcp_keepalive_time=1200
net.ipv4.tcp_orphan_retries=3

#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 4096

#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。默认为0,表示关闭
net.ipv4.tcp_syncookies = 1

#表示开启重用tcp连接。允许将TIME-WAIT sockets重新用于新的TCP连接。默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1

#表示开启TCP连接中TIME-WAIT sockets的快速回收。默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1

#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout = 30

#减少超时前的探测次数
net.ipv4.tcp_keepalive_probes=5

#优化网络设备接收队列
net.core.netdev_max_backlog=3000

3、重启,配置生效

	/sbin/sysctl -p

三、tomcat 配置 apr 运行模式,优化并发性能

1、tomcat 运行模式

bio
bio(blocking I/O),即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。Tomcat7以下版本默认情况下是以bio模式运行的,由于每个请求都要创建一个线程来处理,线程开销较大,不能处理高并发的场景,在三种模式中性能也最低 。

nio
是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能,Tomcat8以上版本,默认使用的就是NIO模式,不需要额外修改。

apr
(Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式

2、配置apr 运行模式
因为apr模式本质是使用JNI技术调用操作系统IO接口,需要用到相关API的头文件

yum install apr-devel
yum install openssl-devel
yum install gcc
yum install make

注意:openssl库要求在0.9.7以上版本,APR要求在1.2以上版本,用rpm -qa | grep openssl检查本机安装的依赖库版本是否大于或等于apr要求的版本。

安装apr动态库

进入tomcat的bin目录,解压tomcat-native.tar.gz文件,
并进入tomcat-native-1.2.7-src/native目录,
执行

./configure --with-apr=/usr/local/apr
 make && make install 

我这里选择将动态库安装在/usr/local/apr/目录下

3、配置APR本地库到系统共享库搜索路径中,有三种方式

3.1、配置apr 环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib

3.2、编辑/bin/catalina.sh文件,在虚拟机启动参数JAVA_OPTS中添加java.library.path参数,指定apr库的路径

JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"

3.3、拷贝/usr/local/apr/lib目录下所有动态库到/usr/lib或/lib系统共享库搜索目录下即可

copy /usr/local/apr/lib/libtcnative* /usr/lib/

4、指定tomcat运行模式,将protocol从HTTP/1.1改成org.apache.coyote.http11.Http11AprProtocol

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />

最后启动tomcat 发现打印出来的日志中有如下字样,则表示成功
http-apr-8080
http-apr-8009

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值