Tomcat7性能优化

  用了很久的Tomcat,没怎么看过它的优化,今天抽出时间研究了下,将内容记录下。

首先,是客户端访问tomcat的一个过程,如图所示:

图中间虚线框部分是 Apache基金下的服务器来做静态资源处理的,而这部分需要花费大量时间,当用nginx和tomcat做企业级集群的时候,需要禁用掉AJP协议。


一、准备工作:

1. 配置管理员帐户:

  进入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. 优化方法

  (1)在浏览器中输入 http://localhost:8080/,点击页面中 Server Status,可以看到默认tomcat中的JVM、HTTP、AJP协议、连接池是否启用等,可以通过修改页面上显

示的参数来优化tomcat。

  (2)在server.xml中进行更加深入的配置。

二、优化

1. 禁用AJP协议

  (1)通过禁用AJP协议,达到在集群的时候提高处理请求的时间。

  图1

  (2)启动tomcat后,不论从刚刚的管理员界面,还是从控制台上(如图1所示)都可以看出,AJP协议是开启的。

  我们要做的就是要将此协议禁用,禁用方法:在server.xml中,将  

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

  注释掉,重新启动tomcat,可以看出控制台上已经不存在上图 黑框中所示的。

2. 将BIO通讯模式修改为NIO通讯模式

  (1)tomcat通讯协议支持http1.0和1.1,tomcat默认走的是BIO通讯模式,tomcat7和tomcat8之所以默认的都是效率低下的BIO通讯模式,是因为和前面的就项目做兼容。

  (2)在控制台上(如图1所示)或者管理界面都可以看到,tomcat启动的通讯模式是bio的。

  (3)应用场景:tomcat集群的时候,若项目比较新,都是1.5类库之前,即JDK版本大于1.5,可将集群中每一个tomcat的启动模式设置为高并发高性能的应答模式(NIO)。

  (4)配置方法:在server.xml中 ,将 <Connector connectionTimeout="20000" port="8066" protocol="HTTP/1.1" redirectPort="8448"/> 改为:  

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

  其中,原来的protocol="HTTP/1.1"表示遵循http1.1协议,同时,也是一个最原始的未经优化的通信协议,

  修改之后的 protocol="org.apache.coyote.http11.Http11NioProtocol" ,表示以 NIO模式启动。

3. 启用外部连接池,来满足高并发已经复用的请求

  图2

    maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200。将  

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="300" minSpareThreads="4"/>

  注释打开,并修改maxThreads的值,然后在<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol"/>

  中加入 executor="tomcatThreadPool",即最后为:  

<Connector connectionTimeout="20000" port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"/>

      根据业务场景和服务器硬件资源条件可以适当的加大线程连接池,根据第三方工具去开启并发测试来确定一个最好的连接池数。

4. 优化连接器

  最佳实践:  

<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"enableLookups="false"maxPostSize="10485760"URIEncoding="UTF-8" useBodyEncodingForURI="true"acceptCount="100"acceptorThreadCount="2"disableUploadTimeout="true" maxConnections="10000"SSLEnabled="false"/>

5. 在tomcat中设置JVM参数

  修改bin/catalina.bat文件设置参数(注释后第一行),增加  

  set JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPerPermSize=356m -XX:NewRatio=2 -XX:MaxTenuringThreshold=50 -XX:+DisableExplicitGC

   -Xms:设置JVM初始内存大小(默认是物理内存的1/64)

   -Xmx:设置JVM可以使用的最大内存(默认是物理内存的1/4,建议:物理内存80%)

   -Xmn:设置JVM最小内存(128-256m就够了,一般不设置)

   默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、

-Xmx相等以避免在每次GC 后调整堆的大小。  

   在较大型的应用项目中,默认的内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误“java.lang.OutOfMemoryError:Java heap space”,从而

