设为首页 收藏本站
查看: 816|回复: 0

[经验分享] Centos Tomcat 调优

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-26 09:49:41 | 显示全部楼层 |阅读模式
Tomcat可以从内存、并发、缓存等方面进行优化

1、Tomcat内存优化:

在 tomcat 的启动脚本 catalina.sh 中设置java_OPTS 参数
JAVA_OPTS=’-Xms2048m-Xmx2048m -XX:PermSize=512M -XX:MaxPermSize=1024m’

参数说明:
-server                                                  启用jdk 的server 版;
-Xms                                                       Java虚拟机初始化时的最小内存;
-Xmx                                                      Java虚拟机可使用的最大内存;
-XX:PermSize                                        内存永久保留区域
-XX:MaxPermSize                                 内存最大永久保留区域

验证:
设置成功后我们可以利用JDK自带的工具进行验证,这些工具都在JAVA_HOME/bin目录下:
1)jps:用来显示本地的java进程,以及进程号,进程启动的路径等。
2)jmap:观察运行中的JVM物理内存的占用情况,包括Heapsize , Perm size 下载地址 等。
进入JAVA_HOME/bin目录下或者使用软链接等方式,然后输入jps和jmap命令。

2、Tomcat并发优化:

Connector 优化

Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以 Connector的优化是重要部分。默认情况下 Tomcat只支持200线程访问,超过这个数量的连接将被等待甚至超时放弃,所以我们需要提高这方面的处理能力。

Tomcat官网Connector参数属性:https://tomcat.apache.org/tomcat-8.0-doc/config/http.html,参数非常多,我们这里只介绍一些常用的


<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
connectionTimeout="20000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>

参数说明:
port                                                         代表Tomcat监听端口,也就是网站的访问端口,默认为8080,可以根据需要改成其他
protocol                                                  代表协议类型,可选类型有四种,分别为BIO(阻塞型IO),NIO,NIO2和APR
maxHttpHeaderSize                               请求和响应的HTTP头的最大大小,以字节为单位指定。如果没有指定,这个属性被设置为8192(8 KB)。
maxThreads                                      客户请求最大线程数,也就是可以处理的同时请求的最大数目,如果未指定,默认为200
minSpareThreads                                  Tomcat初始化时创建的socket 线程数,线程的最小运行数目,这些始终保持运行,如果未指定,默认值为10
maxSpareThreads                                 Tomcat连接器的最大空闲socket 线程数
connectionTimeout                                代表连接超时时间,单位为毫秒,默认值为60000。通常情况下设置为30000
minProcessors                                      服务器创建时的最小处理线程数
maxProcessors                                     服务器同时最大处理线程数
enableLookups                                     关闭DNS反向查询,若设为true,则支持域名解析,可把ip 地址解析为主机名
URIEncoding                                         URL统一编码
acceptCount                                         监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads),如果未指定,默认值为100
redirectPort                                           在需要基于安全通道的场合,把客户请求转发到基于SSL的redirectPort 端口
disableUploadTimeout                           这个标志允许servlet Container在一个servlet执行的时候,使用一个不同的,更长的连接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上载的时候更长的超时时间。如果没                                                                有指定,设为false。

参数详解:
1)protocol
a)BIO:BIO(BlockingI/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。BIO配置采用默认即可。
b)NIO:NIO(NewI/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Javanio是一个基于缓冲区、并能提供非阻塞I/O操作的JavaAPI,因此nio也被看成是non-blockingI/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。要让Tomcat以nio模式来运行也比较简单,我们只需要protocol类型修改为:
//NIO
protocol="org.apache.coyote.http11.Http11NioProtocol"
//NIO2
protocol="org.apache.coyote.http11.Http11Nio2Protocol"

c)APR:APR(ApachePortable Runtime/Apache可移植运行时),是ApacheHTTP服务器的支持库。你可以简单地理解为:Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高 Tomcat对静态文件的处理性能。 与配置 NIO运行模式一样,也需要将对应的Connector节点的 protocol属性值改为:

