1. 首页 > 快讯

提升 Tomcat 性能攻略

大家好,如果您还对提升 Tomcat 性能攻略不太了解,没有关系,今天就由本站为大家分享提升 Tomcat 性能攻略的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

从上图可以看出,Tomcat将其业务抽象为Server、Service、Connector、Container等组件,每个组件都有不同的作用。

Server组件是Tomcat最外层的组件。它是Tomcat实例本身的抽象,代表Tomcat本身。一个服务器组件可以有一个或多个服务组件。

Service组件是Tomcat中提供服务和处理请求的一组组件。一个服务组件可以有多个连接器和一个容器。多连接器意味着它可以使用多种协议同时接收用户请求。

连接器负责处理客户端连接。它提供对各种服务协议的支持,包括BIO、NIO、AIO等,其价值在于屏蔽多协议Container的复杂性,统一Container处理标准。

至此,Tomcat的核心组件就基本完成了。其实Container组件里面还有很多细分的组件。事实上,如果你对业务的抽象感兴趣,你可以继续阅读。

Engine组件代表一个可运行的Servlet实例,包含了Servlet容器的核心功能,并且可以拥有一个或多个虚拟主机(Host)。其主要作用是将请求委托给合适的虚拟主机进行处理,即根据URL路径的配置来匹配合适的虚拟主机进行处理。 Host组件负责运行多个应用程序,并且它负责安装这些应用程序。它的主要功能是解析web.xml文件并匹配相应的Context组件。 Context组件代表了具体的Web应用程序本身,它最重要的作用是管理其中的Servlet实例。一个Context 可以有一个或多个Servlet 实例。一个Wrapper组件代表一个Servlet,它负责管理一个Servlet,包括Servlet的加载、初始化、执行和资源回收。 Wrapper是最底层的容器。可以看出,Host是虚拟主机的抽象,Context是应用程序的抽象,Wrapper是Servlet的抽象,Engine是处理层的抽象。

Tomcat核心参数

在了解核心参数之前,我们需要对Tomcat的请求处理流程有一个大概的了解。 Tomcat的请求处理流程如下。

上图中,有三个非常关键的核心参数,也是性能调优的关键。

AcceptCount:当Container线程池达到最大数量且没有空闲线程,且Connector队列达到最大数量时,操作系统可以接受的最大连接数。 maxConnections:当Container线程池达到最大数量并且没有空闲线程时,Connector的队列可以接收的最大线程数量。 maxThreads:Container线程池中处理线程的最大数量。从上面三个参数的含义,我们可以知道以下结论:

客户端并不直接与Tomcat的Connector组件建立联系,而是先与操作系统建立联系,然后交给Connector。这很重要,否则,你将无法理解acceptCount参数。不仅Connector组件中有一个队列,操作系统中也有一个队列,用来临时存储与客户端的连接。这也是一个关键点。我们所说的线程池是指Container容器中的线程池。

理解这三个核心参数的含义非常重要,否则就没有办法进行后续的性能调优工作。

最大线程数maxThreads

我们知道maxThreads指的是请求处理线程的最大数量。 Tomcat7 和Tomcat8 的默认值为200。

该参数的设置需要根据任务的执行内容进行调整。一般来说,计算公式为:最大线程数=((IO时间+CPU时间)/CPU时间)*CPU核心数。

这个公式背后的思想其实很简单,就是最大化利用CPU资源。

任务耗时分为IO耗时和CPU耗时。基本上消耗IO时间最多,此时CPU无事可做。所以如果可以让CPU在任务等待IO的同时处理其他任务,那么CPU利用率就会提高。

一般来说,由于IO耗时远大于CPU耗时,因此根据公式计算出的maxThreads数会远大于CPU核数,这是正常的。

需要注意的是,该值越高越好。因为一旦线程过多,CPU就需要进行上下文切换,这会消耗一些CPU资源。

因此,最好的办法是利用上面的公式计算出一个基线值,然后进行压力测试调整到一个合理的值。

一般来说,如果maxThreads增加但吞吐量没有增加或减少,则可能表明已经达到瓶颈。

最大连接数maxConnections

maxConnections是指当线程池中的线程达到最大值并且全部忙时,Connector中的队列可以容纳的最大连接数。

一般来说,我们需要设置一个合理的值,不要让它无限制地堆积。

因为Tomcat的处理能力肯定是有限的,到了一定程度肯定就处理不了了。所以积累太多是没有用的。反之,则会造成内存堆积,最终导致内存溢出OOM。

一般来说,经验值可以设置为与maxThreads相同。我觉得这样比较合理,因为队列中的连接最多只需要等待线程处理完一项任务,不会等待太久,响应时间也不会太长。

如果想缩短响应时间,可以将maxConnections调整得比maxThreads小,这样可以减少一些响应时间。但请注意,如果将其设置得太低,性能可能会严重下降,吞吐量也会降低。

