a. tomcat的运行原理:

  1. Tomcat是运行在JVM中的一个进程。它定义为【中间件】,顾名思义,是一个在Java项目与JVM之间的中间容器。
  2. Web项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(main方法),,意味着Web项目中的方法不会自动运行起来。
  3. Web项目部署进Tomcat的webapp中的目的是很明确的,那就是希望Tomcat去调用写好的方法去为客户端返回需要的资源和数据。
  4. Tomcat可以运行起来,并调用写好的方法。那么,Tomcat一定有一个main方法。
  5. 对于Tomcat而言,它并不知道我们会有什么样的方法,这些都只是在项目被部署进webapp下后才确定的,由此分析,必然用到了Java的反射
      来实现类的动态加载、实例化、获取方法、调用方法。但是我们部署到Tomcat的中的Web项目必须是按照规定好的接口来进行编写,以便进行调用
  6. Tomcat如何确定调用什么方法呢。这取却于客户端的请求,http://127.0.0.1:8080/wsota/wsota_index.jsp?show这样的一个请求,
   通过http协议, 在浏览器发往本机的8080端口,携带的参数show方法,包含此方法的路径为wsota,文件名为:wsota_index.jsp。

b. Tomcat运行机制:

假设来自客户的请求为:http://localhost:8080/wsota/wsota_index.jsp
  1. 请求端口8080,等待http请求。
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
  3. Engine获得请求localhost/wsota/wsota_index.jsp,匹配到名为localhost的Host
  4. localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
  5. Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
  6. path="/wsota"的Context获得请求/wsota_index.jsp,在它的mappingtable中寻找对应的servlet
  7. Context匹配到URLPATTERN为*.jsp的servlet,对应于JspServlet类
  8. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
  9. Context把执行完了之后的HttpServletResponse对象返回给Host
  10. Host把HttpServletResponse对象返回给Engine
  11. Engine把HttpServletResponse对象返回给Connector
  12. Connector把HttpServletResponse对象返回给客户browser

c. tomcat调优:

  Tomcat配置文件server.xml 优化

<?xml version='1.0' encoding='utf-8'?>

<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--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" /> <GlobalNamingResources>
<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"> <!-- 使用线程池 -->
<!--
name: 共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。
namePrefix: 在JVM上,每个运行线程都可以有一个name字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-;
prestartminSpareThreads: 在 Tomcat 初始化的时候就初始化
maxThreads:最大并发数,默认200,建议在 500 ~ 800,根据硬件设施和业务来判断
maxQueueSize: 最大的等待队列数,超过则拒绝请求
minSpareThreads:Tomcat初始化时创建的线程数,默认设置25
maxIdleTime: 最大备用(空闲)线程数,如果空闲线程超过这个值,Tomcat就会关闭不活动线程,默认值:60000(一分钟)。
-->
<Executor
name="tomcatThreadPool"
namePrefix="HTTP-8080-exec-"
prestartminSpareThreads="true"
maxThreads="800"
maxQueueSize="100"
minSpareThreads="50"
maxIdleTime="60000" /> <!-- tomcat容器性能参数设置 -->
<!--
executor: 线程池
port: 端口号
redirectPort: 重定向端口号,https方式访问资源时,此时Tomcat会自动重定向到这个redirectPort设置的https端口。
proxyPort: 这个属性指定了调用request.getServerPort()返回的端口值
protocol: https://www.jianshu.com/p/e4d2d7aac14f
acceptCount: 处理队列中的请求数,默认值10。超过这个数值的请求将不予处理。一般大于或者等于maxThreads
connectionTimeout: 网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,通常可设置为30000毫秒
maxHttpHeaderSize: http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
enableLookups: 是否反查域名,默认值为true。为了提高处理能力,应设置为false
compression: 打开压缩功能
compressionMinSize: 启用压缩的输出内容大小,默认为2KB
compressableMimeType: 哪些资源类型需要压缩
URIEncoding: 指定Tomcat容器的URL编码格式
-->
<Connector
executor="tomcatThreadPool"
port="8080"
redirectPort="8443"
proxyPort="8443"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
acceptCount="1000"
connectionTimeout="30000"
maxHttpHeaderSize="8192"
enableLookups="false"
compression="on"
compressionMinSize="10240"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
URIEncoding="UTF-8"/> <!--
AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。
如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。
我们用nginx做的反向代理,不使用此连接器,因此需要注销掉该连接器。
-->
<!-- <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>

  JVM调优

  Tomcat并不建议直接在catalina.sh里配置变量,而是写在与catalina同级目录(bin目录)下的setenv.sh里, 如果不存在, 则创建一个.

