配置 Apache / Tomcat 的最佳实践

2022-09-02 22:17:38

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

有人可以阐明计算/配置以下值的正确方法(以及其他任何可能相关的方法)吗?Apache和Tomcat都在不同的机器上运行,并拥有大量的RAM(每个4gb)。

相关服务器.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和Tomcat中都有足够的处理线程,当服务器负载过重时,它们不需要生成新线程。
  • 服务器中的处理线程不会超过所需的数量,因为它们会浪费资源。

通过这种设置,您可以最大限度地减少服务器的内部维护开销,这可以有很大帮助,特别是当负载是零星的时。

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

还要考虑您需要线程的确切用途。在前面的示例中,每个请求都独立于其他请求,没有使用会话跟踪。在更“网络化”的场景中,您可能让用户登录到您的网站,并且根据您使用的软件,Apache和/或Tomcat可能需要使用相同的线程来为一个会话中出现的请求提供服务。在这种情况下,您可能需要更多线程。但是,至少我知道Tomcat,您实际上并不需要考虑这一点,因为它无论如何都可以在内部使用线程池。


答案 2

最大客户端

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

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

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

最小垃圾邮件服务器

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

此设置的正确性取决于您的工作负载。如果你有许多子请求(图片,iframes,javascript,css)的页面,那么点击单个页面可能会在短时间内耗尽更多的进程。

MaxSpareServers

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

MaxRequestsPerChild

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

启动服务器

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

更多信息

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


推荐