描述: | 实现混合多线程多进程Web服务器的多进程模块 |
---|---|
状态: | MPM |
模块标识符: | mpm_worker_module |
源文件: | 工人 |
该多处理模块(MPM)实现了混合多进程多线程服务器。通过使用线程来处理请求,与基于进程的服务器相比,它能够以更少的系统资源来处理大量的请求。但是,它通过保持多个进程可用(每个进程都有多个线程)来保留基于进程的服务器的大部分稳定性。
用于控制此MPM的最重要的指令是
ThreadsPerChild
,它控制每个子进程部署的线程数
MaxRequestWorkers
,而则控制可以启动的最大线程总数。
单个控制进程(父进程)负责启动子进程。每个子进程都会按照指令中的指定创建固定数量的服务器线程ThreadsPerChild
,以及一个侦听器线程,该线程侦听连接并将连接到达时将其传递给服务器线程进行处理。
Apache HTTP Server始终尝试维护一个备用服务器或空闲服务器线程池,它们随时准备服务传入的请求。这样,客户端无需等待新线程或进程的创建即可为其请求提供服务。初始启动的进程数由StartServers
指令设置。在运行期间,服务器会评估所有进程中空闲线程的总数,并分叉或终止进程,以将该数量保持在MinSpareThreads
和所指定的范围内。MaxSpareThreads
。由于此过程非常自我调节,因此几乎没有必要从这些指令的默认值修改它们。可以同时服务的最大客户端数(即,所有进程中的最大线程总数)由MaxRequestWorkers
指令确定
。活动子进程的最大数量由MaxRequestWorkers
指令除以
ThreadsPerChild
指令确定。
有两个指令对活动的子进程数和子进程中的服务器线程数设置了硬性限制,并且只能通过完全停止服务器然后再次启动服务器来更改。 ServerLimit
是对活动子进程数量的硬限制,并且必须大于或等于
MaxRequestWorkers
指令除以
ThreadsPerChild
指令。
ThreadLimit
是服务器线程数的硬限制,并且必须大于或等于ThreadsPerChild
指令。
除了这组活动的子进程之外,可能还有其他子进程正在终止,但是其中至少有一个服务器线程仍在处理现有的客户端连接。MaxRequestWorkers
尽管可以预期实际数目会小得多,但最多可能存在终止过程。可以通过禁用单个子进程的终止来避免此行为,这可以通过以下方式实现:
MaxConnectionsPerChild
为零
MaxSpareThreads
为与
MaxRequestWorkers
worker
MPM中进程线程控件的典型配置如下所示:
ServerLimit 16 StartServers 2 MaxRequestWorkers 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25
root
为了绑定到端口80,通常在Unix下启动父进程,而子进程和线程则由服务器以特权较低的用户身份启动。在User
和Group
指令用于设置Apache HTTP服务器的子进程的权限。子进程必须能够读取将要提供的所有内容,但应具有尽可能少的特权。此外,除非suexec
使用了这些指令,否则这些指令还将设置CGI脚本将继承的特权。
MaxConnectionsPerChild
通过杀死旧进程并启动新进程来控制服务器回收进程的频率。
mpm-accept
当遇到雷电群问题时(通常,当有多个侦听套接字时),此MPM使用互斥锁来序列化对传入连接的访问。可以使用Mutex
伪指令配置此互斥锁的实现方面
。在性能提示
文档有关于这个互斥的附加信息。