本小节主要介绍性能测试常用的几种MPM模块的工作原理。常用的MPM模块一般有三种:prefork 、worker 、event。
1) prefork模块
prefork模块工作原理如图10-4所示。
图10-4 prefork工作原理
1、当apache启动时,apache服务器会生成一个主进程,这个主进程是由root来生成。
2、依靠主进程生成多子进程,生成的这些子进程中,每个子进程会对应生成一个线程,至于服务器能生成多少子进程是取决于startserver和serverlimt两个参数。
3、每子进程会生成一个线程,每个线程同时只能处理一个HTTP请求,即apache服务器最多可能同时处理的HTTP请求数是取决于服务器生成的子进程数。
服务器会实时监控为客户端所提交的HTTP提供空闲的子进程来处理请求,如果没有空闲的子进程,那么服务器就会生成更多的子进程来处理HTTP请求,直到达到最大的子进程数。
apache服务器会使用StartServers、 MinSpareServers、 MaxSpareServers和 MaxRequestWorkers四个参数来自动的调节服务器所需要生成的子进程。
MaxRequestsPerChild参数主要用于防止服务器崩溃,因为如果将MaxRequestsPerChild设置成无限大时可能会导致内存不够用,最后服务器崩溃。
prefork主要的问题是不能很好的处理更多的并发业务,因为每个子进程只能生成一个线程,即每个子进程只能处理一个HTTP请求,如果需要让其处理更多的并发业务,那么就必须生成更多 的子进程,这样就会消耗更多的系统资源。
2) worker模块
worker模块工作原理如图10-5所示。
图10-5 worker工作原理
worker工作原理是:
1、当apache启动时,apache服务器会生成一个主进程,这个主进程是由root来生成的。
2、依靠主进程生成多子进程,至于能生成多少子进程是取决于startserver和serverlimt。
3、每子进程会生成多个线程,以及一个侦听器线程,该线程侦听连接并将连接到达时将其传递给服务器线程进行处理。至于每个进程能生成多少线程是取决于ThreadsPerChild。
4、每个线程同时只能处理一个HTTP请求。
Apache HTTP Server始终会在维护一个备用的或空闲服务器的线程池,这样可以保证服务器随时准备处理客户端所送过来的请求,客户端也无需等待新的线程即可以处理HTTP请求。最初启动的进程数由StartServers指令来设置。在服务器运行期间,服务器会评估所有进程中空闲线程的数量,如果空闲线程数太多,服务器会尝试终止一些线程,以使空闲线程数保存在最小空闲和最大空闲数之间。这些数据在整个过程中都是自我调节的,所以我们一般不要修改原来的默认值。服务器可以支持的同时服务的最大客户端的数量由MaxRequestWorkers指令确定。服务最大的活动子进程数量等于MaxRequestWorkers 的值除以 ThreadsPerChild的值。但实际过程中客户端的请求可能先难达到MaxRequestWorkers 的值,因为在整个过程中子进程可能会被终止。通常我们会设置成以下设置来来最大请求最大化。
将MaxConnectionsPerChild的值设置为零。
将MaxSpareThreads的值设置为与 MaxRequestWorkers的值一至。
相对于prefork来说,worker主要是提高了我们的并发能力。
但是其它最大的缺点:
一:由于同一个子进程生成的线程是共享相同的内存的,所以如果有某个线程出现异常时,会导致父子进程出现异常。
二:如果某线程出现长连接等待时,其它的线程必须也是在长时间等待。
1) event模块
event模块工作原理如图10-6所示。
图10-6 event工作原理
event工作原理是:
1、.当apache启动时,apache服务器会生成一个主进程,这个主进程是由root来生成的。
2、.依靠主进程生成多子进程,至于能生成多少子进程是取决于startserver和serverlimt。
3、每子进程会生成多个线程,以及一个侦听器线程,该侦听器会侦听所在当活动的套接字以及套接字整个处理请求和数据的过程中。至于每个进程能生成多少线程是取决于ThreadsPerChild。
4、每个线程同时只能处理一个HTTP请求。
event模块会尝试去修复HTTP中的“keep alive problem”,当完成第一个请求后,会将连接一直保持着,接下来会使用同一个套接字发送其它的请求。这样可以节约大量创建TCP连接的时间。但是这个有一个问题,Apache HTTP Server会一直保留着子进程或线程来等待客户端的数据。所以会有一个专门的侦听器,来侦听所有套接字以及剩余的需要处理的数据。
本章节主要讲解了关于“性能测试之MPM模块工作原理”的内容,大家觉得有用的话记得每天来这里和小编一起学习涨薪技能哦。