Apache目前一共有三种稳定的MPM模式。它们分别是prefork/worker和event,它们同时也代表Apache的演变和发展。今天杜老师就聊下worker模式!

worker模式的工作原理

worker模式和prefork模式相比较,worker模式使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每一个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程内存空间,因此,内存的占用会减少一些,在高并发场景下会比prefork有更多可用的线程,表现会更优秀一些。另外,如果一个线程出现问题也会导致同一进程下的线程出现问题,如果是多个线程出现了问题,也只是影响Apache的一部分,而不是全部的。由于用到多进程多线程,需要考虑到线程的安全,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放。

Apache总是试图维持一个备用或空闲的服务线程池。这样,客户端无须等待新线程或者新进程的建立即可得到处理。在Unix中为了能够绑定80端口,父进程一般都是以root的身份启动,随后,Apache会以较低权限的用户建立子进程和线程。User和Group指令用于配置Apache子进程的权限。虽然子进程必须对其提供内容拥有读权限,但应该尽可能给予它较少的特权。另外,除非使用了suEXEC ,否则,这些指令配置的权限将被CGI脚本继承。

worker模式的安装方法

在编译安装Apache的过程中,加入参数–with-mpm=worker即进行编译安装。

也可以使用–enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM即可。

worker模式优缺点

优点:占据更少内存,高并发下表现优秀。

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

worker模式配置参数说明

配置 说明
StartServers 3 服务启动时初始进程数,默认是3
MinSpareThreads 75 最小空闲子进程数,默认是75
MaxSpareThreads 250 最大空闲子进程数,默认是250
ThreadsPerChild 25 每个子进程产生的线程数量,默认是25
MaxRequestWorkers 400 限定同一时间内客户端最大接入请求数量,默认是400
MaxConnectionsPerChild 0 每个子进程在其生命周期内允许最大请求数量,如果请求总数已经达到这个数值,子进程将结束,如果设置为0,子进程将永远不会结束。如该值设置为非0值,可以防止运行PHP导致的内存泄露

评论