vlambda博客
学习文章列表

面试重灾区丨如何搞定Tomcat优化问题?!

今天的话题,要给大家分享的大厂面试题是:高级程序员是如何优化Tomcat的,也许你会说吹牛逼吧老师,优化个 Tomcat 就高级程序员了?吹牛逼吧!

嘿嘿,我承认,优化个 Tomcat成不了高级程序员,但我想表达的意思是,Tomcat优化这块,对于高级程序员是怎么做的,这才是正确的打开方式,我们知道优化的维度有很多,代码优化、硬件优化,JVM 优化,数据库优化,中间件优化等等很多,优化是需要丰富的实战经验达,看似简单的修改一个配置,或一行代码,背后可能是 N 个不眠之夜啊,是还不是。

所以,高级程序员才贵呀,能扛事呀,这才是重点,所以兄弟们,这是我们努力的小目标,钱才是硬道理。

先提三个问题,兄弟们也可以想一想,威哥今天将围绕这三个点来展开介绍:

面试重灾区丨如何搞定Tomcat优化问题?!

互联网大厂关于Tomcat的面试题

(Tomcat 阿里必问题)

面试重灾区丨如何搞定Tomcat优化问题?!

解题思路:注意面试官的预期

面试重灾区丨如何搞定Tomcat优化问题?!

面试官:“仿佛昨天才恋爱,转眼青春就不在。当年那个万人迷,如今已成老太太。”

面试者:“唯有JAVA是真爱,N年过去依然在。当年一句跨平台,如今榜上还头牌。”

(你看Java的持久力是多么的强 ,爱上Java就等于爱上未来啊)

面试官:少拍马屁!讲讲tomcat优化吧。

话锋转得够快呀!对于tomcat的优化,主要是从2个方面入手,一是 tomcat 自身的配置,另一个是 tomcat 所运行的 jvm 的调优,听我细细道来......

面试重灾区丨如何搞定Tomcat优化问题?!

配置 apache-tomcat-8.5.59(注意版本差异)

第一步:cd apache-tomcat-8.5.59/conf

修改配置文件,配置 tomcat 的管理用户(tomcat-users.xml)  

面试重灾区丨如何搞定Tomcat优化问题?!

注意:如果是 tomcat7,配置了 tomcat 用户就可以登录 tomcat 后台管理系统了,但是 tomcat8中不行,还需要修改配置文件:webapps/manager/META-INF/context.xml

面试重灾区丨如何搞定Tomcat优化问题?!

登录Tomcat管理

面试重灾区丨如何搞定Tomcat优化问题?!

优化tomcat连接池  

面试重灾区丨如何搞定Tomcat优化问题?!

tomcat 中每一个用户请求都是一个线程,频繁地创建线程会造成性能浪费,所以可以使用线程池提高性能,修改 conf/server.xml 配置文件。

参数说明:

maxThreads:最大并发数,默认设置是200,一般建议在500~1000,根据硬件设施和业务来判断

minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25

prestartminSpareThreads:在tomcat 初始化的时候就初始化minSpareThreads的参数值,如果不等于 true,minSpareThreads的值就没啥效果了

maxQueueSize:最大的等待队列数,超过则拒绝请求

在 Connector 中设置 executor 属性指向上面的执行器

设置tomcat线程池(执行器)

在页面中显示最大线程为-1,这个说明是正常配置成功,仅仅是显示的问题,实际使用的指定值

优化tomcat运行模式          

面试重灾区丨如何搞定Tomcat优化问题?!

Tomcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一。不过,许多开发人员不知道的是,Tomcat Connector(Tomcat连接器)有bio、nio、apr三种运行模式,那么这三种运行模式有什么区别呢,我们又如何修改Tomcat Connector的运行模式来提高Tomcat的运行性能呢?

下面,我们先大致了解Tomcat Connector的三种运行模式。

bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。

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)更好的并发运行性能。要让Tomcat以nio模式来运行也比较简单,我们只需要在Tomcat安装目录/conf/server.xml文件中将如下配置:

protocol属性值改为org.apache.coyote.http11.Http11NioProtocol即可:

此时,我们就可以在Tomcat Manager中看到当前服务器状态页面的HTTP协议的Connector运行模式已经从http-bio-8080变成了http-nio-8080。

