使用Cache-Control和gzip提升tomcat应用性能(整理)

本文分享了针对大型JavaScript框架导致的性能问题解决方案,包括自定义Filter调整缓存策略及利用服务器gzip压缩功能减少传输数据量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个其实应该是常识,只不过以前做的J2EE应用大部分是内网里跑的东西,所以性能上没什么问题。这次APIS由于有在外面用的可能,加上使用了一些比较大的javascript框架(Ext),所以性能问题瞬间窜了上来。
以前做的J2EE应用没有使用上达500K的框架,最多就是几十K的Prototype,所以没什么问题。一个页面一般也就几十K最多了。但这次还在开发中的APIS,由于还在用debug版本的库,所以单单Ext就膨胀到了一个多M,加上不知道是Struts还是Tomcat默认写入Response的cache-control: no cache,在远程用起来就很慢,一般一个页面需要十多秒种甚至更久,实在无法忍受。前几天集中解决了问题。
首先是Cache-Control的问题,Google了好一阵,没有什么直接配置的方法,只好自己抄了一个一个Filter,通过和web.xml里配置的配合勉强凑合着用。一般就是对*.do实施no-cache政策,其他需要缓存的img, js文件,统统加上长达两周的缓存期限。ETag实在不会用,就先用这个缓存策略吧。

Filter的代码:


public class ResponseHeaderFilter implements Filter {
FilterConfig fc;

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
// set the provided HTTP response parameters
for (Enumeration e = fc.getInitParameterNames(); e.hasMoreElements();) {
String headerName = (String) e.nextElement();
response.addHeader(headerName, fc.getInitParameter(headerName));
}
// pass the request/response on
chain.doFilter(req, response);
}

public void init(FilterConfig filterConfig) {
this.fc = filterConfig;
}

public void destroy() {
this.fc = null;
}

}




web.xml里的巧妙配置:


<filter>
<filter-name>NoCache</filter-name>
<filter-class>apis.server.common.util.ResponseHeaderFilter</filter-class>
<init-param>
<param-name>Cache-Control</param-name>
<param-value>no-cache, must-revalidate</param-value>
</init-param>
</filter>
<filter>
<filter-name>CacheForWeek</filter-name>
<filter-class>apis.server.common.util.ResponseHeaderFilter</filter-class>
<init-param>
<param-name>Cache-Control</param-name>
<param-value>max-age=604800, public</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>NoCache</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CacheForWeek</filter-name>
<url-pattern>/images/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CacheForWeek</filter-name>
<url-pattern>/img/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CacheForWeek</filter-name>
<url-pattern>/icons/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CacheForWeek</filter-name>
<url-pattern>/ext/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CacheForWeek</filter-name>
<url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CacheForWeek</filter-name>
<url-pattern>*.css</url-pattern>
</filter-mapping>



(插入一段:在探测这些性能问题的时候,我使用的是一个Firebug的插件,也就是Firefox插件的插件-YSlow,好像是Yahoo的,结合Firebug里XHR的Net这块做Profiling,效果很不错,很容易就知道瓶颈)

还有一个gzip的办法,就是在服务器压缩内容,再传给浏览器。现在主流的浏览器都支持gzip压缩,而且这些html和js文本压缩起来很厉害,基本上可以有40%的压缩率。办法在servel.xml的注释里也有写,就是在Connector元素里加上


compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"


1) compression="on" 打开压缩功能
2) compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB(即输出内容大于2KB才压缩)
3) noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩&<60;
4) compressableMimeType="text/html,text/xml" 压缩类型


