二、Apache MPM三种工作模式
二、Apache有三种工作模式分别是 prefork、work、even
Apache prefork模型
2、prefork的工作方式
Prefork 工作原理:控制进程Master首先会生成“StartServers”个进程,“StartServers”可以在Apache主配置文件里配置,然后为了满足“MinSpareServers”设置的最小空闲进程个数,会建立一个空闲进程,等待一秒钟,继续创建两个空闲进程,再等待一秒钟,继续创建四个空闲进程,以此类推,会不断的递归增长创建进程,最大同时创建32个空闲进程,直到满足“MinSpareServers”设置的空闲进程个数为止。Apache的预派生模式不必在请求到来的时候创建进程,这样会减小系统开销以增加性能,不过Prefork 是基于多进程的模式工作的,每个进程都会占用内存,这样资源消耗也较高。
3、apache prefork文档说明
一个单独的控制进程(主httpd进程)负责产生用于监听和处理连接的子进程,并控制这些子进程的存活周期。httpd主进程总是尝试保留一些备用或空闲的服务进程,以便能够随时处理新流入的请求。这种方式下,客户端在得到服务前就不用等待httpd fork一个新的子进程。
指令StartServers, MinSpareServers, MaxSpareServers和MaxRequestWorkers调节了父进程如何创建服务子进程。通常情况下,主httpd进程有很好的自我调节能力,绝大多数站点没有必要去调整这些指令的默认值。对于要处理大于256个并发请求的站点来说,可能需要增大MaxRequestWorkers指令的值,但如果没有足够的内存,应该减小MaxRequestWorker指令的值以保证不使用swap分区而降低整体的性能。
在Unix系统中,父进程通常以root身份运行以便绑定特权80端口,而主httpd的子进程通常以一个低特权的用户运行。User和Group指令可以设置子进程的身份权限。运行子进程的用户必须要对它所服务的内容有读权限,但对服务内容之外的其他资源应该尽可能少地拥有权限。
MaxConnectionsPerChild指令用于控制杀死旧子进程和生成新子进程的频率。
-
MaxSpareServers 默认为10。 该指令设置期望的最大空闲子进程数。空闲子进程指的是当前没有在处理任何请求。如果空闲子进程数比该指令指定的数量还多,则父进程会杀掉多余的子进程。 只有在非常繁忙的站点上才有必要调整该指令的值。强烈建议不要将该指令的值设置交大。如果尝试设置该值小于或等于MinSpareServer的值,主httpd进程将自动调整该指令的值为MinSpareServers+1。
-
MinSpareServers 默认值为5。 该指令设置期望的最小空闲子进程数。空闲子进程指的是当前没有在处理任何请求。如果空闲子进程数少于该指令指定的值,则父进程会新创建子进程补足缺少的空闲子进程。此时创建空闲子进程的方式:派生一个子进程,等一秒,派生两个子进程,等一秒,派生4个子进程,依次下去最多到每秒32个子进程,并强制停止派生。 只有在非常繁忙的站点上才有必要调整该指令的值。强烈建议不要将该指令的值设置较大。
Apache worker模型
2、worker的工作方式
Worker MPM是Apche 2.0版本中全新的支持多进程多线程混合模型的MPM,由于使用线程来处理HTTP请求,所以效率非常高,而对系统的开销也相对较低,Worker MPM也是基于多进程的,但是每个进程会生成多个线程,由线程来处理请求,这样可以保证多线程可以获得进程的稳定性;
Worker MPM工作原理: 控制进程Master在最初会建立“StartServers”个进程,然后每个进程会创建“ThreadPerChild”个线程,多线程共享该进程内的资源,同时每个线程独立的处理HTTP请求,为了不在请求到来的时候创建线程,Worker MPM也可以设置最大最小空闲线程,Worker MPM模式下同时处理的请求=ThreadPerChild*进程数,也就是MaxClients,如果服务负载较高,当前进程数不满足需求,Master控制进程会fork新的进程,最大进程数不能超过ServerLimit数,如果需要,可以调整这些对应的参数,比如,如果要调整StartServers的数量,则也要调整 ServerLimit的值。
3、apache worker文档说明
一个单独的控制进程(父进程)负责产生子进程。每个子进程创建固定数量的服务线程,数量由ThreadsPerChild指令设置,同时还会额外创建一个监听线程,负责监听请求并在它们到达的时候将它们交给服务线程来处理。(即N个服务线程+1个监听线程。)
apache http服务总是尝试保留一些备用或空闲的服务线程池,以便可以随时处理流入的请求。这种情况下,客户端在它们的请求被处理前无需等待产生新线程。初始化时产生的进程数由指令StartServers指定。在操作期间,父进程会评估所有子进程中所有空闲线程的总数,还会新建或杀死子进程使得空闲进程总数在MinSpareThreads和MaxSpareThreads指定的边界值内。由于进程的自我调节能力很好,很少需要修改该指令的默认值。能处理的最大客户端并发数(如所有进程中的所有线程数)由MaxRequestWorkers指令决定。激活的最大子进程数计算方式为:MaxRequestWorkers/ThreadsPerChild。
有两个指令可以硬限制激活的子进程数和每个子进程中的服务线程数,硬限制的数量只能通过完全关闭http server再启动它来改变。ServerLimit指令硬限制激活的子进程数,它必须大于或等于MaxRequesetWorkers/ThreadsPerChild。ThreadLimit指令硬限制每个子进程中的服务线程数,必须大于或等于ThreadsPerChild的值。
除了激活的子进程之外,可能还有其他的正在被中断的子进程,这种子进程中可能还至少有一个服务线程正在处理请求。所以,可能在线程总数达到了MaxRequestWorkers的数量时,仍存在正被中断的子进程。可以通过下面的方式禁止某个单独的子进程终止行为:
-
设置MaxConnectionsPerChild值为0。
-
设置MaxSpareThreads的值等于MaxRequestWorkers的值。
一个典型的worker MPM进程-线程的配置大致如下:
ServerLimit 16
StartServers 2
MaxRequestWorkers 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
在Unix系统中,父进程通常以root身份运行以便绑定特权80端口,而主httpd的子进程通常以一个低特权的用户运行。User和Group指令可以设置子进程的身份权限。运行子进程的用户必须要对它所服务的内容有读权限,但对服务内容之外的其他资源应该尽可能少地拥有权限。此外,除非使用了suexec,否则这两个指令设置的权限也会被CGI脚本继承。
MaxConnectionsPerChild指令用于控制杀死旧子进程和生成新子进程的频率。
Apache event模型
2、event工作方式
event工作模式是基于进程、线程混合的worker模式的。一个单独的控制进程(父进程)负责生成子进程,每个子进程创建由固定数量的服务线程,服务线程数由ThreadsPerChild指令设置,同时还创建一个监听线程,负责监听请求并在它们到达的时候将它们交给服务线程来处理。(即N个服务线程+1个监听线程。)
运行时的配置指令和worker模式的指令完全相同,除了AsyncRequestWorkerFactor指令。
它和 worker模式很像,最大的区别在于,它解决了 keep-alive 场景下 ,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂在那里等待,中间几乎没有请求过来,一直等到超时)。 event MPM中,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻塞。 event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。