`
siaslance
  • 浏览: 22808 次
文章分类
社区版块
存档分类
最新评论

Apache优化3---java web开发总结(二):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 | grephttpd | 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 单位是秒,而 tomcatconnectionTimeout 单位是毫秒。

来解释一下为什么必须设置两个参数完全一致:这两个参数的意思是在连接空闲多长时间后关闭空闲连接 ( 不包括活动的连接 ) 。想象一下这边 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-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 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...

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

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

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

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

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

    《Apache源代码全景分析第1卷:体系结构与核心模块》的目的是深入挖掘Apache运行背后的实现机制和模块开发的细节,适合Apache模块开发者、希望了解内部细节的Apache管理员、Web服务器开发者、大规模服务器开发者学习...

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

    《Apache源代码全景分析第1卷:体系结构与核心模块》的目的是深入挖掘Apache运行背后的实现机制和模块开发的细节,适合Apache模块开发者、希望了解内部细节的Apache管理员、Web服务器开发者、大规模服务器开发者学习...

    apache优化和模块安装

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

    Python库 | py-prefork-server-0.5.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:py-prefork-server-0.5.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    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能够处理的并发请求数)

    ask-pupkin:我的 Technopark 研究的示例 Web 项目

    #AskPupkin 我的 Technopark 研究的示例 Web 项目。安装描述了基于 Debian 的系统的安装。要求AskPupkin 使用进行搜索。 安装 Apache 和 mod-wsgi # apt-get install apache libapache2-mod-wsgi阿帕奇配置基于 ...

    Apache Prefork、Worker和Event三种MPM详解

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

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

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

    UvA_API_Alumni

    请参阅requirements.txt以了解软件包的依赖性请注意,并非严格要求iPython及其依赖项安装(选项1) 安装依赖项(假设基于Debian的GNU / Linux) sudo apt install apache2 apache2-dev apache2-utils apache2-mpm-...

    rapache:R内嵌在Apache中

    mod_R:Apache 2.0模块,该模块实现粘合以加载R解释器。 libapreq 2.0.4:Apache赞助的项目,用于解析请求输入。 如果您不想编译和安装此版本,则可以指定在配置过程中使用哪个libapreq2库。 最新版本 最新版本的...

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

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

    linux-aslr:概述Linux ASLR的基本缺陷

    Linux ASLR已损坏。 基本上,只要有一些合理的前提条件,您就可以将单个mmap的泄漏变成对ASLR的全面妥协。 而且,在某些公认的半罕见的上下文中,您应该能够盲目绕过linux ASLR。 前提条件是: 您可以访问相同的...

Global site tag (gtag.js) - Google Analytics