Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588374
  • 博文数量: 151
  • 博客积分: 3330
  • 博客等级: 中校
  • 技术积分: 1686
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-08 02:41
文章存档

2011年(151)

分类: LINUX

2011-04-21 15:46:54

MPM:多路处理模块

MPM必须在编译配置时进行选择,并静态编译到服务器中。如果编译器能够确定线程功能被启用,它将会负责优化大量功能。因为一些MPM在Unix上使用了线程,而另外一些没有使用,所以如果在编译配置时选择MPM并静态编译进Apache,Apache将会有更好的表现。

你可以在使用脚本时用 --with-mpm=NAME 选项指定MPM,NAME就是你想使用的MPM的名称。

一旦服务器编译完成,就可以用 ./httpd -l 命令来查看使用了哪个MPM。这个命令将列出所有已经被编译到服务器中的模块,包括MPM。

MPM:类型

event:

一个标准MPM的实验性变种。
MPM
mpm_event_module
event.c


概述
多路处理模块(MPM)被设计成面向需要处理大量并发连接的场合(特别是在开启的场合),它基于开发,并且配置指令与完全相同。

该MPM依赖于APR用于线程同步的compare-and-swap原子操作,并且你还需要在命令行上使用--enable-nonportable-atomics=yes选项。

该MPM不能在缺乏良好线程支持的平台上正常工作,特别是缺乏EPoll或KQueue支持的平台。

对于Linux,最低要求2.6及以上版本的内核。并且还需要确保你使用的glibc具有EPoll支持(推荐使用glibc-2.6.1及以上的版本)。

[译者注]
事实上,这个MPM除了在应用于HTTPS以及配合输入过滤器工作时可能会出现故障外,其它场合和一样稳定,工作方式也类似,并且在性能上优于,特别是开启时优势更加明显。

prefork:

一个非线程型的、预派生的MPM
MPM
mpm_prefork_module
prefork.c

概述
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。

这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。

一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。

, , , 指令用于调节父进程如何产生子进程。通常情况下Apache具有很强的自我调节能力,所以一般的网站不需要调整这些指令的默认值。需要处理最大超过256个并发请求的服务器可能需要增加的值。内存比较小的机器则需要减少的值以保证服务器不会崩溃。

在Unix系统中,父进程通常以root身份运行以便邦定80端口,而Apache产生的子进程通常以一个低特权的用户运行。和指令用于设置子进程的低特权用户。运行子进程的用户必须要对它所服务的内容有读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。

指令控制服务器杀死旧进程产生新进程的频率。


worker:
支持混合的多线程多进程的多路处理模块
MPM
mpm_worker_module
worker.c


概述

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

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

每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。

Apache总是试图维持一个备用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。初始化时建立的进程数量由指令决定。随后父进程检测所有子进程中空闲线程的总数,并新建或结束子进程使空闲线程的总数维持在和所指定的范围内。由于这个过程是自动调整的,几乎没有必要修改这些指令的缺省值。可以并行处理的客户端的最大数量取决于指令。活动子进程的最大数量取决于除以的值。

有两个指令设置了活动子进程数量和每个子进程中线程数量的硬限制。要想改变这个硬限制必须完全停止服务器然后再启动服务器(直接重启是不行的),是活动子进程数量的硬限制,它必须大于或等于除以的值。是所有服务线程总数的硬限制,它必须大于或等于指令。这两个指令必须出现在其他MPM指令的前面。

在设置的活动子进程数量之外,还可能有额外的子进程处于"正在中止"的状态但是其中至少有一个服务线程仍然在处理客户端请求,直到到达以致结束进程,虽然实际数量会很小。这个行为能够通过以下禁止特别的子进程中止的方法来避免:

  • 将设为"0"
  • 将和设为相同的值
一个典型的针对MPM的配置如下:

ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25

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

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


apache 模块:


注:以上全部为从网上取得,综合在一起,只为自己查看方便,若侵犯作者权益,请作者本人联系我删除!




阅读(1455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~