apache多处理模块(MPM)

Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作。不同平台和不同的环境往往需要不同的特性,或可能以不同的方式实现相同的特性最有效率。Apache 通过模块化的设计来适应各种环境。这种设计允许网站管理员通过在 编译时或运行时,选择哪些模块将会加载在服务器中,来选择服务器特性。

它提供了可以选择的多处理模块(MPM),用来绑定到网络端口上,接受请求, 以及调度子进程处理请求。

apache提供的3种多处理模块:Prefork、Worker、Even,其中worker和even尽量在apache2.4版本以上使用。

Prefork MPM

这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器。Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。

它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。

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

Apache的httpd.conf中的配置方式

  1. <IfModule mpm_prefork_module>

  2.    StartServers             5

  3.    MinSpareServers          5

  4.    MaxSpareServers         10

  5.    MaxRequestWorkers      250

  6.    MaxConnectionsPerChild   0

  7. </IfModule>

Worker MPM

worker模式比起上一个,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。

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

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

缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,某个线程会一直被占据,也许中间几乎没有请求,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

Apache的httpd.conf中的配置方式

  1. <IfModule mpm_worker_module>

  2.    StartServers             3

  3.    MinSpareThreads         75

  4.    MaxSpareThreads        250

  5.    ThreadsPerChild         25

  6.    MaxRequestWorkers      400

  7.    MaxConnectionsPerChild   0

  8. <IfModule>

  9. 注意:在linux上启用的进程是httpd.worker,而不是httpd进程。

Event MPM

以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。 
Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的。一个以Worker MPM方式工作的繁忙服务器能够承受每秒好几万次的访问量(例如在大型新闻服务站点的高峰时),而Event MPM可以用来处理更高负载。

它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。 
event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求

需要补充的是:HTTPS的连接(SSL),它的运行模式仍然是类似worker的方式,线程会被一直占用,直到连接关闭。

注:Event MPM需要在apache2.4及以上版本才能稳定运行。

Apache的httpd.conf中的配置方式

  1. <IfModule mpm_event_module>

  2.    StartServers             3

  3.    MinSpareThreads         75

  4.    MaxSpareThreads        250

  5.    ThreadsPerChild         25

  6.    MaxRequestWorkers      400

  7.    MaxConnectionsPerChild   0

  8. </IfModule>

  9. 本期主要介绍了Apache的3种多处理模块

    下期将为大家介绍apache - rewrite

    更多实力干货

    敬请期待!

猜你喜欢

转载自blog.csdn.net/RJ0024/article/details/85328757