Apache MPM 工作者

Description:实现混合多线程多进程 Web 服务器的多进程模块
Status:MPM
Module Identifier:mpm_worker_module
Source File:worker.c

Summary

该 multiprocessing 模块(MPM)实现了混合多进程多线程服务器。通过使用线程来处理请求,与基于进程的服务器相比,它能够以较少的系统资源来处理大量的请求。但是,它通过保持多个进程可用(每个进程都有多个线程)来保留基于进程的服务器的大部分稳定性。

用于控制此 MPM 的最重要的指令是ThreadsPerChildMaxRequestWorkersThreadsPerChild控制每个子进程部署的线程数,而MaxRequestWorkers控制可以启动的最大线程总数。

工作原理

单个控制进程(父进程)负责启动子进程。每个子进程都会创建ThreadsPerChild指令中指定的固定数量的服务器线程,以及侦听器线程,该线程监听连接并将连接到达时将其传递给服务器线程进行处理。

Apache HTTP Server 始终尝试维护一个备用服务器或空闲服务器线程池,这些线程随时可以处理传入的请求。这样,Client 端无需 await 新线程或进程的创建即可为其请求提供服务。最初启动的进程数由StartServers指令设置。在运行期间,服务器会评估所有进程中空闲线程的总数,并分叉或终止进程,以将该数量保持在MinSpareThreadsMaxSpareThreads指定的边界内。由于此过程非常自我调节,因此几乎不需要从这些指令的默认值修改这些指令。可以同时提供服务的最大 Client 端数量(即,所有进程中的最大线程总数)由MaxRequestWorkers指令确定。活动子进程的最大数量由MaxRequestWorkers指令除以ThreadsPerChild指令确定。

有两个指令对活动的子进程数和子进程中的服务器线程数设置了硬性限制,并且只能通过完全停止服务器然后再次启动服务器来更改。 ServerLimit是活动子进程数的硬限制,并且必须大于或等于MaxRequestWorkers指令除以ThreadsPerChild指令。 ThreadLimit是服务器线程数的硬限制,并且必须大于或等于ThreadsPerChild指令。

除了活动的子进程集之外,可能还有其他子进程正在终止,但是其中至少有一个服务器线程仍在处理现有的 Client 端连接。尽管可以预期实际数目要小得多,但最多可以存在MaxRequestWorkers个终止过程。可以通过禁用单个子进程的终止来避免此行为,这可以通过以下方式实现:

worker MPM 中进程线程控件的典型配置如下所示:

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

为了绑定到端口 80,父进程通常在 Unix 下以root开头,而子进程和线程则由服务器以特权较少的用户身份启动。 UserGroup伪指令用于设置 Apache HTTP Server 子进程的特权。子进程必须能够读取将要提供的所有内容,但应具有尽可能少的特权。另外,除非使用suexec,否则这些指令还将设置 CGI 脚本将继承的特权。

MaxConnectionsPerChild通过杀死旧进程并启动新进程来控制服务器回收进程的频率。

当遇到雷电群问题时(通常,当有多个侦听套接字时),此 MPM 使用mpm-accept互斥锁来序列化对传入连接的访问。可以使用Mutex指令配置此互斥锁的实现方面。 performance hints文档包含有关此互斥锁的其他信息。