成为JavaGC专家Part IV:Apache的MaxClients参数详解及其在Tomcat执行FullGC时的影响
这是“成为Java GC专家系列文章”的第四篇。
在第一篇文章 成为JavaGC专家Part I — 深入浅出Java垃圾回收机制 中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。
在第二篇文章 成为JavaGC专家Part II — 如何监控Java垃圾回收机制 中我们学到了JVM到底是如何执行垃圾回收,我们如何监控GC,以及那些工具可以使得监控过程更高效。
在第三篇文章 成为Java GC专家系列Part III–如何优化Java垃圾回收机制中我们通过实际的例子学到了一些可以优化GC的参数。同时我们讲解了如何减少对象被转移到老年代空间,如何缩短Full GC时间,以及如何设置GC类型及内存空间。
在第四篇文章中,我们将阐述Apache中MaxClients
参数的重要性,以及他如何在GC发生时,显著地影响整个系统的性能。我将提供几个例子以方便你理解MaxClients
导致的问题。同时我还会说明如何根据系统的内存情况,设置最佳的MaxClients
参数值。
MaxClients对于系统的影响
NHN (译者注:NHN是作者工作的公司)服务的执行环境中存在一组Throttle valve-type参数(译者注:节流阀参数,用于控制系统负载)。这些参数对于系统来说十分重要。下面我们看一下Apache的 MaxClients
参数在Full GC 发生时是如何影响系统的。
大部分开发人员都知道在由于GC发生而导致的”停止世界现象(STW) “(详细请参见Understanding Java Garbage Collection)。尤其是,NHN的Java开发人员经常会遇到由于GC原因导致的Tomcat报错。由于Java 虚拟机 (JVM)管理着内存,以Java为基础的程序无法摆脱GC导致的STW现象。假如在某一个时间,当你正在操作你开发的应用时,GC开始执行。即使TTS错误没有发生,你的服务也会给客户展现未预期的503错误。
服务执行环境
由于架构本身的特点,相比较而言纵向扩展,Web服务更适合横向扩展(译者注:增加服务器的数量,而不是提高件配置)。因此,总体来讲,物理设备会 根据性能要求被配置成1台Apache+n台Tomcat。但是本文假设我们的环境是1台Apache+一台Tomcat同时安装在一台主机行,如下图所 示。
图1:本文假射的服务执行环境
仅供参考,本文描述的参数基于Apache 2.2.21 (prefork MPM),Tomcat 6.0.35,CentOS 4.72 (32-bit),jdk 1.6.0_24。
系统可用内存2GB,垃圾收集器使用ParallelOldGC,AdaptiveSizePolicy采用默认的设置true,堆内存空间600M
STW 和HTTP 503
让我们假设访问Apache的请求为 200 req/s且有10个httpd进程在运行,另外我们暂时不考虑每个请求的响应时间。在这种前提下,我们假设由于full GC导致的暂停时间为1秒。当Full GC发生的时候Tomcat会怎样?
第一件进入你脑海的事情应该是Tomcat会因为full GC而停止响应任何请求。在这种情况下,当Tomcat暂停相应请求时Apache会发生什么?
当Tomcat暂停时,请求会以200 req/s的速度不断的涌入Apache。一般来说,在Full GC发生之前,请求的响应可以快速地被10个或更多的httpd进程处理掉。但是,因为Tomcat暂停了,httpd进程会被不停地创建以相应新进请求。直到超过httpd.conf 文件中定义 MaxClients
为止。由于默认值为256,Apache不会在乎请求以200 req/s的速度涌入。
这时,新创建的httpd线程将如何呢?
Httpd进程通过mod_jk 模块所管理的空闲的AJP连接,将请求转发给Tomcat。如果没有空闲连接,他会申请创建新的连接。但是,因为Tomcat暂停了,创建新连接的请求会被拒绝。因此这些请求会被存储在backlog队列中,数量的多少取决于server.xml中关于AJP Connector的设置。一旦请求数量超过backlog队列的空间限制。Apache就会返回拒绝连接错误。并且返回HTTP 503 错误给用户。
在这种假设条件下,默认的backlog队列空间是100,而请求到达速度是200 req/s。因此,full GC导致的一秒钟的暂停会使得超过100个请求返回503错误。
这样,当Full GC结束后,backlog队列中存储的内容会被Tomcat接受并在通过工作线程处理,线程的最大数量取决于MaxThreads
的值(默认200)。
MaxClients 与backlog
在这种情况下,设定哪个参数可以避免返回给用户503错误呢?
首先,我们应该知道backlog的值要够大,以至于能够容纳所有因为Full GC导致暂停期间涌入的请求。换句话说太应该不小于200。
那么,这么设置之后会不会产生新的问题呢?
让我们假设将backlog设置为200后再重复一下上面的过程。得到的结果比之前更加严重。系统内存使用量一般情况下为50%,但是,在发生 Full GC时快速增加到100%,同时导致交换内存空间快速增加,更为严重的是导致Full GC的暂停时间从1秒变成了4秒甚至更多,系统在此期间完全宕机,不能响应任何请求。
在第一种情况下,只有100或更多的请求返回503错误。但是,当我们把backlog调整到200后,超过500个请求会挂起3秒甚至更多地时间无法得到应答
上面这个例子可以很好的说明当你没有完全理解各个设置之间的内在关系时(例如,对于系统的影响),盲目修改系统会导致什么后果。
那么,为什么会产生这个现象呢?
问题的根源在于 MaxClients
参数的特性。
将MaxClients
设置为一个很大的值本身没有问题,但最重要的是在设定MaxClients
参数时,你要确保即使等同于MaxClients
数量的httpd进程被同时创建,内存使用量也不会超过80%。
系统的内存交换参数一般被设定为60(默认)。因此,当内存使用量超过80%时,就会进行内存交换。
让我们再来看一下为什么这个特性会导致上面那个严重的问题。当请求以200 req/s的速度涌向Tomcat时,Tomcat由于full GC暂停了。此时backlog被设置为200。Apache大约创建100个httpd进程。在这种情况下,一旦内存使用量超过80%,操作系统会激活 交换内存区域,并且由于系统认为JVM的老年代中的对象在很长一段时间内未被使用,而将他们移动到交换区域。
最终的结果是,GC使用了内存交换空间,暂停时间剧增。因此httpd进程数进一步增加。从而导致上面描述的内存使用量达到100%的情况。
这两个场合的唯一区别就是backlog的值:100 vs.200。为什么只在200的情况下发生?
两者不同的原因在于创建的httpd进程的数量。当backlog设置为100时并且Full GC发生时,会创建100个请求的连接并保存在backlog队列中。其他请求得到拒绝连接错误信息并发挥503错误。因此,总的httpd 进程数量仅仅会略高于100。而当backlog被设置为200时,200个请求会创建连接,因此。总的httpd进程数会多于200。这样超过阀值,从 而导致内存交换的发生。紧接着,不考虑内存使用量而的设定 MaxClients
参数,Full GC导致httpd进程数量暴增,引发内存交换,降低系统性能。
如上所述,我们将内存设为700m后MaxClients
应该是多少呢?
这要取决于加载模块的数量,对于NHN Web服务来说。Apache只是个简单的代理转发,每个httpd线程4m内存(根据top命令的结果)足以(参见图2)。因此。700m内存对应的 MaxClients
应该是175。
总结
一个健壮的服务配置至少应该能够降低在服务过载时宕机的时间,在合理的范围内成功的应答请求。针对基于Java的Web服务。你必须检查你的服务在Full GC导致的STW时间内能否稳定的响应请求。
为了响应更多的用户请求和应对DDoS攻击,在没有全面考虑系统内存等因素的情况下,贸然地将 MaxClients
设置为一个很大的值,那么它将失去作为阀值的功能,而导致系统出现更严重的问题。
本文提到的情况只会持续3-5秒,因此绝大多数传统的监控工具都无法及时的发现。
作者 Dongsoon Choi 高级工程师@Game Service Technical Support Team, NHN Corporation.
相关推荐
通过以上详细介绍,我们可以了解到Apache配置文件中的主要参数及其作用,这对于管理和优化Apache服务器具有重要意义。合理配置这些参数可以帮助提升服务器性能、加强安全性并满足各种复杂的需求场景。
1、理解Java垃圾回收; 2、Java垃圾回收的监控; 3、GC 调优; 4、Apache的MaxClients设置及其对Tomcat Full GC的影响; 5、Java应用性能优化的原则
Notes 我的笔记: 知识不总结,就会被大脑当垃圾清理 :horse:求知之路必然不会...Apache的MaxClients参数详解及其在Tomcat执行FullGC时的影响 JavaEE 浅析Web容器 计算机网络 UDP&TCP DB MySQL索引背后的数据结构
### Apache配置文件详解 #### 一、概述 Apache配置文件是Apache Web服务器的核心组成部分,用于定义服务器的行为方式、性能参数及安全策略等。通过合理的配置,可以极大地提高Apache的性能和安全性,使其能够更好...
Apache 和 Tomcat 配置是将这两个开源软件结合在一起,以提供更强大的Web服务功能。Apache HTTP服务器作为静态内容的高效处理者,而Tomcat则处理Java Servlets和JSPs(JavaServer Pages)。以下是对Apache httpd....
### Apache与Tomcat知识点概述 本篇文档主要围绕Apache服务器的配置进行展开,涉及了Apache的基本设置、多处理模块(MPM)配置以及HTTP头部信息的控制等方面的内容。此外,虽然文档标题提到了Tomcat,但文档内容并...
Apache2 的 Worker 工作模式配置及 MaxClients 不足问题解决 Apache 服务器是当前最流行的 Web 服务器之一,它提供了多种工作模式,包括 Prefork、Worker 和 Event 等。其中,Worker 工作模式是 Apache 2.x 版本中...
Apache 配置文件 http.conf 参数含义详解 Apache 配置文件 http.conf 是 Apache 服务器的核心配置文件,它控制着 Apache 服务器的各个方面的行为。下面将详细解释 http.conf 文件中的各个参数含义。 基本配置 * `...
### MySQL+Tomcat+Apache优化 #### 1. MySQL优化: ##### 1.1 简介: 在处理大量数据时,MySQL的优化至关重要。合理的内存分配不仅能提高系统的响应速度,还能有效避免因资源过度使用而导致的系统崩溃或性能下降...
特别是在高并发场景下,合理设置Apache的最大连接数(即`MaxClients`参数),能够显著提升服务器响应速度与承载能力。 #### 知识点二:`MaxClients`参数详解 - **定义**:`MaxClients`参数用于定义Apache服务器能...
在IT行业中,服务器配置是关键的一环,特别是对于使用Apache和Tomcat的环境。Apache作为流行的Web服务器,常与Java应用服务器Tomcat协同工作来处理动态内容。以下是对"Tomcat协同配置参考"的详细说明: 1. **Tomcat...
### Apache配置详解 #### 一、Apache基础配置 在配置Apache服务器时,核心配置文件`httpd.conf`至关重要。此文件决定了服务器的行为、性能以及安全等方面。以下将详细介绍`httpd.conf`文件中的关键配置项及其意义...
Apache 配置详解 Apache 配置详解是 Apache 服务器的核心组件之一,其配置文件是 httpd.conf。httpd.conf 文件中包含了 Apache 服务器的所有配置信息,包括主站点的配置、服务器的优化、访问控制等。 主站点的配置...
2. **虚拟主机**:Apache支持多个网站在同一台服务器上运行,称为虚拟主机。通过设置不同的ServerName和DocumentRoot,可以为每个网站指定独立的域名和内容目录。 3. **模块管理**:Apache的模块化设计允许你根据...
### Apache2.2配置文件详解:深入理解Apache Web服务器配置 Apache HTTP Server是全球最广泛使用的Web服务器之一,其灵活性和可定制性为网站开发者提供了强大的功能与控制能力。在Apache2.2版本中,主要的配置文件...
### Apache配置文件httpd详解 #### 文件全局说明 Apache配置文件`httpd.conf`是Apache Web服务器的核心配置文件,主要用于定义服务器的各种配置指令,这些指令影响着Apache服务器的整体行为和服务特性。通过深入...
在Tomcat运行过程中,如果Apache的`MaxClients`值过大,可能会导致频繁的Full GC,影响服务的稳定性和响应速度。 3. **JVM内部机制**:Java虚拟机是Java应用程序的运行环境,负责类的加载、运行、内存管理等。理解...
对于性能优化,手册会讨论如何调整Apache的并发处理能力,包括设置MaxClients、StartServers、MinSpareServers和MaxSpareServers等参数。此外,还可能涉及缓存机制(如mod_cache)和GZIP压缩,以减少服务器负载和...
### Apache配置详解:深入解析与优化策略 #### 一、Apache服务器基础配置解析 Apache作为全球最广泛使用的Web服务器之一,其配置文件`httpd.conf`是管理与控制服务器行为的核心。以下是对部分关键配置项的详细解读...
本文将深入解读Redis配置文件中的关键参数及其作用,帮助读者更好地理解和优化Redis配置。 #### 1. 守护进程模式 (daemonize) - **默认状态**:Redis默认不以守护进程模式运行,即在前台运行。 - **配置说明**:...