Apache prefork 模块指令分析
问题背景:
在一台只有内存的vps上安装directadmin之后经常内存耗,经过查看之后发现Apache成了罪魁祸首急速消耗内存SWAP剩余空间都是0,最终导致内核开始大下杀手,把MySQL都杀了,通过下文调整了Apache的MPM参数得到解决。
通过 apachectl -l 命令,可以查看使用了什么MPM模块!官方MPM(多处理模块)介绍
我的VPS自从上个月配置完后一直没有再优化配置了,由于之前担心VPS的内存不够用,所以在配置服务器参数时,更多考虑如何节省内存,结果内存是省下来了,运行效率却一直不高。基于此,决定开始研究服务器参数优化。
开篇:apache prefork 模块指令
什么是MPM?
既然是研究prefork模块,有必要提一提Apache的多路处理模块(MPM)的基础知识。Apache2.0拥有多个模式的多路处理模块(MPM)以处理网络端口绑定、接受请求并指派子进程来处理这些请求。MPM延续Apache的设计思想,以一个模块的形式存在与Apache中,所不同的是:任何时候,必须有且仅有一个MPM被载入到服务器中。
有哪些MPM模块可供选择?
MPM有多个,我们最常用的有:prefork、worker、mpm_winnt。前面两个用于类unix系统,后者则是专门为Windows系统设计的,其他的如BeOS、event、mpm_netware、mpmt_os2恕笔者所知有限,不再详述。
如何编译MPM?
为了指定具体使用哪一个MPM模块,我们必须在编译的时候设定选项 –with-mpm=Name,name为prefork之类的模块名;可以在编译完成后使用 httpd -l 查看具体那个MPM模块已安装。
prefork简介
Apache MPM prefork 实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。(不要看到这里就认为prefork已经过时了^_^)prefork优点在于它会独立处理每个请求的进程,这样如果其中一个请求出现问题就不会影响到其他请求。同时可以应用于不具备线程安全的第三方模块(比如php3/4/5),且在不支持线程调试的平台上易于调试,而且还具有比worker MPM更高的稳定性。
prefork的工作方式
prefork MPM使用多个子进程,但每个子进程并不包含多线程。并且每个进程在某一时刻也只处理一个请求。但在许多系统上它的速度和workerMPM一样快,只是内存的消耗要大一些。
prefork拥有一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache随后会建立一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生(Apache)。
prefork的可用指令有哪些?
StartServers, MinSpareServers, MaxSpareServers, MaxClients指令用于调节父进程如何产生子进程。MaxRequestsPerChild指令控制服务器杀死旧进程产生新进程的频率。ServerLimit 指令则用来控制服务器允许配置的进程数上限。
上面列出的都是常用的指令,也是最重要的指令。笔者会在后面意义介绍,并给出配置实例。其他可使用的指令:
- AcceptMutex 用于串行化多个子进程在(多个)网络套接字(socket)上接受请求的方法
- CoreDumpDirectory Apache使用的内核转储目录
- EnableExceptionHook 在子进程崩溃以后启用一个钩子来运行异常处理程序
- GracefulShutdownTimeout 指定优雅停止服务器的超时秒数
- Group 对请求提供服务的Apache子进程运行时的用户组
- Listen 服务器监听的IP地址和端口
- ListenBackLog 半链接(pending connection)队列的最大长度
- LockFile 接受串行锁文件的位置
- MaxMemFree 主内存分配程序在未调用free()的情况下允许持有的最大自由内存数量(KB)
- PidFile 服务器用于记录父进程(监控进程)PID的文件
- ReceiveBufferSize TCP接收缓冲区大小(字节)
- ScoreBoardFile 存储子进程协调数据(coordination data)的文件
- SendBufferSize TCP发送缓冲区大小(字节)
- User 实际服务于请求的子进程运行时的用户
StartServers
指定服务器启动时建立的子进程数量,prefork默认为5。
MinSpareServers
指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
MaxSpareServers
设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1″。
MaxClients
对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量,默认值是256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit。
MaxRequestsPerChild
每个子进程在其生命周期内允许处理的最大请求数量(注意:是指总共的请求数,而不是并发请求数!),默认为10000。到达MaxRequestsPerChild的限制后,该子进程将会结束。如果MaxRequestsPerChild为”0″,子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
ServerLimit
对于preforkMPM,这个指令设置了MaxClients最大允许配置的数值。对于workerMPM,这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。
使用这个指令时要特别当心。如果将ServerLimit设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将ServerLimit和MaxClients设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。
对于preforkMPM,只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。
小内存VPS配置
<IfModule prefork.c>
StartServers 3 #httpd启动时开启三个子进程
MinSpareServers 3 #最小空闲子进程
MaxSpareServers 6 #最大空闲子进程
ServerLimit 12 #prefork模式下与MaxClients 配合使用
MaxClients 12 #限制该值的目的是为了防止小内存下产生过多子进程导致服务器崩溃。
MaxRequestsPerChild 1000 #一旦子进程处理了1000个请求后自动结束该子进程,开启新的子进程
</IfModule>
摘自:http://www.cnphp.info/Apache-prefork-module-command-parse.html
延伸阅读:
Apache常用2种工作模式prefork和worker比较
Apache prefork 模块指令分析的更多相关文章
- Apache不重新编译,利用apxs工具给Apache添加模块,如cgi模块
想实践下Apache是如何运行cgi程序的,却发现先前编译安装Apache的时候,没有安装Apache的cgi模块. 附:CentOS6.x编译安装LAMP(2):编译安装 Apache2.2.25 ...
- Apache Kafka源码分析 – Broker Server
1. Kafka.scala 在Kafka的main入口中startup KafkaServerStartable, 而KafkaServerStartable这是对KafkaServer的封装 1: ...
- django和apache交互的wsgi分析
很多django程序员会用django进行web程序的开发,会用django的命令行命令进行程序的调试,但不会将simpleserver换成apache的配置,也有很多django程序员知道怎么用ws ...
- 架设lamp服务器后,发现未按照 Apache xsendfile模块,
今天在架设lamp服务器后,发现apache 未按照xsendfile模块,于是查找资料按照如下: 安装apache xsendfile模块yum install mod_xsendfile
- 实践中的Git常用指令分析
从工作开始,一直都在使用为知笔记(作为程序员需要知道的内容很多---不需要很深入理解,一段时不使用的东西可能就会忘记).但本周一同步不同PC端时,了解到为知会在2017/1/1开始收费! 既然收费了, ...
- 【转】Windows10下80端口被PID为4的System占用导致Apache无法启动的分析与解决方案
昨天刚更新了Windows10,总体上来说效果还是蛮不错的,然而今天在开启Apache服务器的时候却发现,Apache莫名其妙的打不开了,起初以为是权限的问题,于是使用管理员身份的控制台去调用命令ne ...
- Apache ‘mod_pagespeed’模块跨站脚本漏洞
漏洞名称: Apache ‘mod_pagespeed’模块跨站脚本漏洞 CNNVD编号: CNNVD-201310-677 发布时间: 2013-11-05 更新时间: 2013-11-05 危害等 ...
- 10个强大的Apache开源模块
1.单点登录模块 LemonLDAP LemonLdap可以很棒地实现Apache的SSO功能,并且可以处理超过 20 万的用户请求.LemonLdap支持Java, PHP, .Net, Perl, ...
- 开启Apache mod_rewrite模块(解决404 Not Found)
网站搭建完成了,进入登录界面就是访问不了. 原因大概是没有开启Apache mod_rewrite模块,或者没有配置完全. 步骤1: 启用mod_rewrite模块 在conf目录的httpd.con ...
随机推荐
- AutoLayout 约束与frame、bounds的设置
介绍 关于AutoLayout的介绍可参考: 使用解读: https://segmentfault.com/a/1190000004386278 iOS 屏幕适配,autoResizing autoL ...
- 玩转数据库之 Group by Grouping
有的时候我们要从数据库里把数据组织成树结构再展现到页面上 像下面这样 今天我们用Group 和Grouping实现它,并总结一下它俩. 先看一下概念,再用代码一点一点去理解它们,最后我会给出完整的代码 ...
- Python学习笔记:魔术方法详解
准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...
- 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计
这一章讲了MPI非阻塞通信的原理和一些函数接口,最后再用非阻塞通信方式实现Jacobi迭代,记录学习中的一些知识. (1)阻塞通信与非阻塞通信 阻塞通信调用时,整个程序只能执行通信相关的内容,而无法执 ...
- IT男的”幸福”生活"续9
世界上最容易失去的便是时间了,我们总是蓦然回首,而时间早已流去. 曾经的种种,时时刻刻在我们脑中出现,让我们感到开心,快乐,幸福等. 有时好想有一种动冲,回到过去,再感受一下心中的那份触动. 又一年过 ...
- Asp.net MVC 搭建属于自己的框架(一)
为什么要自己搭框架? 大家伙别急,让我慢慢地告诉你!大家有没有这种感觉,从一家跳槽到另一家公司,公司的框架往往是不相同的,这样你必须就得摒弃原来的,学习新的框架. 问题是你用习惯了一种框架,比如封装的 ...
- Unity3D 文字滚动跑马灯效果
需求 在日常游戏中,文字滚动效果是比较常用的.例如日常游戏顶部的新闻公告,聊天系统的文字滚动,都属于这个范围. 思路 由于使用的地方比较广泛,所以希望能够尽量独立的游戏之外,能够做到随处使用的功能.N ...
- python3 入门 (四) 类与继承
Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...
- AngularJS开发指南16:AngularJS构建大型Web应用详解
AngularJS是由Google创建的一种JS框架,使用它可以扩展应用程序中的HTML功能,从而在web应用程序中使用HTML声明动态内容.在该团队工作的软件工程师Brian Ford近日撰写了一篇 ...
- tomcat发布项目时,localhost可以访问,用ip地址不能访问,同时其他电脑也不能访问。
最近在开发项目中,遇到的一个问题是:在 tomcat中发布一个web项目,但是发布成功后,只能用http://localhost:8080/aml访问项目,不能用http://172.0.0.1:80 ...