博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
apache调优
阅读量:4052 次
发布时间:2019-05-25

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

转自:http://hi.baidu.com/rainchen/item/ed064215e7ea9dfd746a84d5

合理设置apache httpd的最大连接数

手头有一个网站在线人数增多,访问时很慢。初步认为是服务器资源不足了,但经反复测试,一旦连接上,不断点击同一个页面上不同的链接,都能迅速打开,这种现象就是说明apache最大连接数已经满了,新的访客只能排队等待有空闲的链接,而如果一旦连接上,在keeyalive 的存活时间内(KeepAliveTimeout,默认5秒)都不用重新打开连接,因此解决的方法就是加大apache的最大连接数。

1.在哪里设置?

服务器的为FreeBSD 6.2 ,apache 2.24,使用默认配置(FreeBSD 默认不加载),默认最大连接数是250

在/usr/local/etc/apache22/httpd.conf中加载MPM配置(去掉前面的注释):

# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf

可见的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根据httpd的工作模式分了很多块,哪一部才是当前httpd的工作模式呢?可通过执行 apachectl -l 来查看:

Compiled in modules:
              core.c
              prefork.c
              http_core.c
              mod_so.c

看到prefork 字眼,因此可见当前httpd应该是工作在prefork模式,prefork模式的默认配置是:

<IfModule mpm_prefork_module>
                StartServers                      5
                MinSpareServers                   5
                MaxSpareServers                  10
                MaxClients                      150
                MaxRequestsPerChild               0
</IfModule>

2.要加到多少?

连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU、内存、带宽等都有关系。

查看当前的连接数可以用:

ps aux | grep httpd | wc -l

或:

pgrep httpd|wc -l

计算httpd占用内存的平均数:

ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'

由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。

服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368

约8K个进程,支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快,其他的可能需要等待1、2秒才能连上,而一旦连上就会很流畅)

控制最大连接数的MaxClients ,因此可以尝试配置为:

<IfModule mpm_prefork_module>
                StartServers                      5
                MinSpareServers                   5
                MaxSpareServers                  10
                ServerLimit                    5500
                MaxClients                     5000
                MaxRequestsPerChild               100
</IfModule>

注意,MaxClients默认最大为250,若要超过这个值就要显式设置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重启httpd时会有提示。

重启httpd后,通过反复执行pgrep httpd|wc -l 来观察连接数,可以看到连接数在达到MaxClients的设值后不再增加,但此时访问网站也很流畅,那就不用贪心再设置更高的值了,不然以后如果网站访问突增不小心就会耗光服务器内存,可根据以后访问压力趋势及内存的占用变化再逐渐调整,直到找到一个最优的设置值。

(MaxRequestsPerChild不能设置为0,可能会因内存泄露导致服务器崩溃)

apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2

apache_max_process = apache_max_process_with_good_perfermance * 1.5

参考:

附:

实时检测HTTPD连接数:

watch -n 1 -d "pgrep httpd|wc -l"

转自:http://niehan.blog.techweb.com.cn/archives/220.html

