Apache两种多路处理模块(MPM)介绍
prefork
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。
就是每个请求需要一个独立的线程来处理。
worker
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。
就是每个进程可以处理多个请求,请求就是线程,一样是多进程的。
工作方式&配置
prefork
一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。
下面是目前的配置:
StartServers 4
MinSpareServers 2
MaxSpareServers 6
ServerLimit 64
MaxClients 64
MaxRequestsPerChild 1000
- StartServers设置了服务器启动时建立的子进程数量。
- MinSpareServers设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。
- MaxSpareServers设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。
- ServerLimit设置了Apache可以建立的最大进程数。
- MaxClients指令设置了允许同时伺服的最大接入请求数量。任何超过MaxClients限制的请求都将进入等候队列,直到达到ListenBacklog指令限制的最大值为止。一旦一个链接被释放,队列中的请求将得到服务。
- MaxRequestsPerChild指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。 将MaxRequestsPerChild设置成非零值有两个好处:
- 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
- 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
prefork如何配置
prefork下每个进程初始化时占用内存大概需要5M,处理完请求后会变大,我的Wordpress大概到20多M。
- ServerLimit设置首先要看服务器内存多大,其他软件需要占用多少内存,然后计算多少个进程会把剩下的内存占用完。那么每个进程算它占用多少内存好呢?我是认为:((20M(执行完)+5(刚创建))/3M)M,静态网站可能可以设置更小。我的一般不会同时出现太多请求,所以设置的比较随意。
- MaxClients设置需要小于等于ServerLimit,可以设置比ServerLimit小点,一般设置相同。
- MinSpareServers和MaxSpareServers,像我这些小Blog,不必设置太大。我Blog所在VPS内存较小,所以MaxSpareServers小点可以减少占用内存。
- MaxRequestsPerChild这个感觉比较随意。
worker
一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。
常见配置:
ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
- ServerLimit 设置了Apache能建立的最大进程数。
- StartServers设置了服务器启动时建立的子进程数量。
- MaxClients表示服务器可以接受的最大线程(请求)数量。
- MinSpareThreads设置最小空闲线程数,用于处理可能到来的突发请求。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
- MaxSpareThreads 设置最大空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。
- ThreadsPerChild这个指令设置了每个子进程建立的线程数。子进程在启动时建立这些线程后就不再建立新的线程了。
worker如何配置
我没有测试,如果需要使用可能需要先看下worker下每个进程占用资源的平均大小,然后在做设置,主要保证不要占用过多内存,导致服务器不稳定。
ServerLimit,
StartServers和prefork中的设置一样,要保证所有进程占用内存小于服务器能给Apache使用的内存大小。
MaxClients我认为一般设置成小于等于
ServerLimit*ThreadsPerChild ,但是别小得太过分,呵呵。
MinSpareThreads,
MaxSpareThreads也和prefork里的MinSpareServers,MaxSpareServers类似。
ThreadsPerChild这个因为我没有测试过worker模式所以凭感觉,我认为同样需要看内存来修改,太大可能会增加进程的占用内存大小。
总结
prefork和worker的进程数都是由ServerLimit来限制,但是两个模块进程的占用内存大小
应该会不一样,而能处理的并发请求数,prefork是由进程数决定的,而worker是由
ServerLimit*ThreadsPerChild决定的。设置时需要保证Apache内存不要占用过多而导致服务器不稳定,也要确定能处理较大的并发数。
更详细的可以看Apache的手册的模块里的prefork和worker,还有其他多路处理模块也可以看手册。
现在VPS的Apache用的是以prefork运行中,之前那么慢可能是因为MaxSpareServers或MinSpareServers设置太大,忘了我修改之前是多少了。
现在感觉貌似不错…不过可能要运行久点才知道!
以上配置是都是个人的见解,不保证它的优秀&可行!
有错的希望可以指出!
原文出自:Apache多路处理模块(MPM)之prefork和worker的配置。
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=195637&fromuid=995801