todo架构&系统设计

Tomcat并发优化解决办法

2019-05-08  本文已影响0人  喊我小王吧

Tomcat并发优化

1横向扩展 采用集群

单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作。

参考链接:https://blog.csdn.net/weixin_38361347/article/details/82629025

2 利用nginx 动静分离

    对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了Nginx作为缓存服务器,将图片、css、js文件都进行了缓存,有效的减少了后端tomcat的访问。

3 本身优化tomcat

Tomcat支持三种接收请求的处理方式:BIO、NIO、APR :

BIO

一个线程处理一个请求,缺点:并发量高时,线程数较多,浪费资源 (Tomcat7或以下,在Linux系统中默认使用这种方式。)

NIO

利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求(Tomcat8在Linux系统中默认使用这种方式,Tomcat7必须修改Connector配置 protocol="org.apache.coyote.http11.Http11NioProtocol" 来启动)

APR

APR是使用原生C语言编写的非堵塞I/O,利用了操作系统的网络连接功能,速度很快( Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。但必须安装apr插件否则以bio方式启动,Linux如果安装了apr和native,Tomcat直接启动就支持apr。(安装方法:http://my.oschina.net/lsw90/blog/181161))

若想修改启动模式:

修改配置文件server.xml中

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

修改为(这里修改为nio)

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />

org.apache.coyote.http11.Http11NioProtocol : 表示nio处理类
org.apache.coyote.http11.Http11AprProtocol :表示apr 模式
HTTP/1.1 : 表示bio 模式

三种模式默认配置如下:

bio server.xml 配置

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

nio server.xml 配置

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
           connectionTimeout="20000"
           redirectPort="8443" />

apr server.xml 配置

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
           connectionTimeout="20000"
           redirectPort="8443" />

三种模式之中 apr , nio ,bio 效率性能逐一降低。

Tomcat启动的时候,可以通过log看到Connector使用的是哪一种运行模式:

Starting ProtocolHandler ["http-bio-8080"]
Starting ProtocolHandler ["http-nio-8080"]
Starting ProtocolHandler ["http-apr-8080"]

(1) tomcat并发参数

调整线程池线程大小为:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="20" maxSpareThreads="50" maxIdleTime="60000"/>

默认配置下,Tomcat 会为每个连接器创建一个绑定的线程池(最大线程数 200),服务启动时,默认创建了 5 个空闲线程随时等待用户请求

maxThreads:最大的并发请求数,当cpu利用率高的时候,不宜增加线程的个数,当cpu利用率不高,大部分是io阻塞类的操作时,可以适当增加该值。
minSpareThreads:最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。
maxSpareThreads:Tomcat连接器的最大空闲 socket 线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。

以上三个参数,最大线程设置了500,实际根据自己的机器配置设置(也根据自己机器系统内核参数配置),设置越大月耗费内存和cpu,cpu上下文切换频繁,影响处理请求。
最小空闲线程数20,现成最大空闲时间是60s

(2) tomcat并发配置
在conf下的server.xml文件中<Connector>节点进行配置

<Connector port="8080" protocol="HTTP/1.1"
     connectionTimeout="30000"
     redirectPort="8443"
     maxThreads="400"
     minSpareThreads="50"
     maxSpareThreads="200"
     acceptCount="400"
     enableLookups="false"
     disableUploadTimeout="true"     />

URIEncoding:指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它 WEB 服务器软件配置方便,需要分别指定。

connnectionTimeout: 网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒,可根据检测实际情况,适当修改。

enableLookups: 是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为 false。

disableUploadTimeout:上传时是否使用超时机制。

connectionUploadTimeout:上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。

keepAliveTimeout:长连接最大保持时间(毫秒),表示在下次请求过来之前,Tomcat 保持该连接多久,默认是使用 connectionTimeout 时间,-1 为不限制超时。

maxKeepAliveRequests:表示在服务器关闭之前,该连接最大支持的请求数。超过该请求数的连接也将被关闭,1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间。

compression:是否对响应的数据进行 GZIP 压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽。

compressionMinSize:表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048。

compressableMimeType:压缩类型,指定对哪些类型的文件进行数据压缩。

noCompressionUserAgents="gozilla, traviata": 对于以下的浏览器,不启用压缩。

如果已经对代码进行了动静分离,静态页面和图片等数据就不需要 Tomcat 处理了,那么也就不需要配置在 Tomcat 中配置压缩了。

以上是一些常用的配置参数属性,当然还有好多其它的参数设置,还可以继续深入的优化,HTTP Connector 与 AJP Connector 的参数属性值,可以参考官方文档的详细说明:

https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html

更多参考: https://blog.csdn.net/why_768/article/details/53954299
https://blog.csdn.net/wanglei_storage/article/details/50225779
https://blog.csdn.net/loyachen/article/details/47280237

上一篇下一篇

猜你喜欢

热点阅读