优化和调优 Apache Tomcat - 第二部分
几周前,Filip Hanik 和我举办了优化和调优 Apache Tomcat 系列网络研讨会的第二场。网络研讨会录像和幻灯片副本可从 SpringSource 网站的网络研讨会部分获取。同一页面上还有所有以前的 SpringSource 网络研讨会的链接,以及 Covalent 网络研讨会存档。
在问答环节中,我们未能回答所有问题,因此,按照承诺,这里是剩余的问题和我们的回答。
- 如何识别 Tomcat 应用程序中的内存泄漏?
您几乎肯定需要使用分析器来找出内存泄漏的根本原因。最新的 Sun JDK 包括 jhat 和 jmap 等工具。还有许多其他分析器可用,包括免费和商业的。Filip 和我在调查 Tomcat 内存泄漏时使用 YourKit,因为 YourKit 为开源开发者提供免费许可证。
- 重新部署如何导致内存泄漏?
这通常发生在 Tomcat 加载的类保留了对 Web 应用程序加载的类的引用时。当 Web 应用程序停止时,Tomcat 类加载器继续保留对 Web 应用程序加载的类的引用。这个类保留了对 Web 应用程序的类加载器的引用,而 Web 应用程序的类加载器又保留了它加载的所有类的引用。因此,Web 应用程序的类加载器及其加载的所有类都不符合垃圾回收条件。这会导致内存泄漏。典型的根本原因是 JDBC 驱动程序和日志框架。
- 更改 Tomcat 使用的 JVM 的最佳方法是什么?
要使用的 JVM 是通过 JAVA_HOME(完整 JDK)或 JRE_HOME(仅 JRE)环境变量设置的。设置此项的正确位置取决于您的环境,特别是如果 Tomcat 配置为在系统启动时自动启动。如果您可以自由选择设置位置,请根据您的操作系统使用 setenv.bat 或 setenv.sh。
- 您推荐特定的 JVM 吗?
不,我们不推荐。您选择的 JVM 供应商取决于您的操作系统。
- 我应该使用哪个连接器来连接 Apache httpd 和 Tomcat?
我们推荐 mod_proxy_http,mod_jk 紧随其后。通常,mod_proxy_ajp 不如 mod_proxy_http 或 mod_jk 稳定。请注意,mod_jk2 已被弃用,不应再使用。
- 使用 SSL 时,maxKeepAliveRequests 的正确设置是什么?
使用 SSL 时应启用 HTTP keep alive,因为 SSL 握手对于每个请求来说都是一项相对昂贵的操作。
- 如果我们在 Solaris 上运行 Tomcat,您是否不推荐使用原生 APR 连接器?
是的,我们不推荐。我们从客户那里收到的反馈是 APR 连接器在 Solaris 上不稳定。
- 我们之前尝试在 Solaris 上迁移到 mod_proxy_http,但遇到了几个 bug。这些 bug 解决了吗?
在不知道您使用的确切 bug 或版本的情况下,很难评论。所有已知的 Apache httpd 问题和当前状态都可以在 ASF Bugzilla 数据库中找到。Tomcat 问题也可以在 Bugzilla 中找到。
- 对于默认的阻塞 IO HTTP 连接器,maxKeepAliveRequests 应该使用什么值?
对于高并发环境,将其设置为 1。否则,将其设置为页面上对象的平均数量,范围在 10 到 100 之间。
- 如何配置 JkOptions +DisableReuse?
JkOptions +DisableReuse 应放在 httpd.conf 文件中,与其他 mod_jk 设置一起。
- 何时最适合使用非阻塞 IO HTTP 连接器?
当您需要支持带 keep alive 的高并发且 APR 不是一个选项时,例如因为它在您的平台上不稳定。
- 如果我在 Apache Tomcat 前面使用 Apache httpd,性能会更好吗?
这取决于情况。如果您将所有请求代理到 Tomcat,则性能会略有下降。如果 httpd 处理部分请求(例如所有静态内容),则您可能会看到一些好处。有一些基准测试试图证明某个连接器优于其他连接器。但是,这些基准测试中的任何一个很可能都不能代表您的应用程序。唯一确定的方法是在您的环境中使用真实的负载和使用模式进行测试。
- Tomcat 可以在没有前端 Web 服务器的情况下用于生产环境吗?
是的。这是否能为您的环境提供最佳性能取决于该环境和您的应用程序。与前一个问题一样,唯一确定的方法是在您的环境中使用真实的负载和使用模式进行测试。
- 在 Tomcat 前面使用 Apache httpd 会增加安全性吗?
您的安装安全性取决于许多因素。是否使用 Apache httpd 不太可能显著改变您的安装安全性。其他因素,例如及时更新补丁和使用防火墙,通常对您的整体安全级别有更大的影响。
- 哪种 Apache httpd MPM 提供最佳性能?
和往常一样,这将取决于您的环境,但 httpd 性能调优文档提供了一些有用的通用指导。
- SpringSource ERS 和 Apache Tomcat 之间的性能差异是什么?
SpringSource ERS 不仅仅是 Apache Tomcat。从纯粹的 Tomcat 角度来看,性能不是区别因素。ERS 的优势在于安装简单、升级和打补丁易于管理、支持多个实例以及所有组件的集成。
- 我的公司使用 Tomcat 和 XYZ 应用程序服务器。Tomcat 与 XYZ 应用程序服务器相比如何?整合是否有好处?
两者的会很多差异,而重要的差异会因组织而异。首先确定您希望从应用程序服务器中获得什么,然后将该列表与市场进行比较。整合是有好处的。更高的一致性意味着更简单的维护、更少的培训等。但是,也有成本。您需要审视您的组织以及它计划如何进行整合(仅限新项目、下一个主要版本的所有项目、现在全部整合等),以便将成本与相关收益进行比较。
- 您是否有 Tomcat 和 XYZ 应用程序服务器的性能比较可用?
在这方面已经发表了各种报告。结果的有用性取决于测试与您的负载匹配得有多好。和往常一样,唯一确定的方法是在您的环境中使用真实的负载和使用模式进行测试。
- 对 Tomcat 服务器进行负载测试的好方法是什么?
- 为了高可用性和性能,可以将 Tomcat 配置为为同一个 Web 应用程序启动多个 JVM 吗?
Tomcat 不提供此配置选项。当然,您可以创建多个 Tomcat 实例,在每个实例上安装您的应用程序,然后跨这些实例进行负载均衡。
- 是否有适用于 Tomcat 的通用健康检查脚本?
的 Manager 状态页面可能是个不错的起点。如果需要,您可以使用该 Servlet 的代码作为基础来构建您自己更具体/更全面的检查。如果您对其进行了增强,请考虑将您的增强贡献回 Apache Tomcat 社区。
- logging.properties 文件位于何处?
默认位置是 $CATALINA_BASE/conf。