调优是一个大主题,涉及面颇广。目前受条件所限,大部分人可能只能从apache本身入手调优。所以本文将主要从apache的配置方面入手来详解apache调优。希望对正在使用apache的朋友有所裨益,有什么问题欢迎交流探讨,大家共同学习共同进步!

  KeepAlive参数

  KeepAlive On

  MaxKeepAliveRequests 0

  KeepAliveTimeout 15

  使用keepalive可以在单一连接时进行多个请求。

  Keepalivetimeout 每个连接保持的时间

  MaxKeepAliveRequests这个我就不解释了,意思是最大保持的连接数,0为不限制。

  我在来形象的描述一下,KeepAlive中的连接就像是餐厅中的女服务员,我和几个哥们要了几个菜以后,她不走还站继续服务(雅间门口的服务员),等了一个小时超过了她的最大服务时间(Keepalivetimeout),于是她撤了

  这个功能是开还是不开呢?因服务器而异,就像五星级的餐厅和街边小餐馆的区别。

  选择多处理模块(Multi-Processing Module,MPM)

  这玩意主要负责管理网络连接、调度请求。理解成不同的社会制度就好,万恶的封建主义和万恶的资本主义,很难说的清谁好谁坏,所以针对不同情况选择就好。

  每次只能有一种 MPM 被应用,必须使用 –with-mpm=(worker|prefork|event) 静态编译。Apache默认安装是使用一个进程的传统模型称为 prefork。较新的线程化模型称为 worker,它使用多个进程,每个进程又有多个线程,这样就能以较低的开销获得更好的性能。最新的 event MPM 是一种实验性的模型,为不同的任务使用单独的线程池。要确定当前使用的是哪种 MPM,可执行 httpd -l。

  MPM中的MinSpareServers 和MaxSpareServers

  MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。

  只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。

  MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成“MinSpareServers+1″。

  以上说明摘自apache中文手册。根据我个人的理解这个进程就像是apache大酒店的服务小姐,MinSpareServers设置的就是小姐的基本富裕人数,服务员带着我去开房了这时候如果有其他人来也需要有人照顾的对吧?这个富裕人数就是应对这种状况的。MaxSpareServers就是最大空闲人数了,什么意思?你一个三星apache大酒店搞2万个服务员开的下去吗?很显然除非你有门路,不然是没有那么多人的,服务员住哪(硬件)都是个问题。哈哈,扯远了。所以设定这个值一定要结合自身情况,当客流量大的时候数值也适当增大。可是流量大的时候也就是个别时段,所以用crontab搞一下就好

  prefork模式中的调节

  默认配置如下

  StartServers 8

  MinSpareServers 5

  MaxSpareServers 20

  ServerLimit 256

  MaxClients 256

  MaxRequestsPerChild 4000

  几乎所有的文档都会罗列出上面的数据。StartServers的值是只要启动服务就会立即启动 8 个进程,并尽力保持 5 到 20 个空闲服务器运行。进程数的硬性限制由 MaxClients 指定。尽管一个进程能够处理许多相继的请求,Apache 还是会取消连接数超过 4,000 以后的进程,这降低了内存泄漏的风险。

  Worker模式中的调节

  默认配置如下

  StartServers 2

  MaxClients 150

  MinSpareThreads 25

  MaxSpareThreads 75

  ThreadsPerChild 25

  MaxRequestsPerChild 0

  与prefork的调节类似,不同之处只是必须确定使用多少线程和进程。要经过几次尝试和出错之后才能选好要使用的值。最重要的值是 MaxClients。目标在于允许足够多的 workder 进程或线程运行,同时又不会导致服务器进行过度的交换。如果传入的请求超出处理能力,那么至少满足此值的那些请求会得到服务,其他请求被阻塞。

  如果 MaxClients 过高,那么所有客户机都将体验到糟糕的服务,因为 Web 服务器会试图换出一个进程,以使另一个进程能够运行。而设得过低意味着可能会不必要地拒绝服务。查看高负载下运行的进程数量和所有 Apache 进程所导致的内存占用情况对设置这个值很有帮助。如果 MaxClients 的值超过256,必须将 ServerLimit 也设为同样的数值

  缓存动态内容

  

  CacheForceCompletion 100

  CacheDefaultExpire 3600

  CacheMaxExpire 86400

  CacheLastModifiedFactor 0.1

  

  CacheEnable disk /

  CacheRoot /home/wwwroot/

  CacheSize 327680

  CacheDirLength 4

  CacheDirLevels 5

  CacheGcInterval 4

  

  

  CacheEnable mem /

  MCacheSize 8192

  MCacheMaxObjectCount 10000

  MCacheMinObjectSize 1

  MCacheMaxObjectSize 51200

  

  

  参数的解释

  mod_cache.c

  CacheEnable: 启动mod_cache其后接两个参数。第一个参数指定快取的种类,应设为mem(记忆体快取)或disk(磁碟快取)之其一;第二个参数指定使用快取的URI路径,如果对整个网站(或虚拟主机)进行快取,简单指定为根目录(/)即可。

  CacheForceCompletion: 指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是60(%)。

  CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)。

  CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)。

  CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。

  mod_disk_cache.c

  CacheRoot: 指定磁碟快取所使用的目录。

  CacheSize: 指定快取使用的磁碟空间大小;以 KByte 为单位。

  CacheDirLength: 指定各目录存在于快取階层(hierarchy) 中所使用的字元数。

  CacheDirLevels: 指定快取的目录层数; CacheDirLength,acheDirLevels设定值相乘不能超过 20。

  CacheGcInterval: 指定收垃圾 (Garbage Collection) 的动作间隔时间;单位是小时。Apache2 中这个指令还沒有被实在。

  mod_mem_cache.c

  MCacheMaxObjectCount 最大缓存对象数;默认值1009。

  MCacheMaxObjectSize 缓存允许的最大文档大小;默认值10000。

  MCacheMaxStreamingBuffer 内存中允许缓冲的最大流式响应字节长度;默认值100000与MCacheMaxObjectSize中的小者。

  MCacheMinObjectSize 允许缓存的最小文档大小;默认值 0。

  MCacheRemovalAlgorithm 定义在需要时哪个文档被移出缓存的算法;默认值 LRU|GDSF。

  MCacheSize 允许使用的最大内存量;以KB为单位默认值100。

  关闭网页内容协商

  一个资源可能会有多种不同的表现形式,比如,可能会有不同语言或者媒体类型的版本甚至其组合。最常用的选择方法是提供一个索引页以供选择。但是由于浏览器可以在请求头信息中提供其首选项的表现形式,因此就有可能让服务器进行自动选择。

  除非是五星级饭店各国来宾都比较多,否则不建议开启,因为这玩意严重降低性能。

  Options -MultiViews

  关闭或者开启符号链接

  这个符号连接就是俗称的软链接,好像是windows中的快捷方式。

  通过这个链接用户很可能就进入到你不想让他们看见的位置,从安全角度上来说这是非常糟糕的。所以从安全角度上考虑那就用Options SymlinksIfOwnerMatch 。当然也许你根本不知道那个符号链接是个什么东西,那就直接Options FollowSymlinks

  控制.htaaccess文件

  关闭在全局选项中改为AllowOverride None

  这样可以省去apache找htaccess的时间,也自然就节省了资源。

  那么原来的.htaccess的如何安置呢?将其放入即可。

  关闭DNS查询

  五星级餐厅用的都少。直接关闭。

  HostNameLookups Off

  当优化工作完成后

  使用ab对负载进行测试

  ab –n 1000 –c 1000

  -n 1000 表示请求1000次

  -c 1000 表示每次1000个请求

  因为只能对某个页面进行测试,注意是单位是个。所以最后的结果可能并不一定能反应真实情况。

  或者使用 Apache Ant 和 Apache JMeter 频繁进行负载测

  结合自身情况确保关闭系统中不需要的服务

  参考文献

  Apache 中 KeepAlive 配置的合理使用

  Keepalive的开启与关闭

  在理想的网络连接状况下,系统的 Apache 进程数和内存使用可以用如下公式表达:

  HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)

  HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess

  换成中文:

  总Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求

  Apache占用内存 = 总Apache进程数 * 平均每进程占用内存数

  需要特别说明的是:

  [平均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当KeepAliveTimeout 等 0 或者 KeepAlive 关闭时,KeepAliveTimeout 不参与乘的运算从上面的公式看,如果[每秒用户请求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存] 多,但是当 [平均KeepAlive请求] 的值越大时,[Apache进程数] 和 [内存] 都是趋向于减少的。

  基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout 时,关闭 KeepAlive选项是划算的,否则就可以考虑打开。

转自:http://www.ccvita.com/299.html

服务器的优化

(MPM: Multi-Processing Modules)
apache2主要的优势就是对多处理器的支持更好,在编译时同过使用--with-mpm选项来决定apache2的工作模式。如果知道当前的apache2使用什么工作机制,可以通过httpd -l命令列出apache的所有模块,就可以知道其工作方式:

prefork

如果httpd -l列出prefork.c,则需要对下面的段进行配置:

StartServers 5 #启动apache时启动的httpd进程个数。

MinSpareServers 5 #服务器保持的最小空闲进程数。
MaxSpareServers 10 #服务器保持的最大空闲进程数。
MaxClients 150 #最大并发连接数。
MaxRequestsPerChild 1000 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。

在该工作模式下,服务器启动后起动5个httpd进程(加父进程共6个,通过ps -ax|grep httpd命令可以看到)。当有用户连接时,apache会使用一个空闲进程为该连接服务,同时父进程会fork一个子进程。直到内存中的空闲进程达到MaxSpareServers。该模式是为了兼容一些旧版本的程序。我缺省编译时的选项。

worker

如果httpd -l列出worker.c,则需要对下面的段进行配置:

StartServers 2 #启动apache时启动的httpd进程个数。

MaxClients 150 #最大并发连接数。
MinSpareThreads 25 #服务器保持的最小空闲线程数。
MaxSpareThreads 75 #服务器保持的最大空闲线程数。
ThreadsPerChild 25 #每个子进程的产生的线程数。
MaxRequestsPerChild 0 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。

该模式是由线程来监听客户的连接。当有新客户连接时,由其中的一个空闲线程接受连接。服务器在启动时启动两个进程,每个进程产生的线程数是固定的(ThreadsPerChild决定),因此启动时有50个线程。当50个线程不够用时,服务器自动fork一个进程,再产生25个线程。

perchild

如果httpd -l列出perchild.c,则需要对下面的段进行配置:

NumServers 5 #服务器启动时启动的子进程数

StartThreads 5 #每个子进程启动时启动的线程数
MinSpareThreads 5 #内存中的最小空闲线程数
MaxSpareThreads 10 #最大空闲线程数
MaxThreadsPerChild 2000 #每个线程最多被请求多少次后退出。0不受限制
MaxRequestsPerChild 10000 #每个子进程服务多少次后被重新fork。0表示不受限制。

该模式下,子进程的数量是固定的,线程数不受限制。当客户端连接到服务器时,又空闲的线程提供服务。 如果空闲线程数不够,子进程自动产生线程来为新的连接服务。该模式用于多站点服务器。

转载地址:http://batci.baihongyu.com/

你可能感兴趣的文章
详解centos6和centos7防火墙的关闭
查看>>
Redis集群与插槽分配(动态新增或删除结点)
查看>>
rediscluster报错:Node is not empty
查看>>
IDEA中Git的使用
查看>>
安装kafka_2.12-2.0.0
查看>>
OpenJDK 64-Bit Server VM warning
查看>>
Linux查看端口占用情况,并强制释放占用的端口
查看>>
hashcode详解
查看>>
String类中的equals方法总结
查看>>
==和equals的区别和联系
查看>>
centOS7永久关闭防火墙(防火墙的基本使用)
查看>>
CentOS7安装MySQL冲突和问题解决小结
查看>>
CentOS下MySQL的彻底卸载
查看>>
hive lateral view语句
查看>>
scala中的函数组合器map,foreach,flatmap,flatten,filter,zip等用法
查看>>
Spark RDD API
查看>>
spark中算子详解:aggregateByKey
查看>>
Spark自定义排序
查看>>
Spark2.x 如何实现自定义排序(利用元组,类--隐式转换Ordering,Ordered等实现)
查看>>
Spark配置参数
查看>>