以上的内容大部分都是Google得来,我自己做了一下整理
<think>好的,我现在需要帮助用户了解如何对Tomcat进行性能优化,特别是最佳实践配置调优。首先,我需要回顾一下用户提供的引用内容,确保回答符合他们的参考资料。用户提到了引用1、2、3,其中引用1提到了性能优化的核心目标、常见瓶颈来源以及优化策略,包括服务间通信、数据库、线程池、缓存等。引用2讨论了通过调整参数利用GC可视化工具进行调优,而引用3提到了线程数与请求处理时间的关系。 首先,我应该从线程池调优开始,因为Tomcat处理请求的核心是线程池。根据引用3,如果每秒有10个请求,每个请求需要1秒处理,那么需要10个线程。因此,设置合适的maxThreads是关键。我需要解释如何根据实际负载调整这个参数,以及连接器配置如acceptCountmaxConnections的作用。 接下来是JVM优化,引用2提到需要调整JVM参数,特别是堆内存垃圾回收。这里需要给出常见的参数配置建议,比如-Xms-Xmx设置堆的初始最大值,以及选择合适的GC算法,比如G1GC。同时,引用2建议使用可视化工具监控GC情况,所以应该提到如何利用工具进行分析。 然后是连接器优化,比如使用NIO或APR连接器,以及启用压缩。这部分需要根据引用1中的优化策略,比如网络优化服务间通信优化来展开。例如,NIO在处理高并发时更高效,而压缩可以减少传输数据量。 资源缓存静态资源处理也是重点,根据引用1的缓存优化策略,可以建议启用静态资源缓存,使用CDN或浏览器缓存。此外,关闭不必要的Web应用可以释放资源,减少开销。 操作系统调优部分涉及文件句柄数网络参数调整,这部分可能用户需要一些系统管理知识,但应该简要提及关键参数,如ulimitTCP设置。 最后,性能测试与监控是持续调优的关键,需要引用2中提到的不断测试调整,结合监控工具进行实时分析。这里可以提到使用JMeter进行压力测试,以及PrometheusGC可视化工具的应用。 整个回答需要结构清晰,分点说明,并且每个部分都要结合用户提供的引用内容,确保信息可靠。同时,用户要求生成相关问题,我需要根据内容提出几个相关的问题,比如如何监控Tomcat性能,或者如何选择连接器类型。 需要注意的是,用户提到回答要使用中文,数学表达式用$...$,独立公式用$$...$$。但在这个问题中可能数学公式较少,不过如果有需要的话,比如计算线程数,可以用行内公式表示。 现在,我需要组织这些点,确保每个优化策略都有对应的解释配置示例,同时引用正确的参考文献。例如,在讲线程池时引用3,在JVM调优时引用2,在整体优化策略时引用1。还要注意避免使用Markdown格式,使用自然的分段编号。 可能还需要检查Tomcat的官方文档或最佳实践,确保建议的参数配置是当前推荐的,比如maxThreads的默认值是否正确,以及最新的GC算法是否有更新。不过由于用户提供的引用中没有提到,可能只需基于现有资料。 总结来说,回答应该涵盖线程池、JVM、连接器、资源缓存、操作系统调优、性能测试与监控等方面,每个部分给出具体策略配置示例,并引用对应的参考文献。最后生成的相关问题要围绕这些主题,帮助用户进一步探索。</think>### Tomcat性能优化最佳实践与配置调优 #### 1. **线程池调优** Tomcat通过线程池处理并发请求,合理配置线程数至关重要。 - **`maxThreads`**:设置处理请求的最大线程数。根据公式$线程数 = \frac{请求量 \times 平均处理时间}{响应时间}$估算[^3]。例如,若每秒100个请求,每个请求耗时0.5秒,则需至少50个线程。 - **`acceptCount`**:当线程池满时,等待队列的最大长度。建议设置为$maxThreads$的1.5倍。 - **`minSpareThreads`**:保持最小空闲线程数,避免频繁创建线程的开销。 **配置示例(`server.xml`)**: ```xml <Executor name="tomcatThreadPool" maxThreads="200" minSpareThreads="20" acceptCount="100"/> ``` #### 2. **JVM参数优化** 调整JVM内存垃圾回收策略可显著提升性能[^2]: - **堆内存**:初始值(`-Xms`)与最大值(`-Xmx`)设为相同,避免动态调整开销,例如:`-Xms4G -Xmx4G`。 - **垃圾回收器**:推荐G1GC(`-XX:+UseG1GC`)或ZGC(低延迟场景)。 - **监控GC**:启用GC日志(`-Xlog:gc*:file=gc.log`),使用VisualVM或GCEasy分析日志。 #### 3. **连接器优化** 选择高效连接器并优化参数: - **NIO模式**:默认使用`org.apache.coyote.http11.Http11NioProtocol`,适合高并发。 - **启用压缩**:减少传输数据量,配置`compression="on"`并指定压缩类型(如`gzip`)。 - **禁用AJP**:若未使用Apache反向代理,关闭AJP协议以节省资源。 #### 4. **资源缓存与静态文件处理** - **静态资源缓存**:通过`<Context>`配置缓存头(如`Cache-Control`)。 - **启用Sendfile**:对于大文件传输,配置`useSendfile="true"`(Linux内核优化)。 - **精简部署**:移除未使用的Web应用(如`examples`、`docs`)。 #### 5. **操作系统调优** - **文件句柄数**:通过`ulimit -n`调整,避免“Too many open files”错误。 - **TCP参数**:优化`net.core.somaxconn`(最大连接队列)`net.ipv4.tcp_tw_reuse`(复用TIME_WAIT连接)。 #### 6. **性能测试与监控** - **压力测试**:使用JMeter或wrk模拟高并发场景,逐步调整参数验证效果[^2]。 - **监控工具**:集成Prometheus + Grafana监控线程池、内存、GC等指标。 --- ### 配置调优示例(`server.xml`片段) ```xml <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="200" minSpareThreads="20" acceptCount="100" compression="on" compressableMimeType="text/html,text/xml,text/css,application/json"/> ``` --- ### 相关问题 1. 如何通过GC日志分析Tomcat内存泄漏问题? 2. Tomcat的NIO、BIO、APR连接器有什么区别? 3. 如何监控Tomcat的线程池状态? 4. 在容器化环境中如何优化Tomcat性能? --- **引用说明**: [^1]: 性能优化需结合系统瓶颈分析,如线程池、数据库、缓存等模块的综合调优。 : 参数调优需通过测试验证,并借助GC可视化工具辅助决策。 : 线程数配置需根据实际请求量处理时间动态调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值