protocol="org.apache.coyote.http11.Http11AprProtocol"


2)maxThreads:由该连接器创建的处理请求线程的最大数目,也就是可以处理的同时请求的最大数目。如果未配置默认值为200。如果一个执行器与此连接器关联,则忽略此属性,因为该属性将被忽略,所以该连接器将使用执行器而不是一个内部线程池来执行任务。maxThreads是一个重要的配置属性,maxThreads配置的合理直接影响了Tomcat的相关性能,所以这里我们重点讨论下。
       maxThreads并不是配置的越大越好,事实上你即使配置成999999也是没有用的,因为这个最大值是受操作系统及相关硬件所制约的,并且最大值并不一定是最优值,所以我们追寻的应该是最优值而不是最大值。
       QPS(Query Per Second):每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。我们常常使用 QPS值来衡量一个服务器的性能。
       QPS = 并发数 / 平均响应时间
       或者
       并发数 = QPS * 平均响应时间
       一个系统吞吐量通常由QPS、并发数两个因素决定,每套系统的这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。所谓吞吐量这里可以理解为每秒能处理请求的次数。
       所以选择一个合理的 maxThreads值,其实并不是那么容易的事。因为过多的线程只会造成,更多的内存开销,更多的CPU开销,但是对提升QPS确毫无帮助;找到最佳线程数后通过简单的设置,可以让web系统更加稳定,得到最高,最稳定的QPS输出。
       我们可以通过以下几种方式来获取 maxThreads的最佳值:
       (1)通过线上系统不断使用和用户的不断增长来进行性能测试,观察QPS,响应时间,这种方式会在爆发式增长时系统崩溃,如双12等。
       (2)根据公式计算,服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) *cpu数量,这种方式有时会被误导,因为某些系统处理环节可能会耗时比较长,从而影响公式的结果。
       (3)单、多用户压力测试,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值的附近应该就是最佳线程数量,这种方式理想场景比较适用,实际情况会比这个复杂的多。
       (4)根据系统的自身情况调整,如硬件限制,系统限制,程序处理能力限制等。
       (5)定期修改为不同的 maxThreads值,看服务器响应结果及用户反应。
       QPS和线程数的关系
       (1)在最佳线程数量之前,QPS和线程是互相递增的关系,线程数量到了最佳线程之后,QPS持平,不在上升,甚至略有下降,同时相应时间持续上升。
       (2)同一个系统而言,支持的线程数越多(最佳线程数越多而不是配置的线程数越多),QPS越高。
       QPS和响应时间的关系
       (1)对于一般的web系统,响应时间一般有CPU执行时间+IO等待时间组成。
       (2)CPU的执行时间减少,对QPS有实质的提升,IO时间的减少,对QPS提升不明显。如果要想明显提升QPS,优化系统的时候要着重优化CPU消耗大户。
       所以想要找出 maxThreads的最优值可并不容易,没有最好只有更好,更好的值只能通过时间来显现,如果你不想考虑那么多,一般情况下设置成1000即可。

3)acceptCount:当所有可能的请求处理线程都在使用时传入连接请求的最大队列长度。如果未指定,默认值为100。一般是设置的跟 maxThreads一样或一半,此值设置的过大会导致排队的请求超时而未被处理。所以这个值应该是主要根据应用的访问峰值与平均值来权衡配置。

4)maxConnections:在任何给定的时间内,服务器将接受和处理的最大连接数。当这个数字已经达到时,服务器将接受但不处理,等待进一步连接。NIO与NIO2的默认值为10000,APR默认值为8192。


3、Tomcat缓存优化:
  compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"

参数说明:
compression                                          打开压缩功能
compressionMinSize                             启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType                       压缩类型
connectionTimeout                                定义建立客户连接超时的时间.如果为 -1,表示不限制建立客户连接的时间

整合的配置:
<Connectorport="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-319514-1-1.html 上篇帖子: Centos7上安装tomcat 下篇帖子: tomcat进程监控
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表