java spring激活profile - 配置Apache / Tomcat的最佳实践





active无效 boot生产环境部署 (4)


MaxClients的

这是您的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进程,以防止资源泄漏影响系统。

StartServers的

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

更多信息

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

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

有人可以通过正确的方式来计算/配置下面的值(以及其他可能相关的东西)。 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>



您应该考虑服务器可能获得的工作量。

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

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

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

例如,考虑一个应用程序,你有约300个新的请求/秒。 每个请求平均需要2.5秒才能提供服务。 这意味着在任何时候你有大约750个需要同时处理的请求。 在这种情况下,您可能需要调整服务器,以便在启动时拥有〜750个处理线程,并且您可能需要最多添加〜1000个处理线程来处理极高的负载。

还要考虑一下你需要一个线程。 在前面的例子中,每个请求都是独立的,没有使用会话跟踪。 在更“web-ish”的情况下,用户可能会登录到您的网站,根据您使用的软件,Apache和/或Tomcat可能需要使用相同的线程来为一个会话中的请求提供服务。 在这种情况下,你可能需要更多的线程。 不过,至少我知道Tomcat,你不需要考虑这一点,因为它可以在内部使用线程池。




默认的设置通常是体面的起点,看你的应用程序真的需要什么。 我不知道你期望有多少流量,所以猜测MaxThreads,MaxClients和MaxServers有点困难。 我可以告诉你,我所处理的大多数客户(主要用于运行Tomcat中运行Java应用程序的客户)使用默认设置一段时间,而不需要太多的调整。

如果你不需要太多的流量,那么这些设置“太高”也不应该太多影响你。 除非有必要,否则Apache不会为整个256个潜在客户端分配资源。 Tomcat也是如此。




java.io.File类包含四个静态分隔符变量。 为了更好的理解,让我们了解一些代码的帮助

  1. 分隔符:依赖于平台的默认名称分隔符字符串。 对于windows,它是'\',对于unix它是'/'
  2. separatorChar:与分隔符相同,但是它是char
  3. pathSeparator:路径分隔符的平台相关变量。 例如,在Unix系统中用':'分隔的路径的PATH或CLASSPATH变量列表和';' 在Windows系统中
  4. pathSeparatorChar:与pathSeparator相同,但是是char

请注意,所有这些都是最终变量和系统相关的。

这是用于打印这些分隔符变量的java程序。 FileSeparator.java

import java.io.File;

public class FileSeparator {

    public static void main(String[] args) {
        System.out.println("File.separator = "+File.separator);
        System.out.println("File.separatorChar = "+File.separatorChar);
        System.out.println("File.pathSeparator = "+File.pathSeparator);
        System.out.println("File.pathSeparatorChar = "+File.pathSeparatorChar);
    }

}

Unix系统上面程序的输出:

File.separator = /
File.separatorChar = /
File.pathSeparator = :
File.pathSeparatorChar = :

Windows系统上的程序输出:

File.separator = \
File.separatorChar = \
File.pathSeparator = ;
File.pathSeparatorChar = ;

为了使我们的程序平台独立,我们应该始终使用这些分隔符来创建文件路径或读取任何系统变量,如PATH,CLASSPATH。

以下是显示如何正确使用分隔符的代码片段。

//no platform independence, good for Unix systems
File fileUnsafe = new File("tmp/abc.txt");
//platform independent and safe to use across Unix and Windows
File fileSafe = new File("tmp"+File.separator+"abc.txt");






java apache tomcat jboss mod-proxy