配置Apache / Tomcat的最佳实践

时间:2020-03-06 14:27:56  来源:igfitidea点击:

当前,我们使用的是Apache 2.2.3和Tomcat 5(包含在JBoss 4.2.2中),并使用mod_proxy_jk作为连接器。

有人可以阐明一些正确的方法来计算/配置以下值(以及其他可能相关的内容)的方法。 Apache和Tomcat都在不同的计算机上运行,​​并且具有大量的ram(每个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>

解决方案

最大客户

这是apache应该立即处理的并行客户端连接的基本上限。

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

例如,如果应用程序需要一秒钟的cpu时间来回答单个请求,则将MaxClients设置为4会将吞吐量限制为每秒四个请求:每个请求占用一个apache连接,而apache一次只能处理四个。但是,如果服务器只有两个CPU,则甚至无法达到这个目标,因为每个挂钟秒只有两个cpu秒,但是请求将需要四个cpu秒。

MinSpare服务器

这告诉apache应该闲逛多少空闲进程。此数字越大,在需要产生额外的进程之前,apache突发负载的apache可能会被吞下的更多,这很昂贵,因此减慢了当前请求的速度。

正确的设置取决于工作量。如果页面包含许多子请求(图片,iframe,javascript,css),则点击单个页面可能会在很短的时间内用完更多的进程。

MaxSpare服务器

如果有太多未使用的apache进程闲逛,这只会浪费内存,因此apache使用MaxSpareServers编号来限制其为突发请求保留的备用进程的数量。

MaxRequestsPerChild

这限制了单个进程在其整个生命周期内将处理的请求数。如果我们非常关注稳定性,则应在此处设置一个实际限制,以不断回收apache进程,以防止资源泄漏影响系统。

启动服务器

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

更多信息

另请参阅apache的多处理模块的文档。

通常,默认设置是了解应用程序真正需要什么的不错的起点。我不知道我们期望多少流量,因此猜测MaxThreads,MaxClients和MaxServers有点困难。我可以告诉我们,与我打交道的大多数客户(使用Linux Web主机的工作,主要针对在Tomcat中运行Java应用程序的客户)使用默认设置已有一段时间,而无需进行太多调整。

如果我们不希望流量太多,那么这些设置"过高"也不会对我们造成太大影响。除非有必要,否则Apache不会为整个256个潜在客户分配资源。 Tomcat也是如此。

我们应该考虑服务器可能承担的工作量。

最重要的因素可能是高峰时段同时连接的客户端数量。尝试确定它并以以下方式调整设置:

  • Apache和Tomcat中都有足够的处理线程,因此在服务器负载很重的情况下,它们不需要产生新线程
  • 服务器中没有比所需更多的处理线程,因为它们会浪费资源。

通过这种设置,我们可以最大程度地减少服务器的内部维护开销,这可能会有很大帮助,尤其是在负载很少的情况下。

例如,考虑一个我们每秒有300个新请求的应用程序。每个请求平均需要2.5秒才能投放。这意味着在任何给定时间,我们都有〜750个需要同时处理的请求。在这种情况下,我们可能需要调整服务器,以便它们在启动时具有约750个处理线程,并且我们可能希望添加最多约1000个处理线程,以处理极高的负载。

还要考虑到底需要什么线程。在前面的示例中,每个请求都独立于其他请求,没有使用会话跟踪。在更"网络化"的情况下,我们可能使用户登录到网站,并且根据所使用的软件,Apache和/或者Tomcat可能需要使用相同的线程来为一个会话中的请求提供服务。在这种情况下,我们可能需要更多线程。但是,至少据我所知,Tomcat确实不需要考虑这一点,因为它无论如何都在内部与线程池一起使用。