一、前言
1、服务器配置:
阿里云学生机 | CPU型号 | Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz |
CPU: | 1个1核 | |
内存 | 2G | |
操作系统 | CentOS Linux release 7.5.1804 (Core) | |
Jdk | 1.8.0_144 | |
Tomcat | 8.5.24 | |
Apache | 2.4.6 | |
应用 | lvdong |
2、服务器架构:
3、线程组配置:
4、请求:
二、测试结果
-
测试结果一
1、压测结果(优化前):
-
测试结果二
1、压测结果(优化前):
三、分析原因
1、查看apache相关日志:
2、查看tomcat相关日志:
access_log
3、查看应用相关日志:
lvdong.log
4、查看GC相关日志:
四、总结原因
1、apache和tomcat连接的稳定性;
经查阅资料,apache和tomcat共有三种连接方式,分别是http_proxy、jk、ajp_proxy,其中推荐使用jk。
2、tomcat启动方式和本身的线程池配置
-
BIO:
一个线程处理一个请求。
缺点:并发量高时,线程数较多,浪费资源。
Tomcat7或以下,在Linux系统中默认使用这种方式。 -
NIO:
利用Java的异步IO处理,可以通过少量的线程处理大量的请求。
Tomcat8在Linux系统中默认使用这种方式。
Tomcat7必须修改Connector配置来启动:
-
APR:
即Apache Portable Runtime,从操作系统层面解决io阻塞问题。
Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。
Linux如果安装了apr和native,Tomcat直接启动就支持apr。
3、Apache与Tomcat动静分离
Tomcat的access_log中依旧有css等静态文件的请求日志,大家都知道Tomcat处理静态资源比Apache慢得多,所以,我们应该将静态资源直接交由Apache管理。
4、JVM参数优化
GC日志中,日志的信息可以看出,采用了Serial收集器,我们更希望使用CMS。
关于这些内容,我与大家一起深入学习… 未完待续…
五、优化方案:
备注:受限于一台服务器的原因,优化方案中,Apache就只布置一个。
服务器架构:
1、Apache+Tomcat 动静分离:
原有配置:
Apache的配置
# 所有该域名下的请求,都转发给Tomcat处理
<VirtualHost *:80>
ServerName www.vgtable.xin
ProxyPreserveHost On
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
ErrorLog "logs/www.vgtable.xin/error.log"
CustomLog "logs/www.vgtable.xin/access.log" common
</VirtualHost>
Tomcat原有配置:
<Host name="www.vgtable.xin" appBase="webapps" unpackWARs="true"
autoDeploy="true">
<Context path="" docBase="lvdong" debug="0" reloadable="true"
crossContext="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
优化配置
Apache优化后的配置:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule headers_module modules/mod_headers.so
<LocationMatch "/assets/(css|font|img|js)">
ProxyPassMatch !
<IFModule mod_headers.c>
Header set Cache-Control "max-age=604800"
</IFModule>
</LocationMatch>
# 注意:/var/www/html/ 这个目录是具有文件访问权限,一般这是安装的时候,默认指定的
# 如果没有权限,则Apache打印的日志中,会有权限不足提示,同时页面显示403 Fobidden
#
# 因为是javaWeb项目,当初没有考虑到前后端分离,所以assets下的静态文件都在原项目中,这次将assets重新拷贝出来,放在apache管理的html静态文件夹下。
# 如果直接用linux cp 命令,注意权限同样被复制过去的问题,cp过去需要重新赋予权限,和 /var/www/html/其他文件权限保持一致可以。
Alias /assets /var/www/html/vgtable.xin/assets
<Directory "/var/www/html/vgtable.xin/assets">
AllowOverride None
Require all granted
#apache2.4的配置,注意2.2可能不识别这个,需要改为
#Order Allow,Deny
#Allow From All
</Directory>
<VirtualHost *:80>
ServerName www.vgtable.xin
ProxyPreserveHost On
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
ErrorLog "logs/www.vgtable.xin/error.log"
CustomLog "logs/www.vgtable.xin/access.log" common
</VirtualHost>
Tomcat优化后的配置
...
<!-- 注释掉默认的,修改其中的参数 -->
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
<Connector address="127.0.0.1" port="8009" URIEncoding="UTF-8" protocol="AJP/1.3" />
...
<Engine name="Catalina" defaultHost="localhost">
...
<Host name="www.vgtable.xin" appBase="webapps" unpackWARs="true"
autoDeploy="true">
<Context path="" docBase="lvdong" debug="0" reloadable="true"
crossContext="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
...
</Engine>
验证结果:
打开http://www.vgtable.xin/VgMenu.do?method=findAll&category=all
Ctrl+F5 强制刷新,多刷新几次,验证功能正常。
查看Apache下的应用日志logs/www.vgtable.xin/access.log,请求正常,且有静态资源请求日志。(下图)
查看Tomcat下的logs/localhost_access_log.2018-11-05.txt日志信息,确认其中,不在含有静态文件请求日志。
3、Tomcat线程池优化:
未完待续
2、JVM优化:
在我们的Tomcat下 bin/catalina.sh 文件第一行,加入以下配置。
CATALINA_OPTS="
-server
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection"
推荐文章 Tomcat 调优及 JVM 参数优化
六、优化结果
重启Tomcat,Httpd
- 测试结果一
- 测试结果二