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 ...
随机推荐
- Android中RelativeLayout属性详细说明
android:layout_above="@id/xxx" --将控件置于给定ID控件之上android:layout_below="@id/xxx" - ...
- HoloLens开发手记 - Unity之Persistence 场景保持
Persistence 场景保持是HoloLens全息体验的一个关键特性,当用户离开原场景中时,原场景中全息对象会保持在特定位置,当用户回到原场景时,能够准确还原原场景的全息内容.WorldAncho ...
- 我给出的一份Java服务器端面试题-适合电话面试
这部分内容,参考了<面试官的七种武器>一文. 电面与face2face的面试还是有区别的,很多考察方式无法使用. 从简历聊起,逐渐进入正题. Java语法 重载与重写的区别? java如何 ...
- java内存优化牛刀小试
小猿做了两年的c++,上个月竟然被调到java项目,于是第一篇随笔就想八一八java的内存优化. 首先优化这种事,肯定是应该放到最后去做的,不过在写代码的过程中养成良好的习惯也是很重要的.在这里先推荐 ...
- blur效果,模糊效果css
.blur { -webkit-filter: blur(5px); -moz-filter: blur(5px); -o-filter: blur(5px); -ms-filter: b ...
- redis学习笔记——(2)
4.Redis中的string类型 String类型是最简单的类型,一个Key对应一个Value,String类型是二进制安全的.Redis的String可以包含任何数据,比如jpg图片或者序列化的对 ...
- javascript继承(五)—prototype最优两种继承(空函数和循环拷贝)
一.利用空函数实现继承 参考了文章javascript继承—prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权 ...
- 阿里百川IMSDK--自定义群聊界面
// 获取群对象 YWTribe *tribe = [self.tribesArray objectAtIndex:indexPath.row]; // 发起群聊 UIViewController * ...
- js常用插件
1.jQuery Shortcuts 是个超轻量级的方法,使用 jQuery 来绑定快捷键(热键). 2.Underscore封装了常用的JavaScript对象操作方法,用于提高开发效率. 3.Kn ...
- Myeclipse快捷键的使用
存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取消注释 Ctrl+\(Eclipse3已经都合并到Ctrl+/了) 代码辅助 Alt+/ 快速修复 Ctrl+1 代码格式化 Ctrl+Shi ...