转:浅谈UNIX下Apache的MPM及httpd.conf配置文件中相关参数配置
为什么要并发处理
以Apache为代表的web服务器中,如果不支持并发,则在一个客户端连接的时候,如果该客户端的任务没有处理完,其他连接的客户端将会一直处于等待状态,这事不可想象的,好像没有为什么要不要这一说,是必须有的。
常用的集中并发处理模式
- 通过生成多个进程
- 不通过进程,使用线程
- 监控输入事件,在事件发生时进行切换处理,即可以使用单线程进行并发处理,这是事件驱动的处理模式
Apache的并发处理模块
Apache以模块化的方式组合了多种功能,并发处理的核心部分也是以模块化的方式来出现,通常称为MPM(Multi Processing Module)。根据选择的MDM的不公,用户可以配置不同的并发处理模式。UNIX环境下主要由两个:
- prefork:提取生成(prefork)多个进程供客户端连接的多进程模式
- worker:多线程和多进程的混合型模式
一般是在通过源码编译Apache的时候就通过configure 指令来指定了哪种模式,但是在Red Hat Enterprise Linux 和基于Red Hat的Cent OS Linux 上,同时安装了两种模式,默认使用prefork模式,想切换到worker模式的话,可以在通过/etc/sysconfig/httpd 这个文件来更改,如图:
prefork 和worker,进程和线程
prefork是多进程模式,worker是多线程和多进程的混合模式。后者占得内存更小,适合在高并发环境下使用。
多线程和多进程的差异:
- 多个进程中不存在进程间直接共享内存,内存孔氏是独立且安全的
- 在多线程中,多个线程间共享内存空间,需要注意不能发生资源冲突,这是多线程编程比较复杂的原因。
优缺点如下:
- profork:稳定性和向后兼容性较高
- worker:可扩展性更强
从性能角度来看下多进程/多线程的差异
基于以下两点原因后者更轻更快:
- 多进程使用独立的内存空间,无法共享;而多线程使用共享的内存空间,内存消耗少(其实也不是绝对的,因为写时复制技术,父子进程间也能共享一些内存)
- 因为多线程共享内存空间,所以线程切换的成本低于多进程
下面解释两个概念:写时复制和上下文切换
写时复制
写时复制和进程间的通信有点像,进程间通信原理图:
当某个进程需要内存是,像内核申请,内核返回给进程一个内存地址,这个地址不是实际的物理内存地址,而是虚拟内存,映射的是实际的物理内存地址,存再多个进程映射同一块物理内存这种可能,这就实现了进程间的通信,写时复制的示意图如下:
上下文切换
什么是上下文切换:在多任务操作系统中,一个逻辑cpu不可能真正的实时处理多个请求,必须轮着来,这就是上下文切换,可以通过sar -c命令来查询。
httpd.conf 中两个模式相关参数说明
在centos上查看httpd.conf的配置如下:
[root@localhost www]# cat /etc/httpd/conf/httpd.conf | grep -v "#"
ServerTokens OS
ServerRoot "/etc/httpd"
PidFile run/httpd.pid
Timeout 60
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256 #服务器数量,即进程数的上限,一般配置两个值相同
MaxClients 256 #这个值比较关键,能同时连接客户端数量的上限
MaxRequestsPerChild 4000 #这里设置的是,每个进程处理4000个请求,该进程处理完第4000个请求后会自动结束,通过合理配置这个参数,可以避免使用mod_perl和mod_php模块运行的应用程序引起的内存泄露。在会接收到大量请求的大型服务器中,如果这个参数配置的值太小,就就会频繁的重复进行进程的建立和结束。因为基于写时复制的内存共享,共享率会越来越低,最终会导致大部分内存将被持续挤占而不能共享,必须根据实际情况合理设置该值。
</IfModule>
##这是工作在work模式下的配置,work模式是多进程和多线程的混合型模式
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Listen 80
#以下配置省略......
profork模式
在profork模式中配置比较简单,只关注 Server和MaxClients这两个参数即可,一般配置二者相等。
如何来设定这两个值呢?
一般根据服务器的物理可用内存和每个进程平均消耗的内存来确定。物理内存可用用free等指令查看,那么怎么看每个进程占用的内存大小呢,通过ps和top命令能得到部分信息,但是从/proc文件系统可以看的更详细,一般在/proc/< pid >/status这个文件中看进程的内存使用详情。如下:
linux-qvvt:/var/log # ps -ef | grep httpd
root 2188 1 0 14:04 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DZABBIX -D SYSTEMD -DFOREGROUND -k start
wwwrun 2915 2188 0 14:04 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DZABBIX -D SYSTEMD -DFOREGROUND -k start
wwwrun 2916 2188 0 14:04 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DZABBIX -D SYSTEMD -DFOREGROUND -k start
wwwrun 2919 2188 0 14:04 ? 00:00:01 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DZABBIX -D SYSTEMD -DFOREGROUND -k start
wwwrun 2920 2188 0 14:04 ? 00:00:01 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DZABBIX -D SYSTEMD -DFOREGROUND -k start
wwwrun 2921 2188 0 14:04 ? 00:00:01 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DZABBIX -D SYSTEMD -DFOREGROUND -k start
wwwrun 3151 2188 0 14:07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DZABBIX -D SYSTEMD -DFOREGROUND -k start
root 8442 2936 0 14:52 pts/0 00:00:00 grep httpd
linux-qvvt:/var/log # more /proc/2915/status
Name: httpd2-prefork
State: S (sleeping)
Tgid: 2915
Pid: 2915
PPid: 2188
TracerPid: 0
Uid: 30 30 30 30
Gid: 8 8 8 8
FDSize: 64
Groups: 8
VmPeak: 182972 kB
VmSize: 181688 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 17840 kB #实际使用物理内存的大小
VmRSS: 16732 kB
VmData: 11064 kB
VmStk: 136 kB
VmExe: 528 kB
VmLib: 21616 kB
VmPTE: 348 kB
VmSwap: 0 kB
Threads: 1
SigQ: 0/3679
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001001000
SigCgt: 000000018c0046eb
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000001fffffffff
Seccomp: 0
Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list: 0-127
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,
00000000,00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 258
nonvoluntary_ctxt_switches: 1195
在这个例子中,实际使用了17.4M的内存,要多看几个例子,得出一个平均值值,如果内存为4GB,则留给操作系统1GB,剩余3GB,3×1024/18=1723 ,考虑到父进程和子进程间还共享了一部分内存还可以给的宽裕点。
还有一个参数如 MaxRequestsPerChild 4000 ,这里设置的是,每个进程处理4000个请求,该进程处理完第4000个请求后会自动结束,通过合理配置这个参数,可以避免使用mod_perl和mod_php模块运行的应用程序引起的内存泄露。在会接收到大量请求的大型服务器中,如果这个参数配置的值太小,就就会频繁的重复进行进程的建立和结束。因为基于写时复制的内存共享,共享率会越来越低,最终会导致大部分内存将被持续挤占而不能共享,必须根据实际情况合理设置该值。
worker模式
worker模式下多进程+多线程组合的方式。
- 生成多个进程
- 在一个进程中生成多个线程,一个客户端的请求交由一个线程进行处理
因此支持的并发数为:进程数 x 每个进程的线程数;因此进程数可以像profork模式进行优化,在优化线程数的时候考虑两个点:
- 线程共享全部内存空间,不用考虑写时复制的情况
- 每个线程最大不能超过8M 的内存做为栈空间
因此有下面几个参数:
- MaxClients : 最大连接数,即进程数*线程数
- ServerLimit : 最大进程数
- ThreadLimit: 每个进程的最大线程数
- TheadPerChild: 每个进程的最大线程数,和ThreadLimit基本相同
一般先确定 MaxClients再确定TheadPerChild后就可以确定ServerLimit了,如下面这个配置,StartServers=MaxClients / MaxSpareThreads
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
要看系统中运行了多少线程,在ps 命令上加上 -L参数就可以看了。
最后,系统超载的情况下,修改MaxClients需要了解
当业务比较繁忙的时候,在服务器应用日志中可能会报MaxClient有关的错误,并提示要求调整这个参数,有的时候这只是个表象,当一个请求过来后将输出提交给ap服务器处理,ap服务器提交数据库查询,然后这个请求一直等待输出数据库的返回结果,当数据库查询较慢或者数据库hang住的时候,该进程/线程也是会表现为阻塞的状态,长时间得不到释放,当后面同样的请求过来后,同样被阻塞,这样服务器不断生成新的线程/进程,而之前的进程/线程因为等待输出,得不到释放,最终会导致达到最大进程/进程数,导致服务器报错。
原文地址:http://blog.csdn.net/x6_9x/article/details/50098019
转:浅谈UNIX下Apache的MPM及httpd.conf配置文件中相关参数配置的更多相关文章
- 浅谈 unix, linux, ios, android 区别和联系
浅谈 unix, linux, ios, android 区别和联系 网上的答案并不是很好,便从网上整理的相对专业的问答,本人很菜,大佬勿喷 UNIX 和 Linux UNIX 操作系统(尤尼斯) ...
- 浅谈Linux下/etc/passwd文件
浅谈Linux 下/etc/passwd文件 看过了很多渗透测试的文章,发现在很多文章中都会有/etc/passwd这个文件,那么,这个文件中到底有些什么内容呢?下面我们来详细的介绍一下. 在Linu ...
- [原创]浅谈NT下Ring3无驱进入Ring0的方法
原文链接:浅谈NT下Ring3无驱进入Ring0的方法 (测试环境:Windows 2000 SP4,Windows XP SP2.Windows 2003 未测试) 在NT下无驱进入Ring0是一个 ...
- 浅谈 IE下innerHTML导致的问题
原文:浅谈 IE下innerHTML导致的问题 先来看个demo吧: <!DOCTYPE html> <html> <head> <meta charset= ...
- []转帖] 浅谈Linux下的五种I/O模型
浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html 一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...
- 浅谈Vue下的components模板
浅谈Vue下的components模板在我们越来越深入Vue时,我们会发现我们对HTML代码的工程量会越来越少,今天我们来谈谈Vue下的 components模板的 初步使用方法与 应用 我们先来简单 ...
- 浅谈Kotlin(一):简介及Android Studio中配置
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...
- Apache httpd.conf配置文件 1(Global Environment )
Apache 版本: Server version: Apache/2.2.15 总计 1000行左右 英文前带井号的是注释,不起作用. 但很多注释去掉前方的 # 即可生效. # # This i ...
- Apache 的 httpd.conf 配置文件
http.conf 是 Apache 的配置文件,Apache 的常见配置主要是通过修该文件实现的,修改之后需要 重启 Apache 服务生效. Httpd.conf #Apache 安装目录 Ser ...
随机推荐
- [No000080]右键解锁增强Chrome插件开发,破除防复制
昨天用360极速(虽然我不喜欢360.)浏览器,登陆知乎查阅一些东西,突然感觉有些观点很赞同,想copy转载一下,我了个去,它丫的居然不让我复制. 地址:https://www.zhihu.com/q ...
- Linux提权(2)-高级版
当你在攻击受害者的电脑时即使你拥有了一个shell,依然可能会有一些拒绝执行指令的限制.为了获得目标主机的完整控制权限,你需要在未授权的地方绕过权限控制.这些权限可以删除文件,浏览私人信息,或者安装并 ...
- [luogu2964][USACO09NOV][硬币的游戏A Coin Game] (博弈+动态规划)
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- LUA类
cpp_object_map = {}setmetatable(cpp_object_map, { __mode = "kv" }) local search_basesearch ...
- em(倍)与px的区别
在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使用em作为字体单位, ...
- CSS水平居中/垂直居中的N个方法
我看最近微博流行CSS居中技术,老外码农争相写相关的文章,一篇赛一篇的长啊,我把几篇归纳总结了一下,算是笔记. 孔乙己曾说:"茴香豆的回字有四种写法",万一哪天有个面试官问你:&q ...
- VS 报cmath(19): error C2061: 语法错误: 标识符“acosf” 错误
这是因为我在.c文件中用了 #include <iostream> using namespace std; 这样编译的时候就报: 出现错误类型如下:1>c:\program fil ...
- 【三石jQuery视频教程】01.图片循环展示_再次重发
之前的文章,由于在博文的底部放有微信公众号的缘故,被管理员判定为: 您好,您的这篇博文内容本身没什么问题,但是,在博文底部存在推广信息内容.... 你们也没告知到底是哪条触犯了博客园的规矩,我就把底部 ...
- 自创yum源
这里我们用U盘装完系统以后,我们要是使用yum命令的话,我们是装不上包的 这个时候我们装系统的时候 [root@kz-002 Packages]# df -h Filesystem Size Used ...
- 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...