导致客户端显示500错误。  

  -XX:PermSize :为JVM启动时Perm的内存大小  

  -XX:MaxPermSize :为最大可占用的Perm内存大小(默认为32M) 

  -XX:MaxNewSize,默认为16M


  PermGen space的全称是Permanent Generationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到

PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的

话,就很可能出现“java.lang.OutOfMemoryError:PermGen space”错误。

对于WEB项目,jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小,为了避免调整),你可以使用更多的参数配置。如果你的WEBAPP下都用了大量的第三

方jar, 其大小超过了jvm默认的大小,那么就会产生此错误信息了。


其它参数:

  -XX:NewSize :默认为2M,此值设大可调大新对象区,减少FullGC次数

  -XX:NewRatio :改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)

  -XX:SurvivorRatio :改变Eden对象空间和残存空间的尺寸比例,意思是Eden对象空间的尺寸比残存空间大survivorRatio+2倍(缺省值是10)

  -XX:userParNewGC 可用来设置并行收集【多CPU】

  -XX:ParallelGCThreads 可用来增加并行度【多CPU】

  -XXUseParallelGC 设置后可以使用并行清除收集器【多CPU】

  

转载于:https://www.cnblogs.com/xbq8080/p/6417671.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python解析式

《python的各种推导式&#xff08;列表推导式、字典推导式、集合推导式&#xff09;》 推导式comprehensions&#xff08;又称解析式&#xff09;&#xff0c;是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导&#xff0c;在…

Fast Image Cache – iOS 应用程序高性能图片缓存

Fast Image Cache 是一种在 iOS 应用程序中高效、持续、超快速的存储和检索图像的解决方案。任何良好的 iOS 应用程序的用户体验都应该是快速&#xff0c;平滑滚动的&#xff0c;Fast Image Cache 提供图像高速缓存有助于使这更容易实现。 对于图片丰富的应用程序&#xff0c;图…

Linux 字符设备驱动开发基础(四)—— ioctl() 函数解析

解析完 open、close、read、write 四个函数后&#xff0c;终于到我们的 ioctl() 函数了 一、 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理&#xff0c;就是对设备的一些特性进行控制&#xff0c;例如串口的传输波特率、马达的转速…

Python中xrange和range异同

https://www.cnblogs.com/zhuzhubaoya/p/6381045.html

android自动化框架简要剖析(一):运行原理+基本框架

android自动化测试原理&#xff1a; 1、将测试apk和被测试apk&#xff0c;运行在一个进程中&#xff1b;通过instrumentation进行线程间的通信 2、通过android.test.AndroidTestCase及其子类&#xff0c;控制android系统对象 3、通过android.test.InstrumentationTestCase 及其…

Python的threading多线程

https://www.cnblogs.com/tkqasn/p/5700281.html threading — 基于线程的并行 threading用于提供线程相关的操作&#xff0c;线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组&#xff0c;线程也不能被停止、暂停、恢复、中断。 threading模…

Linux 字符设备驱动开发基础(一)—— 编写简单 LED 设备驱动

现在&#xff0c;我们来编写自己第一个字符设备驱动 —— 点亮LED。&#xff08;不完善&#xff0c;后面再完善&#xff09; 硬件平台&#xff1a;Exynos4412&#xff08;FS4412&#xff09; 编写驱动分下面几步&#xff1a; a -- 查看原理图、数据手册&#xff0c;了解设备的操…

angularJS+requireJS实现controller及directive的按需加载

最近因为项目的比较大&#xff0c;需要加载的js文件较多&#xff0c;为了提高首屏页面的加载速度&#xff0c;需要对js文件进行按需加载&#xff0c;然后网上参考了一些资料&#xff0c;自己也深入研究一番之后&#xff0c;实现了按需加载控制器js文件及指令js文件的效果&#…

Linux 字符设备驱动结构(四)—— file_operations 结构体知识解析