apr(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。

我们这个版本的 tomcat 我们可以看到,默认使用的是 nio 模式,在tomcat8 中还提供了最新的 nio2,速度更快,建议使用 nio2,NIO2是JDK7新增的文件及网络I/O特性,他继承自NIO,同时添加了众多特性及功能改进,其中最重要的即是对异步I/O(AIO)的支持。

优化前 tomcat 的运行模式:        

面试重灾区丨如何搞定Tomcat优化问题?!优化后 tomcat 的运行模式:       

面试重灾区丨如何搞定Tomcat优化问题?!
禁用AJP连接

AJP(Apache JServer Protocol)web 服务器和 Servlet 容器通过 TCP 连接来交互,为了节省 Socket 创建的昂贵代价,web服务器会尝试维护一个永久 TCP连接到 servlet 容器,并且在多个请求和响应周期过程会重用连接,这个协议对 Apache 处理静态内容性能很高。

但是我们一般是使用 nginx+tomcat 的架构,所以用不着 AJP 协议,所以把 AJP 连接器禁用,小伙伴们可以根据自己 tomcat 的版本,修改 conf/server.xml 文件,将 AJP 服务禁用掉即可。

面试重灾区丨如何搞定Tomcat优化问题?!


面试重灾区丨如何搞定Tomcat优化问题?!

Tomcat JVM 参数优化        

面试重灾区丨如何搞定Tomcat优化问题?!

输入JVM 配置参数,根据每个项目的不同,JVM 参数作不同调整,以下是某互联网真实项目配置:        

面试重灾区丨如何搞定Tomcat优化问题?!

参数详解:

-Djava.awt.headless=true 对于一个Java服务器来说经常要处理一些图形元素,例如地图的创建或者图形和图表等要使用AWT,而 AWT 依赖显示设备、键盘和鼠标的主机,通常服务器没有这些硬件设备,这个时候就会报异常,这个参数用来解决这个问题

-Djava.net.preferIPv4Stack=true  禁用 IPV6

-server 服务器启动模式,更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量

-Xms2g 设置JVM初始堆内存 -Xmx2g 设置JVM最大堆内存 -Xmn520m 设置年轻代大小

-Xss256k 是指设定每个线程的堆栈大小。一般设置不超过1M,要不然容易出现out of memory。

-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

-XX:MaxPermSize设置最大非堆内存的大小,默认是32M,建议达到物理内存的1/4

-XX:+DisableExplicitGC 禁用显示GC,即代码中调用 System.gc()无效

-XX:+UseConcMarkSweepGC  使用 CMS 垃圾收集器

-XX:+CMSParallelRemarkEnabled 降低标记停顿

-XX:+UseCMSCompactAtFullCollection  在full GC时做压缩,使 memory 碎片减少

-XX:LargePageSizeInBytes=128m 单个页大小调整,Java进程占用最大内存

-XX:+UseFastAccessorMethods get,set 方法转成本地代码(对于jvm来说是冗余代码,jvm将进行优化)

-XX:+UseCMSInitiatingOccupancyOnly 如果不指定, 只是用设定的回收阈值CMSInitiatingOccupancyFraction,则JVM仅在第一次使用设定值,后续则自动调整会导致上面的那个参数不起作用。

-XX:CMSInitiatingOccupancyFraction=70 是指设定CMS在对内存占用率达到70%的时候开始GC

测试配置是否成功

面试重灾区丨如何搞定Tomcat优化问题?!

小结:

本回合面试题,涉及的点分为两大块:

1、Tomcat 本身的优化:优化线程池、优化tomcat运行模式以及 AJP 协议禁用

2、JVM 参数优化

面试重灾区丨如何搞定Tomcat优化问题?!

保持高薪增长的法宝

当然面试本身还可能扩展其它问题,就如我们本节开篇讲到的:保持高薪增长的法宝又是啥?保持学习力

为什么有人可以成长为架构师,CTO,能过技术让自己和家人实现美好生活,既然靠技术吃饭,那就去做到极致,技术路线完全可以承载你的梦想,有人说,做技术是青春饭,或者后面都转管理,我的理解这是错的,技术+管理,而不是转管理,才是正确的发展路线,而这个路线让你工作到退休都没问题。

面试重灾区丨如何搞定Tomcat优化问题?!

好的兄 弟们,如果你从开篇坚持到这里,说明你一定是个积极上进,可能自我突破的人, 交个朋友,欢迎勾搭威哥,Java路上,我们一起成长。

   往期精彩  






面试重灾区丨如何搞定Tomcat优化问题?!

面试重灾区丨如何搞定Tomcat优化问题?!

扫码添加助理老师

领取课程源码、资料




关注“Java架构栈”,跟着威哥学Java!