其他分享
首页 > 其他分享> > 如何查看当前apache的工作模式prefork worker还是event模式?

如何查看当前apache的工作模式prefork worker还是event模式?

作者:互联网

查看apache工作模式 $ apachectl -V (注:apachectl可理解为apache control,其实是一段bash脚本)

Server version: Apache/2.4.18 (Ubuntu)
Server built:   2018-06-07T19:43:03
Server's Module Magic Number: 20120211:52
Server loaded:  APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
...

Server MPM 即为当前apache的工作模式(MPM:Multi-Processing Module,多路处理模块)

各工作模式的区别

  1. prefork 中没有线程的概念,是多进程模型,一个进程处理一个连接;稳定;响应快。其缺点是在连接数比较大时就非常消耗内存。
  2. worker 是多进程多线程模型,一个进程有多个线程,每个线程处理一个连接。与prefork相比,worker模式更节省系统的内存资源。不过,需要注意worker模式下的Apache与php等程序模块的兼容性。
  3. event 是worker模式的变种,它把服务进程从连接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的并发负载。

prefork和worker模式的比较prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。

prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。

但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉".由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。

总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。

prefork模式(apache默认)及worker模式 配置参数

# 配置路径 /etc/apache2/mods-available/mpm_prefork.conf
# 默认配置如下
<IfModule mpm_prefork_module>
#ServerLimit 256
StartServers          5 #推荐设置:小=默认 中=20~50 大=50~100
MinSpareServers       5 #推荐设置:与StartServers保持一致
MaxSpareServers      10 #推荐设置:小=20 中=30~80 大=80~120
MaxClients          150 #推荐设置:小=500 中=500~1500 大型=1500~3000
MaxRequestsPerChild   0 #推荐设置:小=10000 中或大=10000~500000
</IfModule>

# ServerLimit:  服务器最大进程限制数(Apache默认256),该数值应大于等于MaxRequestWorkers,否则MaxRequestWorkers无法设置
# StartServers:  默认开始的服务器进程数
# MinSpareServers:  最小的空闲进程数
# MaxSpareServers:  最大的空闲进程数
# MaxRequestWorkers:  最大数量的服务器进程数,2.3.13之前叫MaxClients ,最重要的一个参数
# MaxConnectionsPerChild:  最大连接数的一个服务器进程服务

worker模式

Worker MPM支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。

<IfModule mpm_worker_module>
StartServers          2 #推荐设置:小=默认 中=3~5 大=5~10
MaxClients          150 #推荐设置:小=500 中=500~1500 大型=1500~3000
MinSpareThreads      25 #推荐设置:小=默认 中=50~100 大=100~200
MaxSpareThreads      75 #推荐设置:小=默认 中=80~160 大=200~400
ThreadsPerChild      25 #推荐设置:小=默认 中=50~100 大型=100~200
MaxRequestsPerChild   0 #推荐设置:小=10000 中或大=10000~50000
(此外,如果MaxClients/ThreadsPerChild大于16,还需额外设置ServerLimit参数,ServerLimit必须大于等于 MaxClients/ThreadsPerChild 的值。)
</IfModule>
  StartServers       3        //apache已启动马上创建3个httpd进程(ps aux可以看到)
  MaxClients       2000       //同一时间最大接受2000个请求(其实就是2000个线程)
  ServerLimit       25     //apache最大能启动25个进程。
  MinSpareThreads    50     //apache至少要有50个空闲线程,用来等待接下来的请求,不满则由进程创建线程
  MaxSpareThreads     200   //apache最多能有200个线程,超出了200个线程,则杀死多余的线程
  ThreadLimit        200   //限制一个进程最多只能创建200个线程
  ThreadsPerChild     100   //设定一个进程固定创建100个线程
  MaxRequestsPerChild  10000   //设定当一个进程一共接受过10000此请求之后被杀死。以释放内存。

将apache设为worker模式是需要在编译apache时配置参数

监控当前apache线程总数: watch -n 1 -d "pgrep apache|wc -l"

计算当前apahce平均内存占用大小 ps aux|grep -v grep|awk '/apache2/{sum+=$6;n++};END{print sum/n}'(注意:可通过调整$6,$4,$3查看内存\CPU使用百分比,或修改输出公式为num,查看总量)

自带测试工具 ab -n 1000 -c 10 127.0.0.1/index.php

标签:MPM,worker,模式,prefork,apache,线程,默认,进程
来源: https://blog.csdn.net/u010655087/article/details/115729801