操作系统连接数acceptCount

acceptCount是指当Container线程池达到最大数量并且没有空闲线程且Connector队列达到最大数量时,操作系统可以接受的最大连接数。

当队列中的数量达到最大值时,所有传入的请求都将被拒绝。默认值为100。这个可以理解为操作系统的一种自我保护机制。如果积累太多而无法处理,请拒绝它们以保护自己的资源。

该参数的参数调整信息相对较少,但根据其含义,不建议该值大于maxConnections。

因为这个队列中的连接需要等待。如果这个值太大,就意味着会有很多连接没有被处理。

连接越多,等待时间越长,响应时间越慢。如果您想要更短的响应时间,则应该降低该值。

有些acceptCount的同学可能会疑惑,既然有,为什么还需要maxConnections呢?这不是历史的重演吗?事实上,在BIO时代,这两个值基本是一致的。我猜想因为NIO,以及后来其他技术的出现,AIO操作系统可以接受更多的客户端连接。

因此,操作系统可以先建立连接缓存,然后Connector就可以直接从操作系统获取连接,这样就不需要等待操作系统建立耗时的TCP连接,从而提高效率。

其他

除了以上三个参数外,还有几个非核心参数,但我认为还是有一定作用的。

connectionTimeout:连接建立后的等待超时时间。如果超过这个时间,则直接返回超时。 minSpareThreads:表示最小存活线程数,即如果没有请求,必须维持最小存活线程数。该参数与是否存在突发流量有关。在突发流量的情况下,如果该值太低,瞬时响应时间会较长。

总结

对于maxThreads参数,如果按照公式计算,我们需要获取IO时间和CPU时间,但实际上这两个值并不容易获取。 maxThreads 所以一般情况下我们可以通过压力测试得到一个比较合适的。

对于maxConnections参数,可以设置一个与maxThreads相同的值,然后根据情况进行调整。

如果您想减少响应时间,可以稍微调低它,否则可以调高它。

对于acceptCount参数,调优逻辑与maxConnections类似,但不建议大于maxConnections,然后根据相应的时间要求进行微调。

OK,本文到此结束,希望对大家有所帮助。

用户评论

(り。薆情海

想提升网站的速度啊,学习下 Tomcat 的优化技巧真是必要!

    有10位网友表示赞同!

久爱不厌

Tomcat 的性能问题确实让人头痛,希望这篇文章能给我一些解决思路。

    有10位网友表示赞同!

自繩自縛

我一直觉得 Tomcat 有很多潜在的性能挖掘空间,期待找到一些实用的优化方法。

    有19位网友表示赞同!

病态的妖孽

网站稳定性和运行速度对用户体验来说太重要了,Tomcat 优化真是个宝典!

    有8位网友表示赞同!

何年何念

虽然写过 web 项目,但关于 Tomcat 性能优化还是不太了解,这篇文章能让我再学习一下。

    有11位网友表示赞同!

海盟山誓总是赊

有时候 Tomcat 会很卡,不知道有没有哪些小技巧可以快速提升它的性能。

    有10位网友表示赞同!

巷陌繁花丶

需要学习一些 Tomcat 的配置和架构知识才能真正进行有效优化吧?

    有11位网友表示赞同!

还未走i

网站流量大了之后 Tomcat 就很容易出现问题,希望这篇文章能提供一些应对方法。

    有8位网友表示赞同!

权诈

这个标题真贴切!想让 Tomcat 跑得更快,肯定得认真看看这篇文章才行。

    有7位网友表示赞同!

陌颜幽梦

网站运行速度慢会影响用户体验和排名,Tomcat 优化必不可少啊!

    有11位网友表示赞同!

陌離

平时自己写项目只用 Tomcat 的基本功能,还没深入了解它的性能调优技巧呢。

    有20位网友表示赞同!

浮光浅夏ζ

现在很多博客都分享 Tomcat 性能优化经验,这个文章应该能给我一些新的思路。

    有20位网友表示赞同!

孤者何惧

Tomcat 是常用的 web 应用服务器,学习它的优化方法对后端开发很有帮助。

    有16位网友表示赞同!

红尘烟雨

希望能找到一些提高 Tomcat 响应速度的方法,让网站运行更流畅!

    有19位网友表示赞同!

凉凉凉”凉但是人心

关于 Tomcat 的性能调优,很多细节可能需要自己实践才能体会出来吧?

    有11位网友表示赞同!

箜明

这个标题一看就知道可以解决我的困扰,赶紧去看看这篇文章!

    有19位网友表示赞同!

封心锁爱

除了提高性能,我还想了解 Tomcat 是否还能支持更丰富的应用架构。

    有12位网友表示赞同!

夏日倾情

学习这些 Tomcat 的优化技巧,下次开发项目可以直接应用!

    有13位网友表示赞同!

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/6797.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666