如何查看apache 转发请求的请求进程数

本站流量较大
linux服务器
查看 ps –ef | grep httpd | wc –l ,就会发现httpd进程数为1002
请问这个上限怎么调大一些?
采纳的答案
如何知道apache是工作在哪个模式下的,答案很简单:apachectl -l即可。
这里,我先以prefork模式为例来说明参数的设置,其缺省设置一般如下:
&IfModule mpm_prefork_module&
&&&&&&&& StartServers&&&&&&&&&&&&&& 5
&&&&&&&& MinSpareServers&&&&&&&&&&& 5
&&&&&&&& MaxSpareServers&&&&&&&&&& 10
&&&&&&&& MaxClients&&&&&&&&&&&&&& 150
&&&&&&&& MaxRequestsPerChild&&&&&&& 0
&/IfModule&
prefork 控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。 MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:1、可防止意外的内存泄漏。2、在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负载来调整这个值。MaxClients是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep httpd|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。ServerLimit指令无须重编译Apache就可以加大MaxClients。
注意,虽然通过设置ServerLimit,我们可以把MaxClients加得很大,但是往往会适得其反,系统耗光所有内存。以我手头的一台服务器为例:内存2G,每个apache进程消耗大约0.5%(可通过ps aux来确认)的内存,也就是10M,这样,理论上这台服务器最多跑200个apache进程就会耗光系统所有内存,所以,设置MaxClients要慎重。
模块安装应该取最小集合:/thinkinginlamp/blog/item/d677cffc1e083d83b901a016.html
再来看看work模式,缺省参数一般如下:
&IfModule mpm_worker_module&
&&&&&&&& StartServers&&&&&&&&&&&&&& 2
&&&&&&&& MaxClients&&&&&&&&&&&&&& 150
&&&&&&&& MinSpareThreads&&&&&&&&&& 25
&&&&&&&& MaxSpareThreads&&&&&&&&&& 75
&&&&&&&& ThreadsPerChild&&&&&&&&&& 25
&&&&&&&& MaxRequestsPerChild&&&&&&& 0
&/IfModule&
Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。 ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。
已解决问题
未解决问题成为Java GC专家(4)—Apache的MaxClients参数详解及其在Tomcat执行FullGC时的影响 - ImportNew
| 分类: ,
| 标签: ,
这是“成为Java GC专家系列文章”的第四篇。
在第一篇文章
中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。
在第二篇文章
中我们学到了JVM到底是如何执行垃圾回收,我们如何监控GC,以及那些工具可以使得监控过程更高效。
在第三篇文章 中我们通过实际的例子学到了一些可以优化GC的参数。同时我们讲解了如何减少对象被转移到老年代空间,如何缩短Full GC时间,以及如何设置GC类型及内存空间。
在第四篇文章中,我们将阐述Apache中MaxClients 参数的重要性,以及他如何在GC发生时,显著地影响整个系统的性能。我将提供几个例子以方便你理解MaxClients 导致的问题。同时我还会说明如何根据系统的内存情况,设置最佳的MaxClients参数值。
MaxClients对于系统的影响
(译者注:NHN是作者工作的公司)服务的执行环境中存在一组-type参数(译者注:节流阀参数,用于控制系统负载)。这些参数对于系统来说十分重要。下面我们看一下Apache的 MaxClients 参数在 发生时是如何影响系统的。
大部分开发人员都知道在由于GC发生而导致的”停止世界现象(STW) “(详细请参见)。尤其是,NHN的Java开发人员经常会遇到由于GC原因导致的Tomcat报错。由于 (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进程数量暴增,引发内存交换,降低系统性能。
MaxClients参数的计算公式
如果系统的内存使2GB,MaxClients 的值在任何情况下都不应该超过内存的80%(1.6GB),以避免由于内存交换导致的性能下降。换句话说。1.6GB的内存应该共享和分配给Apache,Tomcat以及那些默认被安装的代理程序。
让我们假设代理程序被默认安装在系统,并占用了200m内存,对于Tomcat堆内存的-Xmx 被设定为 600m。因此根据top命令的结果,Tomcat会一直占用725m(Perm Gen + Native Heap Area)。最终Apache可以使用700m内存空间。如下所示。
图2:测试系统的top截屏
如上所述,我们将内存设为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.
英文原文:,编译:-
译文地址:
【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】
关于作者:
王晓杰。已过而立之年,毕业于北京工业大学,计算机科学与技术学士学位。
PMP,SCJP,SCWCD。
目前就职于高森明晨信息科技有限公司,任助理产品总监。
潜心学习中,目前主要方向为Java分布式系统架构,Java虚拟机,Android应用。
平时喜爱打篮球和厨艺。
微信关注: ImportNew
分享Java相关的技术文章、工具资源和热点资讯。扫描加关注,碎片时间提高Java开发技能!
RandomAccessFile 操作动态文件,分析日志系统,多线程操作同一文件更高效,方便。
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
新浪微博:
微信号:importnew
反馈建议:@
广告与商务合作QQ:
& 2015 ImportNew您所在的位置: &
Nginx使用的php-fpm的两种进程管理方式及优化
Nginx使用的php-fpm的两种进程管理方式及优化
谋万世全局者
关于Nginx的php-fpm配置,它有两种进程管理方式。与Apache类似,它的进程数也是可以根据设置分为动态和静态的。这两种不同的进程管理方式,可以根据服务器的实际需求来进行调整。
PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式。与Apache类似,它的进程数也是可以根据设置分为动态和静态的。
php-fpm目前主要又两个分支,分别对应于php-5.2.x的版本和php-5.3.x的版本。在5.2.x的版本中,php-fpm.conf使用的是xml格式,而在新的5.3.x版本中,则是和php.ini一样的配置风格。
在5.2.x版本中,php-fpm.conf中对于进程管理号称是有两种风格,一种是静态(static)的,一种是类似于apache风格(apache-like)的。
Process manager settings
&value name=&pm&&
Sets style of controling worker process count.
Valid values are &static& and &apache-like&
&value name=&style&&static&/value&
按照文档的说明,如果pm的style采用apache-like,启动的进程数应该是和StartServers指定的一样。不过经过数次的尝 试,会发 现,实际上在这里将pm的style配置成apache-like没有起任何作用。也就是说,这里的apache-like并没有被实现。
不过,在最新的5.3.x的配套php-fpm中,apache风格的进程管理已经被实现了。
; Choose how the process manager will control the number of child processes.
; Possible Values:
- a fixed number (pm.max_children)
dynamic - the number of child processes are set dynamically based on the
following directives:
pm.max_children
- the maximum number of children that can
be alive at the same time.
pm.start_servers
- the number of children created on startup.
pm.min_spare_servers - the minimum number of children in 'idle'
state (waiting to process). If the number
of 'idle' processes is less than this
number then some children will be created.
pm.max_spare_servers - the maximum number of children in 'idle'
state (waiting to process). If the number
of 'idle' processes is greater than this
number then some children will be killed.
; Note: This value is mandatory.
;pm = dynamic
pm = static
由上面一段文字可知,对于进程的管理存在两种风格&&static和dynamic。和之前的版本的进程管理其实还是一样的,只是将apache-like改成了dynamic,这样更容易理解。
如果设置成static,php-fpm进程数自始至终都是pm.max_children指定的数量,不再增加或减少。如果设置成 dynamic,则php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,
保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于
pm.max_spare_servers。
这两种不同的进程管理方式,可以根据服务器的实际需求来进行调整。
这里先说一下涉及到这个的几个参数,他们分别是pm、pm.max_children、pm.start_servers、pm.min_spare_servers和pm.max_spare_servers。
pm表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件的说明。
下面4个参数的意思分别为:
pm.max_children:静态方式下开启的php-fpm进程数量。
pm.start_servers:动态方式下的起始php-fpm进程数量。
pm.min_spare_servers:动态方式下的最小php-fpm进程数量。
pm.max_spare_servers:动态方式下的最大php-fpm进程数量。
如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始
的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和
pm.max_spare_servers之间调整php-fpm进程数。
那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。
对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效
率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M
得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在
2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的
内存分配给其他应用去使用,会使系统的运行更加畅通。
对于小内存的服务器来说,比如256M内存的VPS,即使按照一个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,那系统的崩
溃就应该很正常了。因此应该尽量地控制php-fpm进程的数量,大体明确其他应用占用的内存后,给它指定一个静态的小数量,会让系统更加平稳一些。或者使用动态方式,因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。具体最大数量根据 内存/20M
得到。比如说512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,则建议根据服
务器的负载情况来设置,比较合适的值在5~10之间。
【责任编辑: TEL:(010)】
关于&&&&的更多文章
开始察觉到你的台式机或笔记本电脑变的有那么点儿不好用了?只用
网友评论TOP5
本期重点推荐:转角遇到Zabbix:企业级分布式系统监控部署
开源真的不能赚钱么?十年前如果向Microsoft投资10万
目前,越来越多的网站采用Linux操作系统,提供邮件、W
Linux Deepin 作为目前国内较活跃的 Linux 桌面发行版
Linux出色的网络功能堪称当今操作系统中的佼佼者,无论在功能还是在支持能力上都有令人满意的表现。Linux内置的多个服务器,几乎
51CTO旗下网站

我要回帖

更多关于 查看apache版本 的文章

 

随机推荐