前面在 Linux 字符设备驱动开发基础 &#xff08;三&#xff09;—— 字符设备驱动结构&#xff08;中&#xff09; &#xff0c;我们已经介绍了两种重要的数据结构 struct inode{...}与 struct file{...} &#xff0c;下面来介绍另一个比较重要数据结构 struct _file_operatio…

Android开发群

为什么80%的码农都做不了架构师&#xff1f;>>> 我的自建Android应用开发群&#xff0c;欢迎大家来聊聊呀&#xff01;201427584 转载于:https://my.oschina.net/catia/blog/176384

Python的multiprocessing多进程

https://www.cnblogs.com/tkqasn/p/5701230.html 由于GIL的存在&#xff0c;python中的多线程其实并不是真正的多线程&#xff0c;如果想要充分地使用多核CPU的资源&#xff0c;在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing&#xff0…

Linux 字符设备驱动结构(三)—— file、inode结构体及chardevs数组等相关知识解析

前面我们学习了字符设备结构体cdev Linux 字符设备驱动开发 &#xff08;一&#xff09;—— 字符设备驱动结构&#xff08;上&#xff09; 下面继续学习字符设备另外几个重要的数据结构。 先看下面这张图&#xff0c;这是Linux 中虚拟文件系统、一般的设备文件与设备驱动程序…

Python的gevent协程及协程概念

https://www.cnblogs.com/tkqasn/p/5705338.html 何为协程 协程&#xff0c;又称微线程。英文名Coroutine。 协程最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换&#xff0c;而是由程序自身控制&#xff0c;因此&#xff0c;没有线程切换的开销&#xff0c;…

技术人生:三亚之行

人生收获 此次是公司组团去的三亚&#xff0c;地接的导游非常热情&#xff0c;如同大多数人一样&#xff0c;导游也会在这短短的几天内&#xff0c;尽可能的表现自己&#xff0c;此文聊聊导游说的三句话。 旅游三不“较”&#xff1a; 不比较不计较不睡觉人生何尝不是如此&…

Linux 字符设备驱动结构(二)—— 自动创建设备节点

上一篇我们介绍到创建设备文件的方法&#xff0c;利用cat /proc/devices查看申请到的设备名&#xff0c;设备号。 第一种是使用mknod手工创建&#xff1a;mknod filename type major minor 第二种是自动创建设备节点&#xff1a;利用udev&#xff08;mdev&#xff09;来实现设备…

Python数据库使用-SQLite

https://www.liaoxuefeng.com/wiki/897692888725344/926177394024864 SQLite是一种嵌入式数据库&#xff0c;它的数据库就是一个文件。由于SQLite本身是C写的&#xff0c;而且体积很小&#xff0c;所以&#xff0c;经常被集成到各种应用程序中&#xff0c;甚至在iOS和Android的…

Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析

一、字符设备基础知识 1、设备驱动分类 linux系统将设备分为3类&#xff1a;字符设备、块设备、网络设备。使用驱动程序&#xff1a; 字符设备&#xff1a;是指只能一个字节一个字节读写的设备&#xff0c;不能随机读取设备内存中的某一数据&#xff0c;读取数据需要按照先后数…

Python数据库使用MySQL

https://www.liaoxuefeng.com/wiki/897692888725344/932709047411488 MySQL是Web世界中使用最广泛的数据库服务器。SQLite的特点是轻量级、可嵌入&#xff0c;但不能承受高并发访问&#xff0c;适合桌面和移动应用。而MySQL是为服务器端设计的数据库&#xff0c;能承受高并发访…

Linux 驱动开发之内核模块开发(四)—— 符号表的导出

Linux内核头文件提供了一个方便的方法用来管理符号的对模块外部的可见性,因此减少了命名空间的污染(命名空间的名称可能会与内核其他地方定义的名称冲突),并且适当信息隐藏。 如果你的模块需要输出符号给其他模块使用,应当使用下面的宏定义: EXPORT_SYMBOL(name); EXPORT_SYMBO…

Python的time模块和datatime模块

https://www.cnblogs.com/tkqasn/p/6001134.html