Apache MPM worker
说明 | 支持混合的多线程多进程的多路处理模块 |
---|---|
状态 | MPM |
模块名 | mpm_worker_module |
源文件 | worker.c |
概述
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。
控制这个MPM的最重要的指令是,控制每个子进程允许建立的线程数的ThreadsPerChild
指令,和控制允许建立的总线程数的MaxClients
指令。
工作方式
每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild
数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
Apache总是试图维持一个备用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。初始化时建立的进程数量由StartServers
指令决定。随后父进程检测所有子进程中空闲线程的总数,并新建或结束子进程使空闲线程的总数维持在MinSpareThreads
和MaxSpareThreads
所指定的范围内。由于这个过程是自动调整的,几乎没有必要修改这些指令的缺省值。可以并行处理的客户端的最大数量取决于MaxClients
指令。活动子进程的最大数量取决于MaxClients
除以ThreadsPerChild
的值。
有两个指令设置了活动子进程数量和每个子进程中线程数量的硬限制。要想改变这个硬限制必须完全停止服务器然后再启动服务器(直接重启是不行的),ServerLimit
是活动子进程数量的硬限制,它必须大于或等于MaxClients
除以ThreadsPerChild
的值。ThreadLimit
是所有服务线程总数的硬限制,它必须大于或等于ThreadsPerChild
指令。这两个指令必须出现在其他worker
MPM指令的前面。
在设置的活动子进程数量之外,还可能有额外的子进程处于"正在中止"的状态但是其中至少有一个服务线程仍然在处理客户端请求,直到到达MaxClients
以致结束进程,虽然实际数量会很小。这个行为能够通过以下禁止特别的子进程中止的方法来避免:
- 将
MaxRequestsPerChild
设为"0" - 将
MaxSpareThreads
和MaxClients
设为相同的值
一个典型的针对worker
MPM的配置如下:
ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
在Unix中,为了能够绑定80端口,父进程一般都是以root
身份启动,随后,Apache以较低权限的用户建立子进程和线程。User
和Group
指令用于设置Apache子进程的权限。虽然子进程必须对其提供的内容拥有读权限,但应该尽可能给予它较少的特权。另外,除非使用了suexec
,否则,这些指令设置的权限将被CGI脚本所继承。
MaxRequestsPerChild
指令用于控制服务器建立新进程和结束旧进程的频率。