二、Apache MPM三种工作模式

摘要:
3、apacheworker文档说明一个单独的控制进程(父进程)负责产生子进程。

一、Apache即现阶段比较流行的Web服务,是一个多模块化的Web服务,使用简单,速度快,稳定性好,可以做负载均衡及代理服务器来使用。

二、Apache有三种工作模式分别是 prefork、work、even

Apache prefork模型

1、prefork介绍

二、Apache MPM三种工作模式第1张

prefork模型,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024,每个子进程有一个独立的线程来处理客户的请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的一种模式,适用于访问量不是很大的场景。有点:稳定 ;缺点:慢、占用资源,1024个进程不适用于高并发场景。

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指令用于控制杀死旧子进程和生成新子进程的频率。

  1. MaxSpareServers默认为10。该指令设置期望的最大空闲子进程数。空闲子进程指的是当前没有在处理任何请求。如果空闲子进程数比该指令指定的数量还多,则父进程会杀掉多余的子进程。只有在非常繁忙的站点上才有必要调整该指令的值。强烈建议不要将该指令的值设置交大。如果尝试设置该值小于或等于MinSpareServer的值,主httpd进程将自动调整该指令的值为MinSpareServers+1。

  2. MinSpareServers默认值为5。该指令设置期望的最小空闲子进程数。空闲子进程指的是当前没有在处理任何请求。如果空闲子进程数少于该指令指定的值,则父进程会新创建子进程补足缺少的空闲子进程。此时创建空闲子进程的方式:派生一个子进程,等一秒,派生两个子进程,等一秒,派生4个子进程,依次下去最多到每秒32个子进程,并强制停止派生。只有在非常繁忙的站点上才有必要调整该指令的值。强烈建议不要将该指令的值设置较大。

Apache worker模型

1、worker介绍

二、Apache MPM三种工作模式第2张

一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程来处理请求,当线程不够使用时会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于使用了线程处理请求,因此可以承受更高的并发。有点:相比prefork 占用的内存较少,可以同时处理更多的请求;缺点:使用keepalive的长连接方式,某个线程会一直被占用。如果过多的线程,被这样占用,也会导致在高并发场景下无服务线程可用。(prefork也有同样的问题)

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模型

1、event介绍

二、Apache MPM三种工作模式第3张

event模式是apache中最新的模式,2012年发布的apache2.4.x系列正式支持event模型,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keepalive场景下,长期被占用的线程的资源浪费问题(某些线程因为keepalive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keepalive类型的线程,当有真是请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。优点:单线程响应多请求,占用更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放;缺点:没有线程安全控制。

2、event工作方式

event工作模式是基于进程、线程混合的worker模式的。一个单独的控制进程(父进程)负责生成子进程,每个子进程创建由固定数量的服务线程,服务线程数由ThreadsPerChild指令设置,同时还创建一个监听线程,负责监听请求并在它们到达的时候将它们交给服务线程来处理。(即N个服务线程+1个监听线程。)

运行时的配置指令和worker模式的指令完全相同,除了AsyncRequestWorkerFactor指令。

它和 worker模式很像,最大的区别在于,它解决了 keep-alive 场景下 ,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂在那里等待,中间几乎没有请求过来,一直等到超时)。event MPM中,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻塞。event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。

这种MPM尝试修复http中的"长连接问题"。当客户端完成了第一次请求后,可以继续保持它的连接不被关闭,以便之后可以使用相同的套接字发送其他的请求,而且这样可以节省多次创建TCP连接带来的大量消耗。但是,传统的apache httpd会保留那个负责处理请求的子进程或线程来等待客户端随后可能发送的请求,这不免带来了它自身的缺陷:资源浪费且"占着茅坑不拉屎"。为了解决这种问题,event MPM在每个子进程中使用一个专门的监听线程,不仅负责监听套接字,还负责处理所有处于长连接状态的套接字,这些套接字都是已经被所有handler和协议过滤器(通过过滤器,可以修改请求、待响应内容)处理完毕后的套接字,它们只剩下一件事没完成:发送数据给客户端。

免责声明:文章转载自《二、Apache MPM三种工作模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FusionCharts简单教程(一)---建立第一个FusionCharts图形小梵同学前进!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#基础系列——多线程 信号量 异步 编程 Task Thread async和await

 多线程: ThreadStart 是一个委托函数 static void Main(string[] args) { Thread oGetArgThread = new Thread(new ThreadStart(() => {...

多线程实现数据库的并发操作

在Java中,程序需要操作数据库,操作数据首要事就是要获得数据库的Connection对象,利用多线程对数据导入数据库中将会加快操作进度,但是多个线程共享Connection对象,是不安全的,因为可以利用Java中的ThreadLocal为每个线程保存一个Connection对象,代码如下: package com.quar.innovation.db;...

深入理解NIO(二)—— Tomcat中对NIO的应用

深入理解NIO(二)—— Tomcat中对NIO的应用 老哥行行好,转载和我说一声好吗,我不介意转载的,但是请把原文链接贴大点好吗 Tomcat大致架构 先贴两张图大致看一眼Tomcat的架构 Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container; Ser...

Java中各种集合(字符串类)的线程安全性!!!

Java中各种集合(字符串类)的线程安全性!!! 一、概念: 线程安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染的情况。 线程不安全:就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数...

Apache conf文件配置个人总结

  其实说到conf文件的配置,网上那必定是大堆大堆的,故今儿写着篇小博文,也只是做个总结,至于分享的价值吗,如果对屏幕前的你有用,我也很乐意啦。   首先,我们要找到Apache安装目录,我的是Apache2.2 这就是我们的Apache的安装目录。apache的所有的操作都将会基于此目录、 conf文件夹下找到httpd.conf,用一般的文本编辑器...

基础概念——C标准、C运行库和glibc

C标准:C 标准主要由两部分组成,一部分描述C的语法,另一部分描述C标准库(描述了一些C标准函数的原型,但是不提供实现)。C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义。 常见的C标准就是ANSI C;美国国家标准协会;为了提高C语言的开发效率,C标准定义了一系列常用的函数,称为C标准库函数。应用程序开发者可以包含这些...