配置Apache/Tomcat的最佳实践

18

我们目前正在使用Apache 2.2.3和Tomcat 5(嵌入在JBoss 4.2.2中),使用mod_proxy_jk作为连接器。

能否有人解释一下如何正确计算/配置下面的值(以及其他相关内容)。Apache和Tomcat都运行在不同的机器上,且都拥有充足的内存(每台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>
3个回答

7
您应该考虑服务器可能承载的工作量。
最重要的因素可能是峰值时同时连接的客户端数量。试着确定它,并根据以下方式调整设置:
- Apache 和 Tomcat 中都有足够的处理线程,这样在服务器负载较重时就不需要生成新线程。 - 服务器中没有过多的处理线程,因为这会浪费资源。
通过这种设置,您可以将服务器的内部维护开销最小化,这对于您的负载是间歇性的情况下非常有帮助。
例如,考虑一个每秒约有300个新请求的应用程序。每个请求平均需要2.5秒才能提供服务。这意味着在任何给定时间,您都需要同时处理约750个请求。在这种情况下,您可能希望调整服务器,使其在启动时拥有大约750个处理线程,并且您可能希望在极高的负载情况下再添加大约1000个处理线程。
还要考虑确切地需要线程来做什么。在之前的例子中,每个请求都是独立的,没有使用会话跟踪。在更“Web”式的场景中,您可能有用户登录到您的网站上,并且根据您使用的软件,Apache 和/或 Tomcat 可能需要使用相同的线程来服务于一个会话中收到的请求。在这种情况下,您可能需要更多的线程。但是至少我知道 Tomcat 不需要考虑这个问题,因为它在内部使用线程池工作。

5

最大客户端连接数

这是您的Apache一次处理的并行客户端连接的基本上限。

使用prefork时,每个进程只能处理一个请求。因此,在处理单个请求的时间内,整个Apache最多可以处理$MaxClients个请求。当然,只有当应用每个请求需要少于1 / $MaxClients资源时,才能达到这个理想的最大值。

例如,如果应用需要一秒钟的CPU时间来回答单个请求,则将MaxClients设置为4将限制吞吐量为每秒4个请求:每个请求使用一个Apache连接,并且Apache一次只处理四个。但是,如果服务器只有两个CPU,即使这也无法实现,因为每个挂钟秒只有两个cpu秒,但是请求需要四个cpu秒。

最小空闲服务器数

这告诉Apache应该有多少空闲进程挂起。这个数字越大,Apache在需要生成额外进程之前可以吞噬更多的爆发负载,这很昂贵,因此会降低当前请求的速度。

正确的设置取决于您的工作负载。如果您的页面具有许多子请求(图片、iframe、javascript、css),则单击单个页面可能会短时间内使用更多进程。

最大空闲服务器数

有太多未使用的Apache进程挂起只会浪费内存,因此Apache使用MaxSpareServers数来限制其保留用于爆发请求的备用进程的数量。

每个子进程中的最大请求数

这限制单个进程在其生命周期内将处理的请求数。如果您非常关注稳定性,应在此处设置实际限制,以持续循环Apache进程,以防止资源泄漏影响系统。

启动服务器

这只是Apache默认启动的进程数量。将其设置为运行的Apache进程的通常数量,以减少系统预热时间。即使您忽略此设置,Apache也将使用Min- / MaxSpareServers值根据需要生成新进程。

更多信息

另请参见Apache多处理模块的文档


2
谢谢,这解决了很多Apache配置选项的问题,但并没有说明它们应该如何与Tomcat中的设置相关联,也没有说明如何针对可用资源配置任何一个。 - Jeremy

1

默认设置通常是不错的起点,可以看到您的应用程序真正需要什么。我不知道您期望有多少流量,因此猜测MaxThreads、MaxClients和MaxServers有点困难。我可以告诉您,我处理的大多数客户(在一家主要为运行Tomcat中的Java应用程序的客户提供Linux Web主机服务的公司工作)在很长一段时间内使用默认设置而不需要太多调整。

如果您不期望有太多流量,那么这些设置“过高”对您也不会产生太大影响。除非必要,否则Apache不会为所有256个潜在客户分配资源。Tomcat也是如此。


我们已经超出了默认设置。几个月前,我注意到Apache上所有可用的工作进程都在使用中,于是我将设置调整到了更高的水平,这对我们非常有帮助。我选择它们时有些随意。我们平均每天有10万到35万次点击。 - Jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接