apache服务的三种工作模式:prefork、worker和event。
prefork :一个请求由一个进程响应(稳定可靠,但是性能差)worker:一个请求由一个线程响应event:一个进程处理多个请求,基于时间驱动和状态通知
查看apache目前处于哪种工作模式
[root@localhost_02 httpd-2.4.34]# /usr/local/apapche2.4/bin/apachectl -l 在编译安装Apache的过程中,加入参数--with-mpm=prefork即可,如果不加也可以,因为Apache默认会采用prefork模式进行编译安装。也可以使用--enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM即可。
Prefork:
-
Prefork是非线程、预生成进程型MPM,会预先启动一些子进程,每个子进程一个时间只能处理一个请求,并且会根据并发请求数量动态生成更多子进程。一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。在Linux系统中,父进程通常以root身份运行以便邦定80端口,而 Apache产生的子进程通常以一个低特权的用户运行。运行子进程的用户必须要对他所服务的内容有读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。这样可以减少频繁创建和销毁进程的开销。
-
配置参数:
[root@localhost ~]# vim /usr/local/apache2/conf/extra/ httpd-mpm.conf <IfModule mpm_prefork_module> StartServices 服务器启动默认启动的子进程; MinSpareServers 最小空闲进程数量; MaxSpareServers 最大空闲进程数量; MaxClients 最高的并发量; ServerLimit 最大限制的并发量; MaxRequestsPerChild 每个子进程默认最多处理多少个请求。当达到设定值时,这个进程就会被kill掉,重新生成一个新的进程(避免内存泄露等安全性问题,运行太久怕出一些bug,可能出现假死,或者占用太多内存等);
-
优点:
稳定可靠、执行效率高,任何一个进程的崩溃不会影响其它请求。
-
缺点:
一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在大并发的时候对服务器资源消耗严重。prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。
worker:
-
工作原理:
基于线程的处理方式,一个进程生成多个线程,一个请求用一个线程响应。由于使用线程访问,多个线程共享同一个进程的资源,如果一个进程访问过某一个文件并且打开了,另一个线程访问就不用再次打开,这样也提高了效率。但是多个线程在共享同一资源时,会产生资源争用,因此要给资源加锁,若不能良好的解决锁竞争,则未必会提高效率。
Workder是线程化、多进程的MPM,每个进程可以生成多个线程,每个线程处理一个请求;worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。不需要预先启用太多的子进程,每个进程能够拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程能够建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
-
配置参数:
<IfModule mpm_worker_module> StartServers 服务器启动时建立的子进程数,默认值是"3"。 MaxClients 允许同时服务的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列,默认值是"400"。 MinSpareThreads 最小空闲线程数,默认值是"75"。 MaxSpareThreads 设置最大空闲线程数。默认值是"250"。 ThreadsPerChild 每个子进程建立的常驻的执行线程数。默认值是25 MaxRequestsPerChild 设置每个子进程在其生存期内允许处理的最大请求数量。
-
优点:
在高并发的情况下,对服务器的资源消耗相对prefork模型要小很多。
-
缺点:
必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,也许中间几乎没有请求,这时就会发生阻塞,线程被挂起,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。执行效率、稳定性都不如prefork模型。在linux上,work模型不一定比prefork模型好。
event:
-
工作原理:
以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。
这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放,这增强了在高并发场景下的请求处理。
值得注意的是,Event MPM不能在安全HTTP(HTTPS)访问下工作。
-
配置参数:
<IfModule mpm_event_module> StartServers 3 服务启动时初始的进程数,默认3 MinSpareThreads 75 最小的空闲子进程数,默认75 MaxSpareThreads 250 最大的空闲子进程数,默认250 ThreadsPerChild 25 每个子进程产生的线程数量,默认是25 MaxRequestWorkers 400 限定同一时间内客户端最大接入的请求数量,默认是400 MaxConnectionsPerChild 0 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。将该值设置为非0值,可以防止运行PHP导致的内存泄露。
-
优点:
它解决了keep-alive长连接的时候占用线程资源被浪费的问题,增强了在高并发场景下的请求处理。
-
缺点:
Event MPM不能在安全HTTP(HTTPS)访问下工作。
本文深入解析Apache服务的三种工作模式:prefork、worker和event,详细介绍各模式的工作原理、配置参数及优缺点,帮助理解Apache如何高效处理并发请求。
1003

被折叠的 条评论
为什么被折叠?



