本文转载自微信公众号“味姐小姐姐”,作者02号狗,转载请联系味姐公众号。老猫雄猫为什么能活到普通猫不能活的年龄?这与其轻巧的结构和优异的性能有关。现在tomcat的版本已经飙到10了!最新版本是10.0.2。Tomcat的配置参数非常多,但是如果要达到优化的效果,我们不需要关注所有的参数。本文将详细介绍一些主要的配置参数,保证你的老猫跑得更快!一般最常见的变化就是修改服务器的端口,也就是server.xml中的Connector部分。一个典型的例子如下图所示:其实大部分的优化也在Connector选项卡里面,从端口、并发到线程,都可以在这里配置。1.3个参数获取并发配置作为可以承载高并发互联网请求的web容器,海量请求的冲击当然首当其冲。好在Tomcat支持NIO,我们可以通过调整线程数和并发配置使其发挥最佳性能。maxThreads--tomcat接收客户端请求的最大线程数,即同时处理任务的数量,其默认大小为200;一般来说,在高并发I/O密集型应用中,这个值设置为1000左右比较合理maxConnections这个参数是指tomcat同时可以接受的最大连接数。对于Java的blockingBIO,默认值为maxthreads的值;如果在BIO模式下使用自定义Executor,则默认值为执行器中maxThreads的值。对于新的JavaNIO模式,maxConnections的默认值是10000,所以我们一般保持这个参数不变。acceptCount--当线程数达到上面设置的值时,可以接受的最大队列数。如果超过这个值,请求将被拒绝。我一般设置成和maxThreads一样大,简单说明一下上面三个参数的关系:系统可以维护的连接数maxConnections+acceptCount。不同的是maxConnections中的连接是可以调度处理的;acceptCount中的连接只能等待排队系统能处理的请求数maxThreads的大小,实际能工作的线程数。幸福指数:maxThreads>maxConnections>acceptCount。有些文章现在满是maxProcessors和minProcessors。但是这两个参数从Tomcat5开始就被deprecated了,从Tomcat6开始就彻底没有了。只能说你看的文章可能真的是不懂技术的运营者发布的。以8表示,具体的配置参数可以查看:https://tomcat.apache.org/tomcat-8.0-doc/config/http.html2.线程配置在并发配置方面,可以看到我们只有minSpareThreads,但没有maxSpareThreads。这是因为,从Tomcat6开始,添加Executor节点,这个参数就没有用了。由于线程是一个池,它的配置符合池的所有特性。参考:https://tomcat.apache.org/tomcat-8.0-doc/config/executor.htmlnamePrefix--每个新开线程的名称前缀maxThreads--线程池最大线程数minSpareThreads--alwaysactive状态下的线程数maxIdleTime--线程的空闲时间,超过空闲时间会销毁这些线程threadPriority--线程在线程池中的优先级,默认为53,得到JVM配置tomcat是一个Java应用程序,因此JVM的Configuration也会影响其性能。比较重要的配置参数如下。2.1.调整内存区域的大小首先是每个分区的大小,但这也取决于垃圾收集器。让我们看看一些全局参数。-XX:+UseG1GC首先指定JVM使用的垃圾收集器。尽量不要依赖默认值来保证它,而是明确指定一个。-Xmx设置堆的最大值,一般为操作系统大小的2/3。-Xms设置堆的初始值,一般设置为与Xmx一样大小,避免动态扩展。-Xmn新生代大小,默认新生代占堆大小的1/3。在高并发和快死的场景下,这个区域可以适当放大。一半或一半,或更多,都可以。但在G1下,这个值不需要设置,会自动调整。-XX:MaxMetaspaceSize限制元空间的大小,一般256M就够了。这通常与设置的初始大小**-XX:MetaspaceSize**相同。-XX:MaxDirectMemorySize设置直接内存的最大值,限制DirectByteBuffer申请的内存。-XX:ReservedCodeCacheSize设置JIT编译后代码存储区的大小。如果观察到这个值有限,可以适当调高,一般就够用了。-Xss设置栈的大小,默认1M,足够了。2.2.内存调优-XX:+AlwaysPreTouch在启动时初始化参数中指定的所有内存,启动时间会变慢,但运行速度会提高。-XX:SurvivorRatio默认值为8。表示Eden区与Survivor区的比例。-XX:MaxTenuringThreshold该值在CMS下默认为6,在G1下默认为15。这个值和我们前面提到的对象提升有关,变化的效果会更明显。可以使用**-XX:+PrintTenuringDistribution**打印对象的年龄分布。如果后代的大小始终相同,则证明一定年龄之后的对象总能晋升到老年代,晋升阈值可以设小。PretenureSizeThreshold超过一定大小的对象会直接分配到老年代。不过这个参数用的不多。2.3.垃圾收集器优化G1垃圾收集器-XX:MaxGCPauseMillis设置了目标暂停时间,G1会尽力去实现。-XX:G1HeapRegionSize设置小堆区域大小。这个值是2的幂,既不太大也不太小。如果您不知道如何设置它,请保留默认值。-XX:InitiatingHeapOccupancyPercent当整个堆内存使用率达到一定百分比(默认为45%)时,会启动并发标记阶段。-XX:ConcGCThreads并发垃圾收集器使用的线程数。默认值因运行JVM的平台而异。不建议修改。4.其他重要配置下面我们来看一下Connector中配置的几个重要参数。enableLookups--调用request,getRemoteHost()执行DNS查询返回远程主机的hostname,如果设置为false则直接返回IP地址。这个要根据需求URIEncoding--用于解码URL的字符编码,不指定默认值为ISO-8859-1connectionTimeout--连接超时时间(以毫秒为单位)在到达SSL传输请求后被重定向5.总结Tomcat是最常用的Web容器,提供数百个配置参数。但是在我们平时的使用中,没有必要把所有的参数都搞清楚,只关注最重要的那些。作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。我的个人微信xjjdog0,欢迎加好友进一步交流。
