博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache prefork性能调优
阅读量:6278 次
发布时间:2019-06-22

本文共 1824 字,大约阅读时间需要 6 分钟。

原文出自: ,总结的非常好,借此以用。谢谢~

Apache的配置是针对原先较低的服务器来配置的,原先的配置显然已经不适合了,所以今天开始研究下Apache配置的问题。

1. 首先要了解Apache采用的MPM(Multi -Processing Modules,多道处理模块)

MPM是Apache的核心,它的作用是管理网络连接、调度请求。

Apache2.0中MPM分为3种(perfork、worker、event)。perfork从Apache1.3中继承下来的,它采用的是进程管理方式,所以它可以提供更可靠的性能和更好的兼容性;worker是Apache2.0中新增加的方式,它采用了线程控制方法,可以比perfork更节约系统开销、处理更多的数据量,但同时兼容性并不是很好,很多旧的程序无法工作在worker下;event仍处于试验阶段,它为每个任务分配不同的进程池,目前不应该采用。

通过命令 httpd -l 可以获取目前Apache采用的是哪种MPM

本文仅针对perfork方式进行讨论

2. 了解perfork的工作方式

查看Apache2.0的配置文件httpd.conf,可以看到perfork的配置段,大致如下:

ServerLimit       256   //相当于MaxClients

StartServers       5   //apache启动时启动的进程数

MinSpareServers   10    // 最小空闲进程数

MaxSpareServers   15    //最大空闲进程数

MaxClients       256  //最大连接的客户端

MaxRequestsPerChild  4000  //每个进程最大处理了多少个请求后自动销毁

当Apache被启动时,Apache会自动创建StartServers个进程,并且尽力将空闲进程数保持在MinSpareServers和MaxSpareServers之间。

如果空闲进程小于MinSpareServers,Apache将会以大约每秒1个的速度新建进程。

如果空闲进程小于MaxSpareServers,Apache将会删除多余的空闲进程,释放服务器资源。

进程数的最大值由MaxClients控制,在Apache1.3中最大只能设置为256,但在Apache2.0中,可以通过在配置开头增加ServerLimit项目来突破256的限制,此时必须 MaxClients ≤ ServerLimit ≤ 20000

MaxRequestsPerChild用来控制每个进程在处理了多少次请求之后自动销毁,这个参数可以设置为0表示无限(即不销毁进程)。

3. 优化perfork

首先,对于一个负载相对较高的网站来说,256的进程限制是不够的,如果服务器已经达到256的极限,那么接下去的访问就需要排队,这也就是为什么某些服务器负载不高,但是访问却很慢的原因之一。所以首先应该了解服务器在繁忙时的进程数量。

通过命令ps -ef|grep httpd|wc -l可以了解到当前系统中Apache进程数,通过设置ServerLimit和MaxClients来达到为服务器软扩容的目的。

然后,在访问量高峰期,经常会出现的情况是突然之间发生非常多的并发连接,然后突然之间减少了很多访问。如果Apache没有准备足够数量的预备进程,那访问只能等待Apache每秒1个的新增进程,随后又要将多余的进程删除,那Apache只能一直忙于新建和销毁进程,大大地降低了访问速度。可以适当增加StartServers、MinSpareServers、MaxSpareServers来使得Apache不需要一直忙于作无用功。

最后,强烈推荐MaxRequestsPerChild不要设置为0,设置为非0,可以保护Apache进程免遭内存泄漏的影响,因为你不知道运行在Apache上的应用程式在什么时候会出错导致内存泄漏。

设置完之后大致是这样的:

ServerLimit       1000

StartServers       30

MinSpareServers   30

MaxSpareServers   45

MaxClients       1000

MaxRequestsPerChild  4000

本文转自屌丝逆袭博客51CTO博客,原文链接http://blog.51cto.com/5731674/1674945如需转载请自行联系原作者

_追随我心

你可能感兴趣的文章
gridlaylout 简单布局
查看>>
WPF RadioButton 转换
查看>>
为什么使用 Bootstrap?
查看>>
在什么情况下使用struct,struct与class的区别
查看>>
STL源代码剖析(一) - 内存分配
查看>>
数据库update死锁
查看>>
http中使用json封装数据的性能测试
查看>>
开发ffmpeg/live555常见问题错误及解决方法
查看>>
appium跑demo简单实例讲解
查看>>
你能识别这些科技公司的真假logo吗?
查看>>
glibc的了解,对内核的封装
查看>>
Shell中的${},##和%%的使用
查看>>
Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入...
查看>>
提高夜晚学习效率的建议
查看>>
跨域代码 手机号码
查看>>
android studio安装须知
查看>>
SVG六基本元素
查看>>
定制Eclipse IDE之插件篇(二)
查看>>
引用 LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意义及区别
查看>>
Codeforces 527C Glass Carving(Set)
查看>>