Tomcat

Tomcat


一直用着tomcat作为应用服务器,但是对tomcat的原理一直停留在会用而已的阶段,今天仔细学习了下,看了网上大量的文章,把自己不懂的一些概念拿出来列出来,其中有各位大神的精炼解析,也添加了一些自己平时遇到的问题及解决方法


Tomcat处理资源

Tomcat访问所有的资源,都是用Servlet来实现的。所以Tomcat又叫Servlet容器嘛,什么都交给Servlet来处理。

在Tomcat看来,资源分3种:

  1. 静态资源,如css,html,js,jpg,png等。交由DefaultServlet类处理
  2. Servlet,交由InvokerServlet类处理
  3. JSP,交由JspServlet类来处理

那么什么时候调用哪个Servlet呢?

有一个类叫做org.apache.tomcat.util.http.mapper.Mapper,它一共进行了7个大的规则判断,第7个,就是判断是否是该用DefaultServlet。
简单地说:先看是不是servlet,然后看是不是jsp,如果都不是,那么就是你DefaultServlet的活儿了。
到了DefaultServlet之后,就是一个普通的HttpServlet了,doPost方法会交由doGet处理,doGet又交由一个叫做 serveResource的方法处理,在serveResource方法里又瞎搞八搞了许多事情,最后在一个叫做copy()方法里,把静态资源对应的输入流读取出来,扔到了输出流里,这样你的浏览器就看到数据了。


Tomcat调优

Tomcat的优化分成两块:

  1. Tomcat启动命令行中的优化参数即JVM优化
  2. Tomcat容器自身参数的优化(这块很像ApacheHttp Server)

1 启动行参数优化

启动行参数的优化其实就是JVM的调优,可以参考网上JVM调优的一些方法(这里给出一个链接),Tomcat 的启动参数位于tomcat的安装目录\bin目录下的catalina.sh文件,在最开始注释文字的最后一段也就是真正有效的shell命令开始的那里加入需要添加的参数即可,需要注意的一点是在生产环境需要添加一个tomcat特有的参数:-server。这个参数告诉mysql这是在真正生产环境,它会自动做一些优化的。

2 容器优化
前面我们对Tomcat启动时的命令进行了优化,增加了系统的JVM可使用数、垃圾回收效率与线程阻塞情况、增加了系统响应效率等还有一个很重要的指标,我们没有去做优化,就是吞吐量。
打开tomcat安装目录\conf\server.xml文件,定位到这一行:

1
<connector port="8080" protocol="HTTP/1.1" >

这一行就是我们的tomcat容器性能参数设置的地方,它一般都会有一个默认值,这些默认值是远远不够我们的使用的,我们来看经过更改后的这一段的配置(配置的详细含义):

1
2
3
4
5
6
7
8
9
<connector port="8080" protocol="HTTP/1.1" 
URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"
acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5"
useURIValidationHack="false"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
redirectPort="8443"
/>

3 Tomcat的运行模式
bio: (blocking I/O),阻塞式I/O操作,一般而言,表示Tomcat使用的是传统的Java I/O操作。bio模式是三种运行模式中性能最低的一种。
nio: nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即Java.nio包及其子包)。java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。关于nio与bio在tomcat上的差别可以参考这个简书:NIO只是优化了网络IO的读写,如果系统的瓶颈不在这里,比如每次读取的字节说都是500b,那么BIO和NIO在性能上没有区别。(个人感觉与socket的nio一样,并发小于1000时,区别不大,而并发很多的时候,更多的是使用nginx)
apr: (Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。可以简单地理解为Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。
修改运行模式为NIO模式:修改server.xml里的Connector节点,修改protocol为org.apache.coyote.http11.Http11NioProtocol

注:通过对tomcat几个版本的测试,tomcat7默认启动是bio模式,需要优化;tomcat8及8以上默认是nio模式,无需改变运行模式,如果是windows版本的话,包里面还默认携带一个tcnative-1.dll,默认就是在Tomcat apr模式下运行。


Tomcat版本

之前在工作中遇到了tomcat 的启动问题,然后同事提到说tomcat的linux版本和windows版本可以互用的,于是去下载官网的源文件,通过对比发现,Linux版本的Tomcat和Windows相比,确实是可以互换的,windows版本包含全部linux版本的文件,只是在windows的版本中多加了2个.exe文件和一个tcnative-1.dll文件。查阅了下之类发现tcnative-1.dll是用于tomcat的apr模式使用。


编码设置

之前遇到过tomcat的编码是UTF8的,但是怎么改都改不成GBK,然后查了很多资料,自己也找了很多地方,发现Tomcat 的编码通常在两个地方可以配置,一是conf/server.xml,二是bin/catalina.sh

conf/server.xml

1
2
3
<Connector executor="tomcatThreadPool"
port="8088" protocol="HTTP/1.1"
redirectPort="8443" URIEncoding="GBK"/>

bin/catalina.sh

1
JAVA_OPTS="${JAVA_OPTS} -Dfile.encoding=GBK"

参考:
Tomcat处理资源
Tomcat调优