• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • mpm_worker


    描述:实现混合多线程多进程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

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

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

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

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

    mpm-accept当遇到雷电群问题时(通常,当有多个侦听套接字时),此MPM使用互斥锁来序列化对传入连接的访问。可以使用Mutex伪指令配置此互斥锁的实现方面。在性能提示文档有关于这个互斥的附加信息。

    上篇:mpm_winnt

    下篇:mod_access_compat