httpd
( Apache/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
,我重新启动并再次httpd
运行:free -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_wsgi
(mod_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
运行其他建议的诊断工具MaxClients
将ps 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 AWSm1.small
实例)具有1.7 Gb
RAM。所以,因此:
关于如何最好地调整设置httpd
或如何诊断到底是什么导致了这种情况,有任何进一步的指示/建议吗?
答案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>
禁用除
authz_host_module
,log_config_module
,expires_module
,deflate_module
,setenvif_module
,mime_module
,autoindex_module
, ,negotiation_module
,dir_module
,alias_module
,之外rewrite_module
的所有 Apache 模块php5_module
删除该
mod_ssl
包,因为客户端没有使用https://
任何东西。
一旦这个新配置运行了一段时间,我会报告,看看是否可以解决问题。
这里的一些灵感来自:http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/和http://www.activoinc.com/downloads/httpd.conf-magento
答案2
恐怕选项每个孩子的最大请求数对您的情况有帮助,因为它可以在定义数量的请求后启用进程回收,因此存在内存泄漏,但不再可见。
此外:最大客户端数 = 服务器限制 * 每个子线程数
在您的情况下,如果您只需要 7 个并发用户 (MaxClients=7),则 2 个进程就完全足够了(以防万一无法最大程度地减少停机时间),因此配置可以是:
<IfModule prefork.c>
StartServers 2
MinSpareServers 2
MaxSpareServers 20
ServerLimit 2
MaxClients 8
ThreadsPerChild 4
MaxRequestsPerChild 4000
</IfModule>
我用最大客户数 8,只是为了在两个进程之间进行更平等的请求分配。
答案3
内存计算
其他答案已经解决了如何设置值的问题。为此,您需要计算系统不同元素的内存使用情况。
我想解决内存计算问题,这可以帮助很多人。
ps
仅显示进程,如果您想用作RSS
值, 这是一个很好的工具RSS
(驻留集大小)超过报告内存,由于添加整个共享内存(共享库)并重复通过所有进程。
htop
或者top
默认情况下不仅显示给定实体的所有进程,还显示所有线程要显示进程,只需按H在显示线程和不显示线程之间切换
斯梅姆
要获得更好的计算内存使用情况的工具,您可以使用smem
apt install smem
它将提供pss
更值得信赖的价值:
提供的值
- RSS(居民集大小)
- 分配给进程的 RAM 内存 包括共享内存(重复) 分配一次、由许多进程使用的共享库 RSS 报告内存使用情况
- PSS(比例设置大小)
- 将共享内存按百分比划分给所有进程
- 4 个进程使用相同的共享库,每个进程将使用共享内存的 25% 进行计算
- 与 RSS 相比,RSS 对于每个进程计算 100% 的共享内存
- USS(独特的套装尺寸)
- USS 和 PSS 是由 smem 的作者 Matt Mackall 提出的术语和概念。
一些选项
- k : 内存(以 mb 为单位)
- t:在底部显示总内存