免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 13894 | 回复: 25
打印 上一主题 下一主题

[Web] Apache的进程与线程讨论 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-07 15:33 |只看该作者 |倒序浏览
自从apache2.0出来之后,跑线程成了一个相当理想的方式,因此直到今天早上我还是一直认为进程模式要逊色于线程模式。但是从今天的实际使用情况来看,进程模式在某些地方还是要优于线程的。

实例:
在一台Sun的U80的机器上,虽然老了一点,但是跑个apache+php应该问题不大吧:)内存2G
原来这台机器上跑得是apache1.1.12+php4.0.1很老了。一直这样跑了几年了,一直没有出什么问题。但是现在访问量加大,而当时编译的时候没有修改httpd.h,因此MaxClint最大只能支持到256,而不能满足需求了,否则访问速度奇慢无比。由于以前的思想固化认为跑线程一定性能更好,而且2.0不需要修改源码,随便设置:)。因此就重新编译了apache2.0.50+php4.3.8,由于一直使用worker的MPM方式,其他MPM,一直觉得一般,这次也照旧拉。。。:)。编译安装完成之后,配置MPM,设了3个参数:
MaxClient                            1000  
ThreadsPerChild                  25
ServerLimit                          40

这个设置我认为不是很过分吧。。。最多限制起40个进程,每个进程含有25个线程。
可是实际情况很糟,load average开始迅速串升,最高到了200多。。。该死,那我想可能参数设的太大了,我从小开始设起总行了吧:
MaxClient                             300
ThreadsPerChild                   30
ServerLimit                           10

还是不行。load average还是会上串。。。
还试了一些参数包括很变态的把ThreadsPerChild设成1,而ServerLimit设成300,还是会上串。
把ServerLimit设成200,ThreadsPerChild还是1的情况也没有apache1.x好。
最后我只能重新编译apache和php,选择1.3.31,修改httpd.h,把最大连接支持到2560,编译完成后MaxClient设成800,ps -ef|grep -i httpd|wc -l 大概数字在500附近,load average也比较正常。没有超过10,一般稳定在5左右。

当然需要申明的是:线程模式在机器性能比较高的情况下,特别是cpu比较高的情况下确实要比进程要好。不过还有一点需要考虑的是,我这边的页面需要和oracle数据库以及java程序打交道,因此可能这样的页面使用进程比较好。这是我的一点想法,欢迎驳斥我!指出我理解有偏颇的地方!

论坛徽章:
0
2 [报告]
发表于 2004-09-07 21:01 |只看该作者

Apache的进程与线程讨论

好!我就喜欢看这样子的帖子!长知识!





——————————————————————
擦亮你的双眼,一个普通人都有值得记住的一面,更何况是我了。
——————————————————————

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-09-08 10:44 |只看该作者

Apache的进程与线程讨论

按照这个配置看看

<IfModule worker.c>;
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0

还有,serverlimit是干什么的啊。。
httpd2的最大请求数是:
maxclient×threadsperchild,也就是上例中150×25=3750啊。能响应3750条连接。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-09-08 12:00 |只看该作者

Apache的进程与线程讨论

晕,我仔细看了楼主的文章,你是不是apache1和apache2的一些东西混了。

---------------------------
MaxClient 1000
ThreadsPerChild 25
ServerLimit 40
这个设置我认为不是很过分吧。。。最多限制起40个进程,每个进程含有25个线程。
----------------

Maxclient是线程数,不是响应连接数。
serverlimit 40 是apache1的东西吧,不是apache2的东西吧。

论坛徽章:
0
5 [报告]
发表于 2004-09-08 14:37 |只看该作者

Apache的进程与线程讨论

没有搞混,兄弟。
ServerLimit在worker的MPM中默认是16,基本配置里面没有,因此如果要修改的话是需要自己加上这个参数
这几个参数我是这么理解的!
MaxClient我可能确实理解错了,应该代表总的进程*线程数!!!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2004-09-09 09:40 |只看该作者

Apache的进程与线程讨论

Apache MPM worker
说明: 使网络服务器支持多线程多进程的多道处理模块
状态: MPM
模块名: mpm_worker_module
源文件: worker.c

概要
此多道处理模块(MPM)使网络服务器支持多线程多进程。 由于使用线程来处理请求,所以,可以处理巨量请求,而系统资源的开销小于基于进程的服务器。 但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的服务器的稳定性。

控制这个MPM的最重要的指令是,控制每个子进程允许建立的线程数的ThreadsPerChild指令,和控制允许建立的进程总数的MaxClients。

