Tomcat性能监控与调优

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

然后点击i 进入到insert状态,在最后输入jpda,最后保存退出

image-20210525084145156

 

  • 输入以下命令修改catalina.sh文件

vi ./bin/catalina.sh

修改JPDA_ADDRESS,即远程访问的端口,然后退出保存

image-20210525090057659

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

    image-20210525102518062

  • 使用上面准备的启动脚本,启动我们的Application,然后在本地ldea中打断点,选择debug

    image-20210525102902770

    如果看到如图所示,表示远程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了

    image-20210525103005573

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

    image-20210525170528712

  • 进入psi-probe编译打包成war包

    mvn clean package

    image-20210525170610379

  • 然后把生成的probe.war包复制到tomcat的webapps下,并且运行tomcat(在运行之前需要在conf/tomcat-user.xml中配置用户名和密码)

    image-20210525170641879

  • 最后在浏览器输入http://localhost:8080/probe ,输入用户名和密码

    image-20210525170505563

4. Tomcat调优

线程优化

  1. 主要参数

    • 参考文档在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会定期检查appBasexmlBase 目录,并部署找到的任何新的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的原因。但是,您可以使用Manager Web应用程序来触发按需重新加载已部署的应用程序。 false docs/config/context.html
           

 

posted @ 2021-05-25 17:54  肖恩雷  阅读(271)  评论(0编辑  收藏  举报