如何查看当前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:  最大连接数的一个服务器进程服务
  • ServerLimit,取决于你系统的资源,每个apache进程默认占用20M内存,基本可以按照这个公式来计算:最大内存*80%/2M=ServerLimit
  • MaxRequestWorkers,一般apache线程数不会超过100,为什么?内存为2G的,100个线程就近2G了。
    如果网站的pv值 百万
    ServerLimit 2500 *# 用于修改apache编程参数
    MaxClients 2000 *# 最大并发数
    
    注:调到这就是极限了,要是网站访问还是大,哪就要增加apache服务器了
  • MinSpareServers,如果当前空闲子进程数少于MinSpareServers ,那么Apache将以第一秒一个,第二秒两个,第三秒四个,按指数递增个数的速度产生新的子进程。在一台压力大(并发访问2800)的服务器上,MaxSpareServers这个值设置的是200
  • MaxRequestsPerChild,指令设置每个子进程在其生存期内允许伺服的最大请求数量。完成了指定的请求数后,会自动结束。好处:可防止偶然的内存泄露。若为0,可服务无限次。另外,kepalive连接,只计一个数
  • Keep-Alive 默认:ON
  • MaxKeepAliveRequests 默认:100,到该请求数后,将关闭该keepalive
  • KeepAliveTimeout 默认:5 ,到达该时间后,将关闭keepalive
  • TimeOut 默认:300 ,

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

  • 升级 Apache 到最新版本,新版本往往包含性能提升和安全更新。
  • 在 httpd.conf 中设置 "HostNameLookups off" 能避免针对每个访问者的 DNS 域名的反向查询。
  • 对于繁忙的网站,在 httpd.conf 中设置 "MaxClients 230" 或者更高。这项设置让更多的 httpd 进程同时响应请求,并避免了处理器排队的情况发生。
  • 采用另外一台服务器处理图片文件。
  • 缺保您的 Web 页面和 CGI 页面采用了浏览器缓冲技术。具体的文章可以参考本站:采用 mod_gzip 加速 Zope 和 Apache
  • 保持您的 Apache 苗条,编译那些仅仅需要的模块,在编译之前,修改 src/Configuration 文件,在那些不需要的模块之前用 # 号注释掉。
  • 如果不需要流量日志,那么把 httpd.conf 中的 TransferLog 指向到 /dev/null/
  • 除非你确定使用 .htaccess 文件来控制一些目录的权限,否则设置 "AllowOverride None" ,这样就免去 Apache 在每个目录搜索 .htaccess 文件的劳役之苦。
  • 不要让不需要的后台进程运行。
  • 千万不要把页面或者日志文件写到网络磁盘上,例如 NFS。
  • 不要让 Apache (httpd) 运行于 inetd 模式。
  • 不要让 X Windows 运行在你的 Web 服务器上,用 Ctrl-Alt-Backspace 关闭 X 。
  • 避免使用 SSI tag。
  • 在 CGI 脚本中:     ** 文件 I/O:打开的文件数目越少越好。     ** Shell 命令:采用全路径来调用 shell 命令。     ** 如果你的网站主要以 CGI 来驱动,那么请使用 mod_perl。     ** 在你的 Web 页面目录中,不要让文件数超过 1000 个,文件越多花费在定位上的时间也越多。
  • 在 Web 服务器上的图片越少越好,保证每个图片都经由图片压缩器运行。
  • 对你的网站做压力测试,建议采用 Apache 自带的 ab 命令来测试。
  • 为了最好的性能,最好把网线拔掉,这样你的 Web 服务器就十分安全,而且负载马上降为 0。

    来源:https://wiki.absoft.cn/s/7da4789901.html
上一篇:apache配置优化 - 解决apache环境下网站访问速度慢的问题(重点参考)


下一篇:mybatis-plus 错误java.lang.NoClassDefFoundError: org