原创

调优-Tomcat性能监控与调优

4、Tomcat性能监控与调优

4.1 tomcat远程debug

>
jdwp协议:java debug wire protocol

https://www.ibm.com/developerworks/cn/java/j-lo-jpda3/

4.1.1 tomcat配置:

   cd /usr/mylibs/tomcat7 
   vi bin/startup.sh

   #在startup.sh最后一行中添加jpda
   exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"
   #继续修改catalina.sh
   vi bin/catalina.sh
   #搜索JPDA
   :/JPDA_ADDRESS
   #将远程调试的默认端口8000,改成54321并保存
   #启动tomcat
   ./bin/startup.sh
   #检查54321端口是否启动,可能需要检查一下防火墙
   netstat -ntlp | grep 54321

新建测试代码
com/jiangjiesheng/javaOptimizationAndDebug/remotedebug

打包
4.1.1.1 pom.xml中修改打包jar方式为war
4.1.1.2 同时修改com.jiangjiesheng.javaOptimizationAndDebug.JavaOptimizationAndDebugForProdEnvApplication
4.1.1.3 mvn clean package -Dmaven.test.skip=true

如果想要改名,一定要在上传之前改名
java-optimization-and-debug-for-prod-env-0.0.1-SNAPSHOT.war修改成javadebug.war

上传到tomcat的webapps下,自动解压,修改名称

访问测试 192.168.50.228:8080/javadebug/remotedebug/hello
跨网段可能导致不能连接局域网访问,使用
wget localhost:8080/javadebug/remotedebug/hello 测试一下
为什么启动端口不是12345?

虚拟机修改网段为192.168.1.xxx
虚拟机 -> 编辑 -> 虚拟网络编辑器 -> 选中VMnet8 -> 编辑一下子网为192.168.1.0
(注意保持VMnet0 VMnet1 VMnet8的子网ip不同) -> 同时修改dhcp设置 192.168.1.1
-> 修改虚拟系统的设置 -> 网络适配器 -> 相应的选择(这是VMnet8NAT模式) -> 重启虚拟系统
-> ifconfig 查看是否分配成功

修改成功 192.168.1.3:8080/javadebug/remotedebug/hello

关闭防火墙 service iptables stop 关闭后还是无法访问

防火墙配置 vi /etc/sysconfig/iptables

直接开启防火墙反而访问成功 service iptables restart

(然后关闭也能访问成功,所以第一步是必须先启动一下防火墙)

http://192.168.1.3:8080/javadebug/remotedebug/hello

启动提示拒绝访问
继续检查日志:
tail -f catalina.out 启动tomcat

发现 java.lang.NoClassDefFoundError: javax/el/ELManager
出现这个问题的原因,应该是Tomcat的el-api.jar与编译器的el-api.jar包有差异导致的。

解决方法:
将我的idea编译器安装目录下下的el-api.jar包(我的路径:D:\Program Files (x86)\JetBrains\IntelliJ IDEA 15.0.2\lib\rt\jasper2.1,即本项目中00-tools/el-api.jar),
分别放到服务器端的Tomcat的lib包下(我的路径:/usr/local/tomcat/apache-tomcat-7.0.77/lib),注意先备份一下,
和jdk/lib/ext包下(我的路径:/usr/java/jdk1.8.0_151/jre/lib/ext),通过 cat /etc/profile查看jdk的安装目录。
http://www.cnblogs.com/Darlin356230410/p/9172474.html

重启tomcat,首先直接kill命名
tail -f catalina.out,确认没有javadebug的相关错误后,
http://192.168.1.3:8080/javadebug/remotedebug/hello 测试成功

4.1.1.4 配置idea远程调试
https://blog.csdn.net/qq_35246620/article/details/78507324
跟添加tomcat过程类似
添加Host、port和Search sources using module's classpath

