上期我们讲到LoaRunner性能测试编译时的配置,这期我们讲LoaRunner性能测试MPM调优。
MPM调优
Apache HTTP服务器是一个设计强大并灵活的web服务器。可以在很多平台下进行功能,Apache通过模块化的设计,让其能适应各种环境。Apache 2.0 扩展MPM模块化设计到最基本的 web 服务器功能。 它提供了可以选择的多处理模块(MPM),用来绑定到网络端口上,接受请求, 以及调度子进程处理请求。
MPM:Multi-Processing Module(多通路处理模块)。MPM处理的模式有很多种:prefork MPM、worker MPM、BeOS MPMNetWare MPM、OS/2 MPM、WinNT MPM等。类UNIX常用的模块三种:prefork 、worker 、event。windows主要使用WinNT模块。
选择MPM
不同的操作系统支持的MPM模块也有所不同,那么如何选择MPM呢?一般情况下我们安装好Apache服务器后,会有一个默认选择好的MPM模块,通过以下命令可以查看所选择的MPM模块。 1)window下确定所安装的mpm模块 对于window在CMD窗口输入以下命令。 C:DocumentsandSettingsAdministrator>C:wampApache2inhttpd.exe-l Compiledinmodules: core.c mod_win32.c mpm_winnt.c http_core.c mod_so.c
2)类unix下确定所安装的mpm模块 对类unix操作系统输入以下命令。 [root@localhostbin]#./apachectl-l Compiledinmodules: core.c mod_so.c http_core.c event.c 如果需要修改所选择的MPM模块,可以使用--with-mpm=NAME选项来设置。其语法格式如下: ./configure[OPTION]...[VAR=VALUE]... ./configure--with-mpm=MPM MPM为我们需要选择的MPM模块名。
MPM模块工作原理
主要介绍常用的几种MPM模块的工作原理。常用的MPM模块一般有三种:prefork、worker、event。
1)prefork模块 prefork模块工作原理如图所示。
1.当apache启动时,apache服务器会生成一个主进程,这个主进程是由root来生成。
2.依靠主进程生成多子进程,生成的这些子进程中,每个子进程会对应生成一个线程,至于服务器能生成多少子进程是取决于startserver和serverlimt两个参数。 3.每子进程会生成一个线程,每个线程同时只能处理一个HTTP请求,即apache服务器最多可能同时处理的HTTP请求数是取决于服务器生成的子进程数。 服务器会实时监控为客户端所提交的HTTP提供空闲的子进程来处理请求,如果没有空闲的子进程,那么服务器就会生成更多的子进程来处理HTTP请求,直到达到最大的子进程数。
apache服务器会使用StartServersMinSpareServersMaxSpareServersMaxRequestWorkers四个参数来自动的调节服务器所需要生成的子进程。 MaxRequestsPerChild参数主要用于防止服务器崩溃因为如果将MaxRequestsPerChild设置成无限大时可能会导致内存不够用,最后服务器崩溃。
prefork主要的问题是不能很好的处理更多的并发业务,因为每个子进程只能生成一个线程,即每个子进程只能处理一个HTTP请求,如果需要让其处理更多的并发业务,那么就必须生成更多的子进程,这样就会消耗更多的系统资源。
2)worker模块 worker模块工作原理如图所示
1.当apache启动时,apache服务器会生成一个主进程,这个主进程是由root来生成的。
2.依靠主进程生成多子进程,至于能生成多少子进程是取决于startserver和serverlimt。
3.每子进程会生成多个线程,以及一个侦听器线程,该线程侦听连接并将连接到达时将其传递给服务器线程进行处理。至于每个进程能生成多少线程是取决于ThreadsPerChild。
4.每个线程同时只能处理一个HTTP请求。 ApacheHTTPServer始终会在维护一个备用的或空闲服务器的线程池,这样可以保证服务器随时准备处理客户端所送过来的请求,客户端也无需等待新的线程即可以处理HTTP请求。最初启动的进程数由StartServers指令来设置。在服务器运行期间,服务器会评估所有进程中空闲线程的数量,如果空闲线程数太多,服务器会尝试终止一些线程,以使空闲线程数保存在最小空闲和最大空闲数之间。这些数据在整个过程中都是自我调节的,所以我们一般不要修改原来的默认值。服务器可以支持的同时服务的最大客户端的数量由MaxRequestWorkers指令确定。
服务最大的活动子进程数量等于MaxRequestWorker的值除以ThreadsPerChild的值。但实际过程中客户端的请求可能难达到MaxRequestWorkers的值因为在整个过程中子进程可能会被终止。通常我们会设置成以下设置来来最大请求最大化。
-
MaxConnectionsPerChild的值设置为零。
-
MaxSpareThreads
的值设置为与MaxRequestWorkers的值一致。
相对于prefork来说,worker主要是提高了我们的并发能力。但是其它最大的缺点:
-
由于同一个子进程生成的线程是共享相同的内存的,所以如果有某个线程出现异常时,会导致父子进程出现异常。
-
如果某线程出现长连接等待时,其它的线程必须也是在长时间等待。
3)event模块 event模块工作原理如图所示。
event工作原理是: 1.当apache启动时,apache服务器会生成一个主进程,这个主进程是由root来生成的。
2.依靠主进程生成多子进程,至于能生成多少子进程是取决于startserver和serverlimt。
3.每子进程会生成多个线程,以及一个侦听器线程,该侦听器会侦听所在当活动的套接字以及套接字整个处理请求和数据的过程中。至于每个进程能生成多少线程是取决于ThreadsPerChild。
4.每个线程同时只能处理一个HTTP请求。 event模块会尝试去修复HTTP中的“keepaliveproblem”。
当完成第一个请求后,会将连接一直保持着,接下来会使用同一个套接字发送其它的请求。这样可以节约大量创建TCP连接的时间。但是这个有一个问题,ApacheHTTPServer会一直保留着子进程或线程来等待客户端的数据。所以会有一个专门的侦听器,来侦听所有套接字以及剩余的需要处理的数据。