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

[经验分享] Tomcat7优化

[复制链接]

尚未签到

发表于 2018-12-7 10:47:50 | 显示全部楼层 |阅读模式
Tomcat7优化
  强调内容服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响,所以学习了通过优化tomcat提高网站的并发能力。
1. 优化配置
1. 配置tomcat管理员账户
  在conf/ tomcat-users.xml下添加用户:
1234512345  启动tomcat,登录查看信息:http://127.0.0.1:8080/


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问题,大幅度的提高性能.
2.1.启动NIO模式
  修改server.xml里的Connector节点,修改protocol为org.apache.coyote.http11.Http11NioProtocol


3.执行器(线程池)
  在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。
  tomcat7默认就是线程池,默认最小10,最大是200
3.1.开启并且使用
  配置:
3.2. 参数说明
AttributeDescriptionthreadPriority (优先级)(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 truenamePrefix(名称前缀)(String)The name prefix for each thread created by the executor. The thread name for an individual thread will be namePrefix+threadNumbermaxThreads(最大线程数)(int)The max number of active threads in this pool, default is 200minSpareThreads(最小活跃线程数) (int)The minimum number of threads always kept alive, default is 25maxIdleTime(空闲线程等待时间) (int)The number of milliseconds before an>3.3. 最佳实践
4. 连接器(Connector)
  Connector是Tomcat接收请求的入口,每个Connector有自己专属的监听端口
  Connector有两种:HTTP Connector和AJP Connector
4.1. 通用属性(高亮的是重点)
AttributeDescriptionallowTraceA boolean value which can be used to enable or disable the TRACE HTTP method. If not specified, this attribute is set to false.如果需要服务器能够处理用户的HAED/TRACE请求,这个值应该设置为true,默认值是falseasyncTimeoutThe default timeout for asynchronous requests in milliseconds. If not specified, this attribute is set to 10000 (10 seconds).默认超不时候以毫秒为单位的异步恳求。若是没有指定,该属性被设置为10000(10秒)。enableLookupsSet to true if you want calls to request.getRemoteHost() to perform DNS lookups in order to return the actual host name of the remote client. Set to false to skip the DNS lookup and return the IP address in String form instead (thereby improving performance). By default, DNS lookups are disabled.若是你想request.getRemoteHost()的调用 履行,以便返回的长途客户端的实际主机名的DNS查询,则设置为true。设置为false时跳过DNS查找,并返回字符串情势的IP地址(从而提高性能)。默认景象下,禁用DNS查找。maxHeaderCountThe maximum number of headers in a request that are allowed by the container. A request that contains more headers than the specified limit will be rejected. A value of less than 0 means no limit. If not specified, a default of 100 is used.容器允许的请求头字段的最大数目。请求中包含比指定的限制更多的头字段将被拒绝。值小于0表示没有限制。如果没有指定,默认设置为100。maxParameterCountThe maximum number of parameter and value pairs (GET plus POST) which will be automatically parsed by the container. Parameter and value pairs beyond this limit will be ignored. A value of less than 0 means no limit. If not specified, a default of 10000 is used. Note that FailedRequestFilter filtercan be used to reject requests that hit the limit.将被容器自动解析的最大数量的参数和值对(GET加上POST)。参数值对超出此限制将被忽略。值小于0表示没有限制。如果没有指定,默认为10000。请注意, FailedRequestFilter 过滤器可以用来拒绝达到了极限值的请求。maxPostSizeThe maximum>4.2. 标准实现(高亮的是重点)
  除了上面列出的常见的连接器属性,标准的HTTP连接器(BIO,NIO和APR/native)都支持以下属性。
AttributeDescriptionacceptCountThe maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full will be refused. The default value is 100.当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。当队列满时收到的任何请求将被拒绝。默认值是100。acceptorThreadCountThe number of threads to be used to accept connections. Increase this value on a multi CPU machine,>4.3. NIO的具体配置
AttributeDescriptionpollerThreadCount(int)The number of threads to be used to run for the polling events. Default value is 1 per processor up to and including version 7.0.27. Default value as of version 7.0.28 is 1 per processor but not more than 2.When accepting a socket, the operating system holds a global lock. So the benefit of going above 2 threads diminishes rapidly. Having more than one thread is for system that need to accept connections very rapidly. However usually just increasing acceptCount will solve that problem. Increasing this value may also be beneficial when a large amount of send file operations are going on.(int)用来处理轮询事件的线程的数量。在版本7.0.27及以前版本,默认值是每个处理器1个。版本7.0.28的默认值是每个处理器1个,但不超过2个。当接受一个套接字,操作系统拥有全局的锁。所以超过2个线程的好处而迅速减小。有一个以上的线程是因为系统需要非常迅速地接受连接。但通常只要增加acceptCount值就可以解决这个问题。增加该值也可能是有用的,当大量发送文件操作发生的时候。pollerThreadPriority(int)The priority of the poller threads. The default value is 5 (the value of thejava.lang.Thread.NORM_PRIORITY constant). See the JavaDoc for the java.lang.Thread>4.4. 最佳实践

2. 禁用AJP连接器
  AJP(Apache JServer Protocol)
  AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
  我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。
  在管理界面中看不到ajp了:
3. JVM参数的优化
  适当调整Tomcat的运行JVM参数可以提升整体性能。
1. JVM内存模型
1.1. Java栈
  Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。
1.2. Java堆
  Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。
1.3. Java堆的分区
  JVM堆一般又可以分为以下三部分:
  ◆ Young 年轻区(代)
  Young区被划分为三部分,Eden区和两个大小严格相同的Survivor区,其中,Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在Eden区间变满的时候, GC就会将存活的对象移到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到Tenured区间。
  ◆ Tenured 年老区
  Tenured区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Young复制转移一定的次数以后,对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存,缓存中的对象往往会被转移到这一区间。
  ◆ Perm 永久区
  Perm代主要保存class,method,filed对象,这部份的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到java.lang.OutOfMemoryError : PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题。
  Virtual区:
  最大内存和初始内存的差值,就是Virtual区。
1.4. 设置区大小
  JVM提供了相应的参数来对内存大小进行配置。正如上面描述,JVM中堆被分为了3个大的区间,同时JVM也提供了一些选项对Young,Tenured的大小进行控制。
  ◆ Total Heap
  -Xms :指定了JVM初始启动以后初始化内存
  -Xmx:指定JVM堆得最大内存,在JVM启动以后,会分配-Xmx参数指定大小的内存给JVM,但是不一定全部使用,JVM会根据-Xms参数来调节真正用于JVM的内存
  -Xmx -Xms之差就是三个Virtual空间的大小
  ◆ Young Generation
  -XX:NewRatio=8意味着tenured 和 young的比值8:1,这样eden+2*survivor=1/9
  堆内存
  -XX:SurvivorRatio=32意味着eden和一个survivor的比值是32:1,这样一个Survivor就占Young区的1/34.
  -Xmn 参数设置了年轻代的大小
  ◆ Perm Generation
  -XX:PermSize=16M -XX:MaxPermSize=64M
  Thread Stack
  -XX:Xss=128K
2. 常用参数
  修改文件:bin/catalina.sh
  JAVA_OPTS=”“-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewRatio=2 -XX:MaxTenuringThreshold=50 -XX:+DisableExplicitGC”“
  参数说明:
  1、 file.encoding 默认文件编码
  2、 -Xmx1024m 设置JVM最大可用内存为1024MB
  3、 -Xms1024m 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
  4、 -XX:NewSize 设置年轻代大小
  5、 XX:MaxNewSize 设置最大的年轻代大小
  6、 -XX:PermSize 设置永久代大小
  7、 -XX:MaxPermSize 设置最大永久代大小
  8、 -XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5
  9、 -XX:MaxTenuringThreshold=0:设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
  10、 -XX:+DisableExplicitGC这个将会忽略手动调用GC的代码使得 System.gc()的调用就会变成一个空调用,完全不会触发任何GC
3. 在tomcat中设置JVM参数
3.1. windows
  修改bin/catalina.bat文件设置参数(第一行)
  set JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC
3.2. linux
  修改bin/catalina.sh文件参数(第一行)
  JAVA_OPTS=”“-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC”“



运维网声明 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-644287-1-1.html 上篇帖子: 如何登陆Tomcat的控制台(Web管理界面) 下篇帖子: Tomcat启动脚本catalina.sh---解读
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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