1. 优化内核及TCP连接
fs.file-max = 655350 # 系统文件描述符总量
net.ipv4.ip_local_port_range = 1024 65535 # 打开端口范围
net.ipv4.tcp_max_tw_buckets = 2000 # 设置tcp连接时TIME_WAIT个数
net.ipv4.tcp_tw_recycle = 1 # 快速回收处于TIME_WAIT状态的socket(针对Server端而言) 生成环境中不要改变
net.ipv4.tcp_tw_reuse = 1 # 开启TIME_WAIT重用 允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1 # 开启SYN cookies 当出现syn等待溢出,启用cookies来处理,可防范少量的syn攻击
net.ipv4.tcp_syn_retries = 2 # 对于一个新建的tcp连接,内核要发送几个SYN连接请求才决定放弃
net.ipv4.tcp_synack_retries = 2 # 这里是三次握手的第二次连接,服务器端发送syn+ack响应 这里决定内核发送次数
net.ipv4.tcp_keepalive_time = 1200 # tcp的长连接,这里注意:tcp的长连接与HTTP的长连接不同
net.ipv4.tcp_fin_timeout = 15 # 设置保持在FIN_WAIT_2状态的时间
net.ipv4.tcp_max_syn_backlog = 20000 # syn队列的长度 默认1024
net.core.somaxconn = 65535 # 在内核内存中netfilter可以同时处理的“任务”
net.core.netdev_max_backlog = 65535 # 当网络接口比内核处理数据包速度快时,允许送到队列数据包的最大数目
保存退出
[root@cloud ~]# sysctl -p # 添加生效
FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态
四次握手描述的是客户段主动关闭,服务器被动关闭的流程,其一般过程如下:
客户端发送FIN报文段,进入FIN_WAIT_1状态。
服务器端收到FIN报文段,发送ACK表示确认,进入CLOSE_WAIT状态。
客户端收到FIN的确认报文段,进入FIN_WAIT_2状态。
服务器端发送FIN报文端,进入LAST_ACK状态。
客户端收到FIN报文端,发送FIN的ACK,同时进入TIME_WAIT状态,启动TIME_WAIT定时器,超时时间设为2MSL。
服务器端收到FIN的ACK,进入CLOSED状态。
客户端在k时间内没收到对端的任何响应,TIME_WAIT超时,进入CLOSED状态。
2. 修改Tomcat Connector运行模式为apr
Tomcat Connector有三种运行模式:
- bio:阻塞IO bio是三种运行模式中性能最低第一种。
- nio:是一个基于缓冲区,并能提供非阻塞I/O操作的JAVA API 因此NIO也成为非阻塞I/O,比bio拥有更好的并发性能。
- apr:调用httpd核心链接库来读取或文件传输,从而提高tomat对静态文件的处理性能。Tomcat APR模式也是Tomcat在高并发下的首选运行模式:
1 yum -y install gcc gcc-c++ pcre-devel
2 tar -zxf apr-1.7.0.tar.gz
3 cd apr-1.7.0/
4 ./configure --prefix=/usr/local/apr && make -j4 && make install
5 cd ..
6 tar -zxf apr-util-1.6.1.tar.gz
7 cd apr-util-1.6.1/
8 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make -j4 && make install
9 cd ..
10 rm -rf apr-util-1.6.1
11 yum -y install expat-devel
12 tar -zxf apr-util-1.6.1.tar.gz
13 cd apr-util-1.6.1/
14 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make -j4 && make install
15 cd /usr/local/tomcat/bin/
16 tar -zxf tomcat-native.tar.gz -C /usr/src
17 cd /usr/src/tomcat-native-1.2.18-src/
18 cd native/
19 ./configure --prefix=/usr/local/apr --with-java-home=/usr/local/java
20 make -j4 && make install
22 vim /etc/profile 尾部添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
23 source /etc/profile
24 /usr/local/tomcat/bin/startup.sh
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
69 <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
70 connectionTimeout="20000"
71 redirectPort="8443" />
116 <Connector port="8009" protocol="org.apache.coyote.http11.Http11AprProtocol" redirectPort="8443" />
[root@localhost ~]# tail /usr/local/tomcat/logs/catalina.out
2-Jul-2019 22:40:38.276 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/manager]
12-Jul-2019 22:40:38.378 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/manager] has finished in [102] ms
12-Jul-2019 22:40:38.397 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
12-Jul-2019 22:40:38.411 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8009"]
12-Jul-2019 22:40:38.416 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1392 ms
3. 内存优化
Tomcat内存优化主要是对tomcat启动参数优化,可以修改catalina.sh中设置
[root@localhost ~]# vim /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m"
# ----- Execute The Requested Command #找到此行 在上边添加
-server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:j使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
4. tomcat并发优化
参数说明
minProcessors:最小连接线程数,用于提高系统处理性能,默认值为 10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75
acceptCount:允许的最大连接数,应大于等于 maxProcessors ,默认值为 100
connectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。
其中和最大连接数相关的参数为maxProcessors 和 acceptCount 。如果要加大并发连接数,应同时加大这两个参数。
web server允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右, Linux 是 1000 个左右。
maxThreads 最大并发数
minSpareThreads 最小空闲线程数
maxSpareThreads T最大空闲线程数
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
URIEncoding URL统一编码
配置如下
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" #默认有的
maxThreads="1000"
minProcessors="100"
maxProcessors="1000"
minSpareThreads="100"
maxSpareThreads="1000"
enableLookups="false"
URIEncoding="utf-8"
acceptCount="1000"
disableUploadTimeout="ture"
redirectPort="8443" /> #默认有的