配置 Apache / Tomcat 的最佳实践
Posted
技术标签:
【中文标题】配置 Apache / Tomcat 的最佳实践【英文标题】:Best practices for configuring Apache / Tomcat 【发布时间】:2010-09-11 11:15:53 【问题描述】:我们目前使用mod_proxy_jk
作为连接器的Apache 2.2.3 和Tomcat 5(嵌入在JBoss 4.2.2 中)。
有人可以阐明计算/配置以下值的正确方法(以及可能相关的任何其他内容)。 Apache 和 Tomcat 都在不同的机器上运行,并且有大量的 ram(每个 4gb)。
相关 server.xml 部分:
<Connector port="8009"
address="$jboss.bind.address"
protocol="AJP/1.3"
emptySessionPath="true"
enableLookups="false"
redirectPort="8443"
maxThreads="320"
connectionTimeout="45000"
/>
相关的 httpd.conf 部分:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 0
</IfModule>
【问题讨论】:
【参考方案1】:最大客户数
这是您的 apache 应立即处理的并行客户端连接的基本上限。
使用 prefork,每个进程只能处理一个请求。因此,整个 apache 可以在处理 单个 请求所需的时间内处理 最多 $MaxClients 个请求。当然,只有当应用程序每次请求需要少于 1/$MaxClients 资源时,才能达到这个理想的最大值。
例如,如果应用程序需要一秒钟的 cpu 时间来响应单个请求,则将 MaxClients 设置为 4 会将您的吞吐量限制为每秒四个请求:每个请求都会占用一个 apache 连接,而 apache 将只处理四个一次。但是如果服务器只有两个 CPU,就连这个都达不到,因为每个挂钟秒只有两个 cpu 秒,但是请求需要四个 cpu 秒。
MinSpareServers
这告诉 apache 应该有多少空闲进程。这个数字越大,apache 在需要生成额外进程之前可以吞下的突发负载就越多,这很昂贵,因此会减慢当前请求的速度。
此选项的正确设置取决于您的工作量。如果您的页面包含许多子请求(图片、iframe、javascript、css),那么点击单个页面可能会在短时间内占用更多进程。
MaxSpareServers
有太多未使用的 apache 进程挂起只会浪费内存,因此 apache 使用 MaxSpareServers 数来限制它为突发请求保留的备用进程数量。
MaxRequestsPerChild
这限制了单个进程在其整个生命周期中将处理的请求数。如果你非常关心稳定性,你应该在此处设置一个实际的限制,以不断回收 apache 进程,以防止资源泄漏影响系统。
启动服务器
这只是 apache 默认启动的进程数量。将此设置为通常运行的 apache 进程的数量,以减少系统的预热时间。即使您忽略此设置,apache 也会根据需要使用 Min-/MaxSpareServers 值来生成新进程。
更多信息
另见the documentation for apache's multi-processing modules。
【讨论】:
谢谢,这清除了很多 Apache 配置选项,但不是它们应该如何与 tomcat 中的设置相关联,也不是如何配置可用资源。【参考方案2】:默认设置通常是很好的起点,可以让您了解您的应用程序真正需要什么。我不知道您期望有多少流量,因此猜测 MaxThreads、MaxClients 和 MaxServers 有点困难。我可以告诉你,与我打交道的大多数客户(为 linux 网络主机工作,主要与在 Tomcat 中运行 Java 应用程序的客户打交道)在相当长的一段时间内都使用默认设置,而无需进行太多调整。
如果您不希望有太多流量,那么这些设置“太高”也不会对您产生太大影响。除非有必要,否则 Apache 不会为全部 256 个潜在客户分配资源。 Tomcat 也是如此。
【讨论】:
我们已经超出了默认设置。几个月前,我注意到我们正在使用 Apache 上所有可用的工作人员,我将设置调整到上述设置,这对我有很大帮助。我有些武断地选择了它们。我们平均每天点击 100,000-350,000 次。【参考方案3】:您应该考虑服务器可能获得的工作负载。
最重要的因素可能是高峰时间同时连接的客户端数量。尝试确定它并以以下方式调整您的设置:
Apache 和 Tomcat 中都有足够的处理线程,因此在服务器负载过重时它们不需要生成新线程 服务器中的处理线程不会比需要的多,因为它们会浪费资源。通过这种设置,您可以最大限度地减少服务器的内部维护开销,这会很有帮助,尤其是当您的负载是零星的时。
例如,考虑一个应用程序,您每秒有大约 300 个新请求。每个请求平均需要 2.5 秒的服务时间。这意味着在任何给定时间,您都有大约 750 个需要同时处理的请求。在这种情况下,您可能希望调整您的服务器,使其在启动时拥有大约 750 个处理线程,并且您可能希望添加最多大约 1000 个处理线程来处理极高的负载。
还要考虑您需要线程的确切用途。在前面的示例中,每个请求都独立于其他请求,没有使用会话跟踪。在更“web-ish”的场景中,您可能让用户登录到您的网站,并且根据您使用的软件,Apache 和/或 Tomcat 可能需要使用相同的线程来处理一个会话中的请求。在这种情况下,您可能需要更多线程。但是,至少我知道 Tomcat,您实际上不需要考虑这一点,因为它无论如何都可以在内部与线程池一起使用。
【讨论】:
以上是关于配置 Apache / Tomcat 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章