`

linux + apache2.2(prefork模式) + jk1.2.26 + tomcat6负载均衡配置优化

阅读更多

目前总结出来的一些优化配置: 
配置适用环境 linux + apache2.2(prefork模式) + jk1.2.26 + tomcat6 

(a)apache端需要配置的核心参数:apache/conf/httpd.conf 


Xml代码  收藏代码
  1. Timeout 10  
  2. KeepAlive On  
  3. MaxKeepAliveRequests 5  
  4. KeepAliveTimeout 5  
  5.   
  6. <IfModule mpm_prefork_module>  
  7.     ServerLimit       3000  
  8.     StartServers      750  
  9.     MinSpareServers   5  
  10.     MaxSpareServers   100  
  11.     MaxClients        3000  
  12.     MaxRequestsPerChild   10000  
  13. </IfModule>  



(b)workers.properties配置: 

Xml代码  收藏代码
  1. worker.list=loader  
  2.   
  3. worker.loader.type=lb  
  4. #两tomcat负载均衡  
  5. worker.loader.balance_workers=tomcat1,tomcat2  
  6. #不同步session  
  7. worker.loader.sticky_session=false  
  8.   
  9. #负载1  
  10. worker.tomcat1.type=ajp13  
  11. worker.tomcat1.host=localhost  
  12. worker.tomcat1.port=8009  
  13. #负载均衡因子,决定apache分发的比例  
  14. worker.tomcat1.lbfactor=1  
  15. worker.tomcat1.socket_timeout=10#配置超时时间  
  16. worker.tomcat1.connection_pool_timeout=600#配置关闭空闲连接时间  
  17.   
  18. #负载2  
  19. worker.tomcat2.type=ajp13  
  20. worker.tomcat2.host=localhost  
  21. worker.tomcat2.port=8109  
  22. #负载均衡因子,决定apache分发的比例  
  23. worker.tomcat2.lbfactor=1  
  24. worker.tomcat2.socket_timeout=10#配置超时时间  
  25. worker.tomcat2.connection_pool_timeout=600#配置关闭空闲连接时间  



(c)tomcat/conf/server.xml配置: 

Xml代码  收藏代码
  1. <Connector port="8009"   
  2.        enableLookups="false"  
  3.        maxProcessors="0"  
  4.        maxThreads="3000"  
  5.        minSpareThreads="100"  
  6.        maxSpareThreads="200"  
  7.        protocol="AJP/1.3"   
  8.        enableLookups="false"  
  9.        connectionTimeout="600000"  
  10.        redirectPort="8443" />  



优化配置核心关键: 
(一)prefork模式下(其他模式下不适用),apache需要优化的主要参数: 
    ServerLimit       3000 
    StartServers      750 
    MinSpareServers   5 
    MaxSpareServers   100 
    MaxClients        3000 
    MaxRequestsPerChild   10000 

首先来看看apache各个参数的意义(引号里引用的是官方文档的描述): 
(1)ServerLimit和MaxClients  服务器最大同时响应请求数 
这个就是你当前配置的apache最大的并发响应数,对应的是apache的进程数,两个参数同时修改,MaxClients不得大于ServerLimit参数。 
ServerLimit的大小,取决于你系统的资源,每个apache进程默认占用2M内存,基本可以按照这个公式来计算:最大内存*80%/2M=ServerLimit 

(2)StartServers  750   启动时默认启动的进程数 
这个参数默认是5,因为apache会通过自动启动新进程来增加响应服务的进程数,这个值不做调整的也是可以的,会由默认的5增加到满足服务的进程数,但是会出现开始启动时的卡住。 
小启动参数有一个好处:就是可以让传递后后端tomcat的压力缓慢增加上来,而不是一下子增加压力。可以把这个调整到当前服务最大的并发数,当前服务最大并发连接数,可以通过监控apache进程个数:ps -ef | grep httpd | wc -l 来获得。不用调得太大,否则是无谓增加apache通过jk去跟tomcat建立的连接。 

注意:apache进程跟tomcat建立连接后,不会释放此连接,会一直保持连接,直到timeout,如果没有timeout时间,就会永久连接。timeout的设置,会在后面jk配置里说明。 

所以不要一次启动太多的apache进程,只启动足够用的进程即可。其他增加的流量,apache会自动调整进程数,直到MaxClients参数限定的范围。 

(3)MinSpareServers 5   最小空闲进程 
MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以第一秒一个,第二秒两个,第三秒四个,按指数递增个数的速度产生新的子进程。 
(4)MaxSpareServers 10  最大空闲进程 
MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。 

可以调整这两个参数,但是这两个参数的值不能设得太大,否则apache进程太多,会导致对应开启的tomcat进程也会很多。 
官网上关于这两个参数都有这么句话:“将此参数设的太大通常是一个坏主意。” 
在一台压力大(并发访问2800)的服务器上,MaxSpareServers这个值设置的是200。 
设置了这个值的好处是不会有太多的空闲的进程在消耗资源,同时减少apache和tomcat的连接端口。 
关闭空闲apache进程的同时,会释放jk连接,同时释放tomcat连接数,进而减少系统资源消耗。 

(5)MaxRequestsPerChild   10000 
"MaxRequestsPerChild指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。 
将MaxRequestsPerChild设置成非零值有两个好处: 
    * 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。 
    * 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。 
注意 
对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。" 

也就是说实际上这个时候子进程最大连接数等于MaxRequestsPerChild*MaxKeepAliveRequests 
所以在开启KeepAlive后,需要同时设置MaxRequestsPerChild和MaxRequestsPerChild,确保每个apache进程在服务一定请求数后会关闭,重新开启新的子进程,避免apache进程异常导致的内存泄露和资源占用。
 

(6)Keep-Alive 
默认:ON 
发送的请求,在MaxRequestsPerChild里面只算一个,不管这个连接发送了多少个请求。 

(7)MaxKeepAliveRequests 
默认:100 
"一个建立好的Keep-Alive连接,允许发送的请求的个数。一旦建立连接,要么就是个数达到了断开,要么就是等KeepAliveTimeout时间到了断开连接。 
MaxKeepAliveRequests指令限制了当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。" 

这个数字的设置,必须考虑在一个时间段内,同一个用户访问你的服务会发多少请求。要结合KeepAliveTimeout参数来考虑。 
举个例子,用户需要间隔时间不大于KeepAliveTimeout的时间内,连续请求10个文件,那么这个参数就应该设置成10,如果用户在连续时间里不断请求访问,则这个数值得设置得更多。否则就重新建立连接下载。一旦用户连续进行了10个请求后,并且这个用户肯定在完成这些请求后的5秒内不会再请求,甚至要在之后的很长时间后请求,那么这个KeepAliveTimeout时间就可以设置得很短,以便尽早断开这种用户,把资源让个其他用户。 


(8)KeepAliveTimeout 
默认:5 
"在一个建立好的Keep-Alive连接上,在MaxKeepAliveRequests个数未满的情况下,等待下一个请求的时间。" 

如果有请求到达,那么apache等待IO响应的timeout时间时间开始生效,timeout时间没等到响应,连接被断开;如果KeepAliveTimeout时间内,没有请求到达,连接就被断开。 
具体设置可以参考配合MaxKeepAliveRequests参数。同时这个参数又受TimeOut参数影响,在一次成功连接中,TimeOut时间内没有等到响应,也会断开连接。 


(9)TimeOut 
默认:300 
"TimeOut指令用于设置Apache等待以下三种事件的时间长度: 

   1. 接受一个GET请求耗费的总时间。 
   2. POST或PUT请求时,接受两个TCP包之间的时间。 
   3. 应答时TCP包传输中两个ACK包之间的时间。 

我们计划在发展里程中,逐步把它们分别变得更易配置。计时器在1.2版本之前的默认值为1200,而现在已经设置为300了,但对于绝大多数情况来说仍是足够的。没有把它默认值设的更小的原因在于代码里还有点问题:有时发送一个包之后,计时器没有复位。” 


(二 )调整jk参数配置和tomcat设置 
jk连接主要给每个worker添加了两个参数: 
  
worker.tomcat1.type=ajp13 
worker.tomcat1.host=localhost 
worker.tomcat1.port=8109 
worker.tomcat1.lbfactor=1 
worker.tomcat1.socket_timeout=10 
worker.tomcat1.connection_pool_timeout=600 


首先来了解一下这两个配置参数: 
worker.tomcat1.socket_timeout=10 
worker.tomcat1.connection_pool_timeout=600 

socket_timeout默认为0 
设置JK与远程服务器的Socket连接超时秒数,如果超出此秒数则产生一个错误,并再次重试。如果为0,JK会一直等下去。在连接出现异常的时候,尽快关闭连接,从而保证无用的socket会被回收。 

connection_pool_timeout:默认值0,单位秒 
在连连池中维护的非活动连接连续多少秒后被释放。如果为0,则不释放。详细可以参考tomcat官方文档,jk在处理连接的时候,是用一个线程池建立跟tomcat的连接,并且把所有连接都放在连接池。如果这个值为0的时候,它就不会释放任何已经空闲的连接,也就是说这个连接池在某个瞬间压力很大的话,被撑大了就不会小下来。所以这个值一定不能使用默认的0,必须修改。官方推荐是10分钟,也就是600秒。一旦设置了这个值,就一定要注意:必 须同时设置对应的tomcat的ajp连接器配置里的connectionTimeout参数大小跟它完全一致!同时必须注意这两个参数单位不一样:jk connection_pool_timeout单位是秒,而tomcat connectionTimeout单位是毫秒。 

来解释一下为什么必须设置两个参数完全一致:这两个参数的意思是在连接空闲多长时间后关闭空闲连接(不包括活动的连接)。想象一下这边apache jk模块开启了一个连接A,连接到tomcat的B,这个连接被固化了,保持在连接池里。这个时候,如果A突然关闭,导致的结果是B返回的数据不知道给谁,tomcat会抛出socket异常;如果B突然关闭,则A突然失去连接,无法进行程序响应,会返回错误给用户。这就是所谓的半连接,一半是开的,另 外一半却关闭了,并且这个时候还不知道对方已经关了,程序会一直单方面开启着自己的这一半,导致资源浪费。所以必须设置两个的空闲关闭时间一致,这样两边同时开启,在空闲时间等待到了相同的时间后,同时关闭。这样jk和tomcat建立的连接在空闲时会慢慢变小,从而保证资源不被浪费,空闲的socket被关闭回收。 


调整tomcat配置参数 
minSpareThreads="100" 
maxSpareThreads="200" 
connectionTimeout="600000" 

空闲线程不用太多,减少系统负载。同时设置 connectionTimeout和jk的connection_pool_timeout一致,保证空闲连接的同时回收。高并发情况下,这个时间可以设置得短一些,比如:20000 ms 

此配额的优点是: 
apache空闲线程少,同时产生的通过jk和tomcat建立的永久连接也少,并且和tomcat的连接能在空闲一定时间后自动回收。占用系统socket连接少。 

可以通过以下命令对比查看各状态的socket连接: 
查看当前tcp/ip连接状态:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 
查看tcp/ip连接数:cat /proc/net/sockstat 


参考文档链接: 
apache2.2文档: 


tomcat6参数说明文档:http://tomcat.apache.org/tomcat-6.0-doc/config/ajp.html 

jk workers.properties 
参数说明文档:http://tomcat.apache.org/connectors-doc/reference/workers.html 

分享到:
评论

相关推荐

    Apache的prefork模式和worker模式该户.docx

    Apache的prefork模式和worker模式该户.docx

    apache2-prefork-2.2.22.i586.rpm

    Linux 下apache2-prefork-2.2.22-i586.rpm 快速安装包

    apache2-prefork-2.2.22-4.7.1.x86_64.rpm

    apache2-prefork 64位快速安装包

    Apache的fork模式和worker模式判断方法

    apache常用的工作模式有prefork和worker模式。运行命令httpd -l 或者apache2 -l ,输出的结果中如果含有prefork.c,那就是prefork模式,如果结果中含有worker.c,那就是worker模式。 知道模式之后我们可以在apache的...

    Apache HTTP Server Version 2.2 文档(2013.4.10最新)

    Apache 2.2 新特性概述 配置段(容器) 服务器全局配置 站点导航 停止和重启 suEXEC支持 致谢与译者声明 从2.0升级到2.2 从1.3升级到2.0 从URL到文件系统的映射 Apache 1.3 API 备忘录 APR中内存分配的调试 Apache 2.0...

    Nginx + php 搭建 超性能 WEB 服务器

    Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该... 根据我的经验,4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们将占用3GB以上的内存,还得为系统预留

    Apache的两种工作模式

    Apache的两种工作模式: prefork模式: 使用多个子进程,每个子进程只包含一个线程 特点:效率高,内存使用率高 worker模式 使用多个子进程,每个子进程包含多个线程 特点:内存使用率低,一个线程崩溃,整个...

    Apache Prefork、Worker和Event三种MPM详解

    主要介绍了Apache Prefork、Worker和Event三种MPM详解,着重介绍了配置参数部分,需要的朋友可以参考下

    apache优化和模块安装

    apache关于最大连接的优化.关于prefork和worker模块的.

    Apache 并发优化设置方法

    Apache优化步骤: 1、先查看apache的运行模式,查看命令: httpd -l Compiled in modules:  core.c  prefork.c  http_core.c  mod_so.c  这里可以看到运行模式是prefork模式。 2、修改apache 的httpd.conf 配置...

    查看apache连接的连接并发数

    查看apache连接的连接并发数 查看httpd进程数(即prefork模式下Apache能够处理的并发请求数)

    Apache源代码全景分析第1卷:体系结构与核心模块 part2

    包括配置文件、模块化结构、多任务并发,以及网络连接和请求读取,其中多任务并发体系结构是《Apache源代码全景分析第1卷:体系结构与核心模块》分析的重点,讨论了Prefork、Worker及WinNT三种MPM。《Apache源代码...

    apache-formula:设置和配置Apache HTTP服务器

    阿帕奇 在GNU / Linux,FreeBSD和Windows OS上设置和配置Apache HTTP服务器的公式。 目录请参阅完整的。... 在Debian mpm_prefork , mpm_worker或mpm_event上配置apache mpm模块(仅Debian) 启用了Apache模

    Apache源代码全景分析第1卷:体系结构与核心模块 part1

    包括配置文件、模块化结构、多任务并发,以及网络连接和请求读取,其中多任务并发体系结构是《Apache源代码全景分析第1卷:体系结构与核心模块》分析的重点,讨论了Prefork、Worker及WinNT三种MPM。《Apache源代码...

    深入理解apahce的工作模式perfork、worker

    prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下...

    Go的快速DNS实施-Golang开发

    分配dns请求解析器0-分配dns记录编组工作池+消息池prefork + restart_port + set_affinity入门fastdns服务器示例程序包主要导入(“ log”“ net”“ os”“ github.com/phuslu/fastdns”)类型DNSHandler结构{调试

    lnamp:一键源码编译安装LNMP LAMP Tomcat

    RHEL6,RHEL7启用交换启用iptables修改SSH服务端口使用OpenSSL 1.1.1构建的Nginx / 1.16.1 Apache2.2.34工作模式为PreforkMPM(最终版本2.2.34已于2017年7月发布) Apache2.4工作模式为Event MPM(编译全部Prefork,...

    rapache:R内嵌在Apache中

    Rapache项目 它是什么?...该版本已在Debian Linux下使用Apache 2.2.4,R 2.5.1和libapreq 2.0.4进行了测试。 必须使用prefork MPM编译Apache2才能编译mod_R。 同样,R必须已使用--enable-R-shlib confi

    docker-lamp:LAMP 应用程序的 Docker APSL 基础项目

    ) envtpl 配置 apache mpm prefork 参数。 也可用于继承的 Dockerfile。 马戏团来控制进程。 sshd sftp 的 proftpd 用于 apache logrotation 的单个 cron 有关更多信息,请参阅基本图像apsl/circusbase : 环境变量...

Global site tag (gtag.js) - Google Analytics