注意:如果提示 Error running Unnamed: Unable to open debugger port (192.168.1.3:54321): java.net.ConnectException "Connection timed out: connect"
则修改防火墙或者直接关闭防火墙

启动远程调试:启动idea的debug模式,打上断点,再请求一下链接,断点成功进入。(F6单步后,选中对象可以setvalue)

4.2 tomcat-manager监控

>

4.2.1 文档:docs/manager-howto.html

http://192.168.1.3:8080/docs/manager-howto.html

4.2.2 步骤:

4.2.2.1 添加用户

vi conf/tomcat-users.xml
<!--181002 调试远程监控 不能用#注释-->
<role rolename="tomcat"/>
<role rolename="manager-status"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="123456" roles="tomcat,manager-status,manager-gui"/>

4.2.2.2 配置允许的远程连接

vi conf/Catalina/localhost/manager.xml  (默认没有,需要新建)
<?xml version="1.0" encoding="UTF-8"?>
<Context privileged="true" antiResourceLocking="false"
                     docBase="${catalina.home}/webapps/manager" >
   <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1" /> 
</Context> 

<!-- allow 127\.0\.0\.1 应该也可以通过nginx代理一下 ,不能用# -->
<!-- 不允许有匹配 "[xX][mM][lL]" 的处理指令目标 ,<?xml version='1.0' encoding='UTF-8'?> 前面不能有空格 -->
<!-- 直接在linux配置此文件,如果内容有错,可能难以发现问题,可以现在windows环境下调试成功 -->

4.2.2.3 重启tomcat
使用测试:
http://192.168.1.3:8080/manager/html
如果提示403,则是allow="127.0.0.1" 的问题,在windows环境中配置此ip,并通过此ip访问成功。
但是在linux虚拟机中配置此ip、linux ip(ifconfig)、windows ip(ipconfig)、百度搜索来的外网ip均是403.
分析并解决:通过查看请求日志:

tail -f ./logs/localhost_access_log.2018-10-02.txt
#返回
192.168.1.1 - tomcat [02/Oct/2018:14:15:41 +0800] "GET /manager/html HTTP/1.1" 200 17064
#由此得出ip应该是192.168.1.1,将allow换成192.168.1.1后,等待2s左右,windows环境访问Linux成功。

4.3 psi-probe监控

>
4.3.1 下载及打包
git clone https://github.com/psi-probe/psi-probe
进入目录 00-tools/4th-psi-probe-javamonitortool/psi-probe
mvn clean package -Dmaven.test.skip=true (保证有足够的内存)
发布文件在web/target/probe.war下

发布前,tomcat也需要完成两步配置 4.2.2.1和 4.2.2.2

在windows环境部署成功(直接通过http://localhost:8080/probe/访问成功),但是在Linux中部署,打开报500,未找到有效的logs日志

4.4 tomcat调优

4.4.1 线程优化
文档 docs/config/http.html
http://192.168.1.3:8080/docs/config/http.html

4.4.1.1 maxConnections:

4.4.1.2 acceptCount:请求的队列最大个数

4.4.1.3 maxThreads:同一个时间点上处理的并发的请求数,默认200

4.4.1.4 minSpareThreads:最小空闲的工作线程 不要太小

4.4.2 配置优化

文档 docs/config/host.html,即 http://192.168.1.3:8080/docs/config/host.html

配置路径 /conf/server.xml 搜索 :/autoDeploy

4.4.2.1 autoDeploy="false"

4.4.2.2 enableLookups="false" #关闭DNS查询 来自docs/config/http.html

4.4.2.3 reloadable=true #监控/WEB-INF/classes/ and /WEB-INF/lib 中变化,开发环境下可以开启,来自docs/config/context.html

# /conf/server.xml 下 autoDeploy 节点的子节点 
<Context reloadable=true >

4.4.2.4 Session优化

如果是JSP,可以禁用Session

补充:

1. Spring常规项目和SpringBoot远程调试

正文到此结束
本文目录