性能测试详解(三)Tomcat性能调优

性能测试详解(三)Tomcat性能调优

​ tomcat是一款servlet容器。tomcat暂时选择绿色版的。

​ 服务器搭建tomcat之后,会把app的jar包放到webapps里面,重启tomcat,编译jar包就可以访问项目了。tomcat是应用服务器。

​ 启动时tomcat会检查它的环境。查看启动文件源码发现它启动的是catalina,这个文件是核心文件,conf是配置文件夹,在做性能调优的时候主要调优server.html文件。其中有性能的参数设定。

1. 文件目录

conf文件夹下。

  1. logging.properties

    tomcat在启动时有乱码的情况需要在logging.properties中修改日志输出的编码方式。

    把encoding的格式utf-8都换成gbk就ok了。

logs文件夹下。

  1. catalina.log

    记录了启动信息的日志。

  2. localhost_access_log.时间.txt

    用户请求tomcat的访问日志。请求方式,http/https+状态码。

  3. localhost.time.txt

    web应用的内部程序日志。

webapp文件下

​ tomcat下存放web系统的目录,它下面每个文件夹都是一个工程项目,自己的项目可以以文件夹的形式上传,也可以使用war包,jar包等。

  1. 如果使用war包,运行时会解析编译,会生成war包对应的文件夹。部署时一般一个tomcat管理一个项目,比较好操作。
  2. 在工作中会经常在webapps中部署新的版本

work路径

  1. 运行过程中生成的文件,work路径会自动生成。

2.server.xml

2.0 文件内容 (后面分标签详解)

\apache-tomcat-9.0.29-windows-x64\apache-tomcat-9.0.29\conf

<?xml version="1.0" encoding="UTF-8"?>

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources
  <Service name="Catalina">


    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />


    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />



    <Engine name="Catalina" defaultHost="localhost">


      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

文件源代码纯英文阅读比较困难的话,去看tomcat主页的configration页面内容,它的属性的意思可以找到。Chrom浏览器可以翻译成中文。

http://localhost:8080/docs/config/server.html

tomcat顺序性加载lib里面的jar,为了启动更快,开发会把tomcat做成嵌入式启动,用代码直接启动,如果是微服务的集群,需要启动的tomcat数量很大,所以做成了嵌入式。

2.1 server.xml优化Connectors

<Connector excutor="tomcatThreadPool"
           port="8080"
           protocol="org.apache.http11.Http11NioProtocol"
           connectionTimeout="20000"
           redirectPort="8443"
           acceptCount="100"
           compression="on"
           compressionMinSize="50"
           />
  1. 嵌入式部署

    此组件的特定实例监听服务器上特定tcp端口号上的链接,可以定义端口号,比如把8080改成8081。在一个服务器上配置多个tomcat,每个不同的tomcat配置不同的端口号才可以正常访问。不过这与性能没有关系。

  2. Protocal:bio\nio\nio2\apr

    与性能有关系的是 Connector标签的protacol,tomact基于怎么的网络协议去接收

    四种传输形态
    1. bio是同步阻塞型的交互方式。把请求排队,同一时间只能处理一个请求,当要用数据库的读写操作可能需要2秒,那后面的请求就堵塞了,响应时间被无限延长
    2. nio是同步非阻塞的传输,类似云文件的多人编辑,文件运行中不操作文件,生成一个管道,生成一个buffer缓存区,缓存区操作完后再修改实际文件。一般默认为nio。伪异步的实现。
    3. Nio2是异步非阻塞。同步是线性的,从请求到响应都是同步。异步的话,等待环节取消了,有一个缓冲区,发起请求后完成特定的操作后持续接收大量请求。吞吐量大。
    4. Apr系统级别的异步,apr是高并发大吞吐量数据形态的首选方式。应用访问度不频繁的话直接用nio就可以了,linux环境推荐用nio,nio2不太好用。系统访问量很大用apr,但是linux系统下使用apr要安装相关apr的包(关联的库),windows不用安装。
  3. compression=“on”,把请求和数据进行压缩,把空间缩小。compressionMinSize,如果为“on”,则此属性可用于指定压缩输出之前的最小数据量。

  4. acceptCount=“100”,当我的线程池满了以后,后续进来的请求如何处理,acceptCount为最大的等待数。超出的就拒绝掉,因为处理不过来了。暂时可抽象理解为排队的最大人数。

2.2 server.xml优化线程池 Executer 线程与请求的配置。

​ 要考虑到服务端硬件资源的环境。资源也要避免浪费。

    <Executor name="tomcatThreadPool" 
              namePrefix="catalina-exec-" ## 每个线程在启动时会有一个名字,取“catalina-exec-”前缀
			 maxThreads="150"  ## 线程池的最大数量
              minSpareThreads="4" ## Executor执行时,创建的线程数
              maxIdleTime="60000" ## 60秒 一个线程的最大存活时间,以毫秒为单位
              
              prestartminSpareThreads="true"
              
              maxQueueSize="100" ## 最大线程等待数。 与线程挂钩。
              />
  1. namePrefix 每个线程在启动时会有一个名字,取“catalina-exec-”前缀
    1. catalina-exec-1
    2. catalina-exec-2
    3. catalina-exec-3
  2. maxThreads 是线程池的最大数量。支撑最大线程的运行数。根据实际业务走。
  3. minSpareThreads Executor执行时,创建的线程数,线程是一个一个创建的,默认启动线程池的时候,先创建一批默认的线程数,来处理请求。
  4. maxIdleTime 一个线程的最大存活时间,以毫秒为单位,有些线程因为没有请求,没有任务的下发,线程进入了空闲状态,一直运行会消耗很多资源,所以就释放掉。
  5. prestartminSpareThreads 是否启动minSpareThreads,决定它是否生效,没有的话默认为false。
  6. maxQueueSize=“100” 最大线程等待数。

tomcat的内存与jvm的内存机制是关联的。无限放大线程池的大小时,服务端内存也会放大。

tomcat在运行时默认做了自动重载的

2.3 自动重载 (关闭自动重载)

​ java代码更新后tomcat会自动重载。自动加载的过程可能会产生隐患,容易造成内存溢出,因为需要重载class文件更新,自动去读取。所以需要关闭自动重载

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
 <!-- 修改为 false-->         
	  <Host name="localhost"  appBase="webapps"
            unpackWARs="flase" autoDeploy="flase">          
  1. autoDeploy 是自动部署。

tomcat会关联jvm

在 **bin\catalina.bat(windows系统)**中进行配置 ,JAVA_OPTS,去配置JVM的使用内存、初始化内存和最大内存等。可以准确定位到JVM的准确的内存值。(具体内容关注之后的JVM部分)tomcat与jvm需要协调。

​ CPU占用比越高,线程运行越多,系统表现越慢。测试的是什么业务,结合具体业务。合理调节系统的资源。结合实际业务场景,硬件资源来制定调优方案。不同场景下调优方向不同。比如nio,apr,可以根据试错来积累经验。5-7年的经验可能对于性能测试工程师是十分关键的。

​ 对于开发人员,tomcat的调优,懂tomcat源码,底层逻辑,交互实现等一系列内容,从代码底层了解tomcat的运行机制。

​ 对测试工程师来说,了解tomcat的配置,实现资源的最大化利用,最有效的执行,配置如何去调整。

​ 不同的角度对性能的概念是不一样的。

3. 问题

1. 在不同肉机上压测同一个服务,吞吐量相差特别大,可能的原因有哪些?

  1. 网络问题
  2. 测试脚本
  3. 服务端是否出现了问题
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值