刚入行的朋友,当面试的时候被问到,如何做一些优化提高的网站的并发能力时,可能一脸懵逼,今天整理一些Tomcat方面的调优,从而提高网站并发能力。
1.配置tmocat管理员账户
在conf/ tomcat-users.xml下添加用户:
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>
启动tomcat,登录查看信息:
红色的为关注点,优化即针对他们。
2.tomcat的3种运行模式
tomcat的运行模式有3种:
1、bio
默认的模式,性能非常低下,没有经过任何优化处理和支持.
2、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)更好的并发运行性能。
3、apr
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.
1、bio
默认的模式,性能非常低下,没有经过任何优化处理和支持.
2、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)更好的并发运行性能。
3、apr
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.
2.1启动NIO模式
修改server.xml里的Connector节点,修改protocol为org.apache.coyote.http11.Http11NioProtocol
3.执行器(线程池)
在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能
3.1修改server.xml配置
3.2各参数说明
Attribute | Description |
---|---|
threadPriority(优先级) | (int) The thread priority for threads in the executor, the default is 5 (the value of theThread.NORM_PRIORITY constant) |
daemon(守护进程) | (boolean) Whether the threads should be daemon threads or not, the default is true |
namePrefix(名称前缀) | (String) The name prefix for each thread created by the executor. The thread name for an individual thread will be namePrefix+threadNumber |
maxThreads(最大线程数) | (int) The max number of active threads in this pool, default is 200 |
maxIdleTime(空闲线程等待时间) | (int) The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less or equal to minSpareThreads. Default value is 60000(1 minute) |
maxQueueSize(最大的等待队里数,超过则请求拒绝 | (int) The maximum number of runnable tasks that can queue up awaiting execution before we reject them. Default value is Integer.MAX_VALUE |
prestartminSpareThreads (是否在启动时就生成minSpareThreads个线程) | (boolean) Whether minSpareThreads should be started when starting the Executor or not, the default is false |
threadRenewalDelay (重建线程的时间间隔) | (long) If a ThreadLocalLeakPreventionListener is configured, it will notify this executor about stopped contexts. After a context is stopped, threads in the pool are renewed. To avoid renewing all threads at the same time, this option sets a delay between renewal of any 2 threads. The value is in ms, default value is 1000 ms. If value is negative, threads are not renewed. 。重建线程池内的线程时,为了避免线程同时重建,每隔threadRenewalDelay(单位: ms )重建一个线程。默认值为1000 ,设置为负则不重建 |
minSpareThreads(最小活跃线程数) | (int) The minimum number of threads always kept alive, default is 25 |
3.3最佳实践
4.连接器(Connector)
Connector是Tomcat接收请求的入口,每个Connector有自己专属的监听端口
Connector有两种:HTTP Connector和AJP Connector
Connector有两种:HTTP Connector和AJP Connector
关于连接器的一些属性太多,这里就不一 一列举,直接上最佳实践
4.1最佳实践
针对以上配置做一个简单介绍:
connectionTimeout | 在将提交的请求URI行呈现之后,连接器将等待接受连接的毫秒数。使用值-1表示没有超时(即无限)。默认值是60000(60秒),但请注意,Tomcat的标准server.xml中,设置为20000(即20秒)。 |
redirectPort | 如果该连接器支持非SSL请求,并且接收到的请求为满足安全约束需要SSL传输, Catalina 将自动将请求重定向到指定的端口号。 |
enableLookups | 若是你想request.getRemoteHost()的调用 履行,以便返回的长途客户端的实际主机名的DNS查询,则设置为true。设置为false时跳过DNS查找,并返回字符串情势的IP地址(从而提高性能)。默认景象下,禁用DNS查找。 |
maxPostSize | 将被容器以FORM URL参数形式处理的最大长度(以字节为单位)的POST。通过设置此属性的值小于或等于0可以禁用该限制。如果没有指定,该属性被设置为2097152(2兆字节) |
URIEncoding | 这将指定使用的字符编码,来解码URI字符。如果没有指定,ISO-8859-1将被使用。 |
acceptCount | 当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。当队列满时收到的任何请求将被拒绝。默认值是100。 |
acceptorThreadCount | 用于接受连接的线程的数量。在一个多CPU的机器上,增加该值,虽然你可能不会真正需要超过2个。此外,有很多非保持活动连接,您可能需要增加这个值。默认值是 1。 |
disableUploadTimeout | 此标志允许servlet容器在数据上传时使用不同的连接超时,通常较长。如果没有指定,该属性被设置为true,禁用上传超时。 |
maxConnections | 在任何给定的时间服务器接受并处理的最大连接数。当这个数字已经达到了,服务器将不会接受任何连接,直到连接的数量降到低于此值。基于acceptCount的设置,操作系统可能仍然接受连接。默认值根据不同的连接器类型而不同。对于BIO,默认的是maxThreads的值,除非使用了Executor,在这种情况下默认值是executor的maxThreads值 。对于NIO的默认值是10000。APR /native的默认值是8192。 需要注意的是Windows系统的APR/native,所配置的值将减少到小于或等于maxConnections的1024的倍数的最大值。这样做是出于性能方面的考虑。 如果设置的值-1,maxConnections功能被禁用,而且连接数将不做计算。 |
SSLEnabled | 在连接器上使用此属性来启用SSL加密传输。如果要打开SSL握手/加密/解密,请设置true。默认值是false。当设置这个值为true时,为了传递正确的request.getScheme()和 request.isSecure()到servlets,你需要设置scheme和secure属性。更多信息请查看SSL支持。 |
5.禁用AJP连接
AJP(Apache JServer Protocol)
AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
如果我们使用了请求转发的工具例如:nginx,是用不着AJP协议,所以把AJP连接器禁用。
对比刚登录的页面,看不到AJP了
6.tomcat的虚拟机参数优化
除了以上内容,我们还可以对tomcat所运行的java虚拟机参数进行一些优化,介于JVM的参数性能调优需要考虑到物理机本身的硬件的好坏,这里就不说明了,推荐阅读,《深入理解JVM与最佳实践》,里面有完整的介绍JVM内存模型与调优。