• 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
             

     

  • 相关阅读:
    MacBook下java环境的搭建
    Mac 终端下Homebrew的几个常用命令(新手笔记)
    新手学Appium_Python_Client
    【转】pycharm的一些快捷键
    解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
    chrome扩展第三方浏览器下载安装
    php异或加密解密算法的实现
    TortoiseGit客户端密钥配置
    CURL重试发送请求
    关于接收POST请求 $GLOBALS['HTTP_RAW_POST_DATA']
  • 原文地址:https://www.cnblogs.com/seanRay/p/14809858.html
Copyright © 2020-2023  润新知