Tomcat性能监控与调优
1. Tomcat远程debug
1. JDWP协议
JDWP(Java DEbugger Wire Protocol):即Java调试线协议,是一个为Java调试而设计的通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。说白了就是JVM或者类JVM的虚拟机都支持一种协议,通过该协议,Debugger 端可以和 target VM 通信,可以获取目标 VM的包括类、对象、线程等信息,在调试Android应用程序这一场景中,Debugger一般是指你的 develop machine 的某一支持 JDWP协议的工具例如 Android Studio 或者 JDB,而 Target JVM是指运行在你mobile设备当中的各个App(因为它们都是一个个虚拟机 Dalvik 或者 ART),JDWP Agent一般负责监听某一个端口,当有 Debugger向这一个端口发起请求的时候,Agent 就转发该请求给 target JVM并最终由该 JVM 来处理请求,并把 reply 信息返回给 Debugger 端
2. 操作步骤
外置Tomcat(war包)
-
Tomcat服务器端设置,进入到远程服务器的tomcat文件夹下,输入以下命令,修改startup.sh文件
vi ./bin/startup.sh
-
输入以下命令修改catalina.sh文件
vi ./bin/catalina.sh
修改JPDA_ADDRESS,即远程访问的端口,然后退出保存
SpringBoot内置Tomcat (jar包)
-
准备启动脚本
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=64057 xxxx-xx.jar
使用java -jar的方式启动程序,并添加了一串特殊的参数,这是我们能够开启远程Debug的关键。以-开头的参数是jvm的标准启动参数。我们只需要关系address=64057这个参数选线,本地调试程序使用64057端口与其通信,从而远程调试。
-
配置Idea
-
使用上面准备的启动脚本,启动我们的Application,然后在本地ldea中打断点,选择debug
如果看到如图所示,表示远程debug连接Ok,如果出现连接超时问题,请检查服务器端的防火墙是否开放该端口
Centos 7 firewall命令
firewall-cmd --list-ports #查看已经开放的端口 firewall-cmd --zone=public --add-port=80/tcp --permanent #开启端口 --zone:作用域 --add-port=80/tcp:添加端口,格式为:端口/通讯协议 --permanent :永久生效,没有此参数则重启失效 firewall-cmd --reload #重启防火墙 systemctl stop firewalld.service #关闭防火墙 systemctl disable firewalld.service #禁止防火墙开机启动 firewall-cmd --state #查看防火墙状态
-
在本地浏览器访问远程服务器上的地址,然后就可以远程debug了
2. Tomcat-manager监控
-
conf/tomcat-users.xml添加用户
<role rolename="tomcat"/> <role rolename="manager-gui"/> <role rolename="manager-status"/> <user username="tomcat" password="123456" roles="tomcat,manager-gui,manager-status"/>
-
conf/Catalina/localhost/manager.xml配置允许的远程连接(经过测试也可以不添加这个配置,直接访问http://localhost:8080/manager)
manager.xml这个文件没有的话需要新建该文件,并且输入以下内容
<?xml version="1.0" encoding="utf-8"> <Context privileged="true" antiResourceLocking="false" doBase="${catalina.home}/webapps/manager"> <Value className="org.apache.catalina.values.RemoteAddrValue" allow="127\.0\.0\.1"/> </Context>
-
重启Tomcat,输入访问地址http://127.0.0.1:8080/manager, 不能输入localhost:8080/manager,因为允许访问连接的地址是127.0.0.1
3. psi-probe监控
-
从gitHub上下载psi-probe项目下来,gitHub地址:https://github.com/psi-probe/psi-probe
-
进入psi-probe编译打包成war包
mvn clean package
-
然后把生成的probe.war包复制到tomcat的webapps下,并且运行tomcat(在运行之前需要在conf/tomcat-user.xml中配置用户名和密码)
-
最后在浏览器输入http://localhost:8080/probe ,输入用户名和密码
4. Tomcat调优
线程优化
-
主要参数
-
参考文档在docs/config/http.html
maxConnections 服务器在任何给定时间将接受和处理的最大连接数。达到此数目后,服务器将接受但不处理另一个连接。在处理的连接数降至maxConnections以下之前,该附加连接将被阻止,此时服务器将再次开始接受和处理新的连接。请注意,一旦达到限制,操作系统仍然可以根据该 acceptCount
设置接受连接。默认值因连接器类型而异。对于NIO和NIO2,默认值为10000
。对于APR /本机,默认值为8192
。仅对于NIO / NIO2,将该值设置为-1将禁用maxConnections功能,并且不计算连接数。acceptCount
使用所有可能的请求处理线程时,传入连接请求的最大队列长度。队列已满时收到的任何请求都将被拒绝。默认值为100。 maxThreads
此Connector将创建的请求处理线程的最大数量,因此,它确定了可以处理的同时请求的最大数量。如果未指定,则此属性设置为200。如果执行程序与此连接器相关联,则此属性将被忽略,因为连接器将使用执行程序而不是内部线程池执行任务。请注意,如果配置了执行程序,则将正确记录为此属性设置的任何值,但是会报告该值(例如,通过JMX), -1
以明确未使用该值。minSpareThreads
始终保持运行状态的最小线程数。这包括活动线程和空闲线程。如果未指定, 10
则使用默认值。如果执行程序与此连接器相关联,则此属性将被忽略,因为连接器将使用执行程序而不是内部线程池来执行任务。请注意,如果配置了执行程序,则将正确记录为此属性设置的任何值,但是会报告该值(例如,通过JMX),-1
以明确未使用它。变量 说明 优化值 参考文档 autoDeploy
该标志值指示在Tomcat运行时,Tomcat是否应定期检查新的或更新的Web应用程序。如果为true,则Tomcat会定期检查 appBase
和xmlBase
目录,并部署找到的任何新的Web应用程序或上下文XML描述符。该标志的值默认为true.false docs/config/host.html enableLookups
设置为 true
是否要调用以request.getRemoteHost()
执行DNS查找以返回远程客户端的实际主机名。设置为false
跳过DNS查找并改为以字符串形式返回IP地址(从而提高性能)。默认情况下,DNS查找被禁用。false docs/config/http.html reloadable
设置为 true
,如果你想catalina监测类/WEB-INF/classes/
和/WEB-INF/lib
更改,并自动如果检测到变化重新加载Web应用程序。此功能在应用程序开发期间非常有用,但是它需要大量的运行时开销,因此不建议在已部署的生产应用程序上使用。这就是为什么此属性的默认设置为false的原因。但是,您可以使用false docs/config/context.html -