配置 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 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

译Apache Kafka最佳实践

apache Apache Airflow/Cloud Composer 中多个客户端的最佳实践?

tomcat启动优化

Apache Flink 在双十一流量洪峰下的最佳实践

如何把Linux的性能调整到最佳状态?

2022代码规范最佳实践(附web和小程序最优配置示例)