它是如何运作的
每个进程可以拥有的线程数量是固定的。 服务器会根据负载情况做增加或减少进程数量的调整。

单个控制进程负责子进程的建立。每个子进程可以建立由ThreadsPerChild指定的固定数量的线程。 然后,由独立的线程监听并处理到来的连接。

Apache总是试图维持一个备用的或者说空闲的服务线程池。 如此,客户端无须等待线程或进程的建立即可得到处理。 最初建立进程的数量由StartServers指令所决定。 其后,Apache检测所有进程中空闲线程的总数,并新建或结束进程使总数维持在MinSpareThreads和MaxSpareThreads所指定的范围以内。 由于这个过程是自动调整的,几乎没有必要修改这些指令的缺省值。 同时可以得到处理的客户端的最大数量取决于MaxClients指令,而进程建立的最大数量取决于ServerLimit指令。ServerLimit乘以ThreadsPerChild必须大于等于MaxClients。

worker MPM 中进程-线程控制的典型配置如下:

StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
ServerLimit         16
在Unix中,为了能够绑定端口80,父进程一般都是以root身份启动的, 其后,Apache以较低权限的用户建立子进程和线程。User和Group指令用于设置Apache子过程的权限。 虽然子进程必须对其提供的内容拥有读权限,但应该尽可能给予它较少的特权。 另外,除非使用了suexec, 否则,这些指令设置的权限将被CGI脚本所继承。

MaxRequestsPerChild 指令用于控制服务器建立和结束进程的频率。

论坛徽章:
0
7 [报告]
发表于 2004-09-09 12:03 |只看该作者

Apache的进程与线程讨论

我觉得上面的文章有点问题:
“控制允许建立的进程总数的MaxClients。”它这里说的是不是指总的进程数呢,如果是的话,那看下面一句话:“
进程建立的最大数量取决于ServerLimit指令。ServerLimit乘以ThreadsPerChild必须大于等于MaxClients。 ”这不是自相矛盾吗?正确的理解还是那个,ServerLimit是用来控制进程数,而ThreadsPerChild用来控制每个子进程下面的线程数!
我觉得翻译有点问题,特别是对于“控制允许建立的进程总数的MaxClients。”这句话!MaxClients应该是进程*线程。
实际使用中也证实了这一点!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-09-10 09:26 |只看该作者

Apache的进程与线程讨论

呵呵,我开始也有点糊涂,但是仔细看了看。

serverlimit是最大进程数,但是决定响应连接数的不是进程,而是线程的总和。serverlimit的左右是控制最大的进程数。因为MinSpareThreads 和MaxSpareThreads的大小,是通过增减进程来增减空闲线程的。这个和maxclient是线程的总和不矛盾啊。

----------------原文
同时可以得到处理的客户端的最大数量取决于MaxClients指令,而进程建立的最大数量取决于ServerLimit指令。ServerLimit乘以ThreadsPerChild必须大于等于MaxClients。
--------------
通过maxclinet来限制响应连接数,但是如果ServerLimit乘以ThreadsPerChild不大于或者等于maxclinets,这个maxclinets就没有意义了。决定最大请求的就变成了serverlimit决定的了。。

招聘 : Java研发
论坛徽章:
0
9 [报告]
发表于 2004-09-10 10:53 |只看该作者

Apache的进程与线程讨论

刚才看了楼上的讨论,我又查apache的文档,
我的理解是 <IfModule prefork.c>;  是apache1.3.x用的方式,而<IfModule worker.c>; 是apache2.0.x的方式。

但我发现在Solaris上安装的apache2默认设置了 prefork 和 worker 两个设置同时存在,那么是否会冲突呢?系统到底以哪个为准控制最大连接数?

通过maxclinet来限制响应连接数,但是如果ServerLimit乘以ThreadsPerChild不大于或者等于maxclinets,这个maxclinets就没有意义了。决定最大请求的就变成了serverlimit决定的了。。

会不会是MaxClients控制入口,假如超过这个数,直接拒绝了(避免崩溃?等待?);而ServerLimit×ThreadsPerChild是实际产生线程处理?

论坛徽章:
0
10 [报告]
发表于 2004-09-10 10:58 |只看该作者

Apache的进程与线程讨论

看了二位兄台的讨论,觉得“ServerLimit乘以ThreadsPerChild必须大于等于MaxClients”只是保证可以充分享受MaxClients给予的利益,而实际运行不是少几个进程,就是某几个进程的线程少几个,最后还是受MaxClients限制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP