大聪明教你学Java | 面试官:谈谈你对 Tomcat 调优的看法

大聪明教你学Java | 面试官:谈谈你对 Tomcat 调优的看法,第1张

前言

🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
🍊支持作者: 点赞👍、关注💖、留言💌~

这几天大明白面试了一家新的公司,他面试结束后给大聪明发了一条消息:兄弟,Tomcat 的调优你了解不?大聪明看到这个问题之后,就开始从大脑中搜索答案,但是很遗憾,大聪明的大脑中并未存储相关知识😔… 但是大聪明并未放弃,便开启了求知之路。

求知之路

如果我们使用 SSM 框架开发了一个应用软件,并将其部署到 Tomcat 下运行,那么对这个应用软件来说,Tomcat 是首,SSM 是中,JVM 是尾,我们通常对于 SSM 框架是比较了解的,但是却忽略了首尾。其实 Tomcat 在目前的网络编程中所处的地位是举足轻重的,但我们却对 Tomcat 中很多原理性的东西并不了解,如果我们能够掌握 Tomcat 的原理,就会给我们带来莫大的收益,下面就讲一下大聪明对 Tomcat 性能优化的一些了解。

Tomcat 调优

我们可以通过很多方面来对 Tomcat 进行调优,比如内存优化、线程优化、IO 优化,接下来我们就以 Windows 下的 Tomcat 为例,从这三个角度来看看如何对 Tomcat 进行调优。

Tomcat 的内存优化

Tomcat 对内存和线程的默认配置都是很低的,如果我们直接使用 Tomcat 的默认配置作为生产环境,则很容易成为性能瓶颈,一旦我们的应用在启动后占用了大量内存,就很容易导致应用崩溃宕机。为了解决此类问题,我们就需要告诉 JVM 我们要一块大内存,而调优内存则是最直接的索要内存的方式。我们打开 Tomcat 下的 catalina.bat 文件(Tomcat根目录/bin/catalina.bat),可以看到这样一行配置👇


JAVA_OPTS 就是用来设置 JVM 相关运行参数的变量。当我们需要让 Tomcat 使用较大的内存时,我们只需要在这行配置之下新增一条新的配置即可

JAVA_OPTS = “-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】”

🍎 我们举一个更具体的例子,比如 JAVA_OPTS=“-Xms256m -Xmx512m”,他代表的含义就是:设置初始化内存为256MB,设置可以使用的最大内存为512MB。

Tomcat 的线程优化

在上面我们提到了 Tomcat 所给出的默认内存配置和线程配置都很低,所以我们也避免不了对 Tomcat 的线程进行优化。我们打开 Tomcat 下的 server.xml 文件(Tomcat根目录/conf/server.xml),可以看到这样一行配置👇

这行配置我们肯定都不陌生吧(设置 Tomcat 的访问端口可离不开他)~ 当我们需要对 Tomcat 的线程进行优化时,我们只需要在这行配置中增加几个参数即可:

  • 🍋参数一: maxThreads=“X”,Tomcat 使用线程来处理接收的每个请求。X 表示Tomcat可创建的最大的线程数,也就是最多同时处理X个线程。(此连接器将创建的请求处理线程的最大数量,因此,它确定可以处理的同时请求的最大数量)
  • 🍋参数二: acceptCount=“X”,指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。说的简单点就是当同时连接的人数达到 maxThreads 时,还可以进行排队,一旦队列大小超过 X 则不予处理,
  • 🍋参数三: minSpareThreads=“X”,它代表了 Tomcat 初始化时创建的线程数。
  • 🍋参数四: maxSpareThreads=“X”,它表示最多可以有X个线程,线程数一旦超过X个,Tomcat 就会关闭不再需要的socket线程(在线程池开始停止不必要的线程之前,允许存在的未使用请求处理线程的最大数量。 默认值为50)。
  • 🍋参数五: connnectionTimeout,它代表了网络连接超时时间(单位:毫秒)。如果设置为 0 则表示永不超时,但是这样设置有安全隐患的。我们通常可设置为30000毫秒。

所以我们在对线程进行调优时可以把上面的配置改成这样👇

< Connector port=“8080” protocol=“HTTP/1.1” connectionTimeout=“20000” redirectPort=“8443” maxThreads=“150” minSpareThreads=“25” maxSpareThreads=“100” acceptCount=“150” connectionTimeout=“30000”/>

对线程进行调优时我们需要注意,最好的调优方式就是多修改几次参数值并进行观察和测试,主要观察应用软件的响应时间和内存使用情况,不同的环境下所设置的参数值肯定是不一样的,而且也并不是所有的 Web 站点或应用的流量都是一样的,所以对于线程调优来说,它没有固定的参数值可以参考,只能靠我们在不断的修改和观察中一步一步的去完善。

Tomcat 的 IO 调优

Tomcat 的 IO 一共存在着三种运行模式,分别是BIO、NIO、ARP:

  • 🍋BIO: BIO(blocking I/O,阻塞式I/O *** 作),表示 Tomcat 使用的是传统的 Java I/O *** 作,这是 Tomcat 默认的 IO *** 作模式,该 *** 作模式没有经过任何优化处理和支持,性能最差。
  • 🍋NIO: 从 Tomcat6.0 以后,Tomcat 为我们提供了一种新的 IO *** 作模式,即 NIO(non-blocking I/O,非阻塞式I/O *** 作), 它是一个基于缓冲区、并能提供非阻塞 I/O *** 作的 Java API。它拥有比传统I/O *** 作(BIO)更好的并发运行性能。
  • 🍋ARP: ARP(Apache Portable Runtime/Apache可移植运行时库),Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输 *** 作,从而大大地提高 Tomcat 对静态文件的处理性能。从 *** 作系统级别来解决异步的 IO 问题,可以大幅度的提高性能。 ARP *** 作模式也是在 Tomcat 上运行高并发应用的首选模式。不过在配置 ARP 模式之前还需要安装相关的工具包(apr、apr-utils、tomcat-native包),安装并配置完成相关工具包后才可正常使用。

当我们对 Tomcat 的 IO 进行调优时,也是 *** 作 Tomcat 下的 server.xml 文件(Tomcat根目录/conf/server.xml)👇

🍋BIO: < Connector port=“8080” protocol=“HTTP/1.1” connectionTimeout=“20000” redirectPort=“8443” />

🍋NIO: < Connector port=“8080” protocol=“HTTP/1.1” connectionTimeout=“20000” redirectPort=“8443” protocol=“org.apache.coyote.http11.Http11NioProtocol”/>

🍋ARP:< Connector port=“8080” protocol=“HTTP/1.1” connectionTimeout=“20000” redirectPort=“8443” protocol=“org.apache.coyote.http11.Http11AprProtocol”/>

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/737758.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存