httpd内存使用情况


13

httpdApache/2.2.29)的内存使用存在一些问题。

随着时间的流逝,httpd进程中的内存使用量会逐渐增加,直到最终达到100%。

我上次重新启动的时间httpd大约是24小时前。来自的输出free -m是:

[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655       1415        239          0        202        424
-/+ buffers/cache:        788        866
Swap:         1023          4       1019

为了证明是肯定的httpd,我重新启动httpdfree -m再次运行:

[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655        760        894          0        202        360
-/+ buffers/cache:        197       1457
Swap:         1023          4       1019

因此,重新启动Apache会将可用内存从239 Mb提升到894 Mb,这似乎是一个巨大的飞跃。

我已经经历列表当前启用的Apache模块(有相当多)和禁用/删除mod_wsgimod_perl(既不都需要这种服务器,它运行的是基于PHP的Web应用程序- Magento的,特别是)。

基于https://servercheck.in/blog/3-small-tweaks-make-apache-fly,我运行ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'并获得以下输出:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' 15.1328 MB 118.09 MB 127.449 MB 129.059 MB 117.734 MB 113.824 MB 125.062 MB 123.922 MB 119.855 MB 108.066 MB 136.23 MB 114.031 MB 113.27 MB 110.695 MB 102.113 MB 113.234 MB 186.816 MB 118.602 MB 0.835938 MB

运行其他建议的诊断工具,MaxClientsps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'返回以下内容:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB

该服务器(Amazon AWS m1.small实例)具有1.7 GbRAM。因此,因此:

关于如何最好地调整httpd设置或如何诊断到底是什么引起的任何其他指示/建议?


注意,要检查进程的内存使用情况,您需要查看该-/+ buffers/cache行;但是在这种情况下,变化是可比较的。根据apache的调整方式,它可能仅从准备好处理请求的几个过程开始。经过许多并发请求一段时间后,可能会分叉更多的进程来处理负载。空闲进程的数量也可以调整。因此,如果apache增长以使用过多的内存,则需要进行一些调整。
wurtel

我对Apache服务器的配置还可以,但是过去在Apache的性能调优方面还没有做很多工作。关于应该查看哪些指令或指南的任何建议?是否可以通过配置设置告诉Apache在一定时间后杀死分叉的进程?(似乎Apache由于某种原因默认不执行此操作。)
James Spittal 2015年

这就是我离开Apache的确切原因……尝试Nginx甚至Lighttpd。

有趣。听到了一些好消息,nginx所以也许是时候尝试一下了,但是老实说,我使用Apache已有多年了,从未遇到任何重大问题。Magento确实可以咀嚼记忆。
James Spittal

请注意,用于计算平均内存使用量的脚本包括grep httpd-process 的低内存使用量(至少对我而言)。为了解决这个问题,我建议从计算中排除该行,例如:ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
MaPePeR

Answers:


11

这是我为“解决”问题所做的工作:

  1. 设置MaxClients 7(基于(1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748

因此:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. 禁用除了所有Apache模块authz_host_modulelog_config_moduleexpires_moduledeflate_modulesetenvif_modulemime_moduleautoindex_modulenegotiation_moduledir_modulealias_modulerewrite_modulephp5_module

  2. mod_ssl由于客户端未使用https://任何软件包,请删除该软件包。

一旦此新配置运行了一段时间,我将向您报告,以查看是否可以解决该问题。

这里的一些灵感来自于:http : //www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/http://www.activoinc.com/下载/httpd.conf-magento


上面的配置无疑极大地帮助了我们。
James Spittal

1
几天后,“内存泄漏”问题httpd似乎完全消失了。
James Spittal'3

2

恐怕选项MaxRequestsPerChild在您的情况下会有所帮助,因为它可以在定义数量的请求后启用进程回收,因此存在内存泄漏,但现在不再可见。

另外:MaxClients = ServerLimit * ThreadsPerChild

在您的情况下,如果您仅需要7个并发用户(MaxClients = 7),那么两个进程就足够了(以防万一无法最大程度地减少停机时间),因此config可以是:

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

我使用MaxClients 8,只是为了使2个进程之间的请求分配更加平均。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.