#!/bin/shexport
# 优化参考 https://blog.csdn.net/adrian_dai/article/details/80538059 # 设置JAVA_HOME
export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib # 设置CATALINA_HOME
CATALINA_HOME=/data/tomcat/tomcat8080-console # 参考地址: https://blog.csdn.net/y_blueblack/article/details/81066141
# -Xms:虚拟机初始化时的最小堆内存。
# -Xmx:虚拟机可使用的最大堆内存. -Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
# 设定每个线程的堆栈大小。一般不宜设置超过1M,要不然容易出现out ofmemory
# AggressiveOpts: 启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)
# UseBiasedLocking: 启用一个优化了的线程锁。对于应用服务器来说每个http请求就是一个线程,由于请求需要的时长不一,在并发较大的时候会有请求排队、甚至还会出现线程阻塞的现象,这个配置可以改善这个问题。
# PermSize: 设置非堆内存初始值,默认是物理内存的1/64;
# MaxPermSize: 设置最大非堆内存的大小,默认是物理内存的1/4。
# DisableExplicitGC: 在程序代码中不允许有显示的调用”System.gc()”。
# UseParNewGC: 对年轻代采用多线程并行回收,这样收得快。
# MaxTenuringThreshold: 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代,根据本地的jprofiler监控后得到的一个理想的值,不能一概而论原搬照抄。
# UseConcMarkSweepGC: 即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。
# CMSParallelRemarkEnabled: 在使用 UseParNewGC 的情况下,尽量减少 mark 的时间。
# UseCMSCompactAtFullCollection: 在使用 concurrent gc 的情况下,防止 memoryfragmention,对 live object 进行整理,使 memory 碎片减少。
# LargePageSizeInBytes: 指定 Java heap 的分页页面大小,内存页的大小不可设置过大, 会影响 Perm 的大小。
# UseFastAccessorMethods: 使用 get,set 方法转成本地代码,原始类型的快速优化。
# UseCMSInitiatingOccupancyOnly: 只有在 oldgeneration 在使用了初始化的比例后 concurrent collector 启动收集。
# UseBiasedLocking: -Djava.awt.headless=true这个参数一般我们都是放在最后使用的, 解决window下可以显示的图片在linux不能显示
export JAVA_OPTS="-server
-Xms1024M
-Xmx1024M
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:PermSize=128M
-XX:MaxPermSize=512M
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:MaxTenuringThreshold=15
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Djava.awt.headless=true "

参考:

  tomcat 运行机制和调优: https://blog.csdn.net/y_blueblack/article/details/81066141

  tomcat 工作原理详解: https://blog.csdn.net/res_cue/article/details/21756357

  tomcat bio nio apr模式性能测试: https://blog.csdn.net/wanglei_storage/article/details/50225779

  tomcat 开始apr模式: https://blog.csdn.net/xyang81/article/details/51502766

  java虚拟机性能监控调优及原则: https://www.cnblogs.com/thingk/p/6840585.html

tomcat8调优的更多相关文章

  1. Tomcat-8.5.39性能监控及调优

    一.下载地址 https://tomcat.apache.org/download-80.cgi 二.安装步骤 将安装包 apache-tomcat-8.5.39.tar.gz 上传至服务器 /usr ...

  2. 【 Tomcat 】tomcat8.0 基本参数调优配置-----(1)

    Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增大可使用的内存容量.提高CPU 的频率,保证文件 ...

  3. 【 Tomcat 】tomcat8.0 基本参数调优配置-----(2)

    Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增大可使用的内存容量.提高CPU 的频率,保证文件 ...

  4. JVM菜鸟进阶高手之路七(tomcat调优以及tomcat7、8性能对比)

    转载请注明原创出处,谢谢! 因为每个链路都会对其性能造成影响,应该是全链路的修改压测(ak大神经常说全链路!).本次基本就是局域网,所以并没有怎么优化,其实也应该考虑进去的. Linux系统参数层面的 ...

  5. tomcat调优(三)

    标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 1.安全优化 降权启动 telnet管理端口保护 ajp连接端口保护 禁用管理端 关闭本地默认 ...

  6. JVM高手之路七(tomcat调优以及tomcat7、8性能对比)

         版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lirenzuo/article/details/77164033 因为每个链路都会对其性能 ...

  7. (转)centos 7 Tomcat 8.5 的安装及生产环境的搭建调优

    原文:https://www.cnblogs.com/linhankbl/articles/9149804.html#top JVM菜鸟进阶高手之路七(tomcat调优以及tomcat7.8性能对比) ...

  8. Tomcat调优总结(Tomcat自身优化、Linux内核优化、JVM优化)

    Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置.首先是对这几个参数的含义要有深刻而清楚的理解.以tomcat8.5为例,讲解参数. 同时也得认识到一点,tomcat调 ...

  9. 小计Tomcat的调优思路

    描述 最近在补充自己的短板,刚好整理到Tomcat调优这块,基本上面试必问,于是就花了点时间去搜集一下tomcat调优 都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录, ...

随机推荐

  1. python的int float if...else

    # 字符串 string  单引号 ‘ ’  双引号 “  ”-包含的 app = 'dongt woory' 外面单引号里面可以双引号,外面双引号,里面也可以单引号 app ='你是真的“好看”吗' ...

  2. Python操作rabbitmq系列(六):进行RPC调用

    此刻,我们已经进入第6章,是官方的最后一个环节,但是,并非本系列的最后一个环节.因为在实战中还有一些经验教训,并没体现出来.由于马上要给同事没培训celery了.我也来不及写太多.等后面,我们再慢慢补 ...

  3. hive常用函数三

    日期函数 1. UNIX时间戳转日期函数: from_unixtime 语法: from_unixtime(bigint unixtime[, string format]) 返回值: string ...

  4. 数据结构和算法(Golang实现)(21)排序算法-插入排序

    插入排序 插入排序,一般我们指的是简单插入排序,也可以叫直接插入排序.就是说,每次把一个数插到已经排好序的数列里面形成新的排好序的数列,以此反复. 插入排序属于插入类排序算法. 除了我以外,有些人打扑 ...

  5. Python 获取任意周期开盘日

    import json import requests import datetime import tushare as ts cal_dates = ts.trade_cal() today=da ...

  6. FreeRTOS操作系统工程建立和操作系统的概念

    一.建立工程步骤如下: 二.详细步骤流程如下: 1.新建工程文件夹,然后在里面建立如下几个文件: 2.使用keil5建立工程: a.建立工程: b.添加内核文件: 3.建立文件分组: 4.创建main ...

  7. Connections in Galaxy War ZOJ - 3261 (并查集)

    点权并查集的反向离线操作 题目大意:有n个stars,每一个都一定的“颜值”.然后stars与stars之间可以相连,query c表示再与c相连的stars中,颜值比c高的,stars的标号,如果有 ...

  8. 一个可能是世界上最全的 API 接口集合库开源项目

    对于程序员来说,为自己的程序选择一些合适的API并不是那么简单,有时候还会把你搞得够呛,今天猿妹要和大家分享一个开源项目,这个项目汇集了各种开发的api,涵盖了音乐.新闻.书籍.日历等,无论你是从事W ...

  9. Linux-监控与安全运维之zabbix

    zabbix: Zabbix是一个开源分布式监控平台,包含诸多监控功能,用于构建一个符合企业级的监控解决方案.软件由开源社区提供开发和维护,遵循GPL协议,可以自由传播和使用,但开发团队提供收费的技术 ...

  10. Thymeleaf+SpringBoot+Mybatis实现的齐贤易游网旅游信息管理系统

    项目简介 项目来源于:https://github.com/liuyongfei-1998/root 本系统是基于Thymeleaf+SpringBoot+Mybatis.是非常标准的SSM三大框架( ...