减少 Apache 内存使用量和平均进程大小值

减少 Apache 内存使用量和平均进程大小值

我知道这个问题有点长,但我选择描述从我的角度观察到的每一个方面。

我使用的是 Linux 服务器,使用的操作系统是 Ubuntu 14.04,其余所有配置定义如下。此 Web 服务器用于服务用 PHP 构建的应用程序,数据库托管在 RDS 上。在高峰时段,服务器上平均有近 200 个并发请求,最终导致内存利用率达到 100%。由于这个原因,应用程序变得非常慢,有时甚至会返回错误。因此,我按照下面列出的一些步骤来解决这个问题,并尝试调整 Apache 并限制它以应对奇怪情况。

操作系统

名称=“Ubuntu”版本=“14.04.5 LTS”

服务器配置

CPU:8 核
RAM:15 GB
硬件提供商:AWS
实例类型:c4.2xlarge

Apache.Conf 参数(2.4)

超时 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
HostnameLookups Off
LogLevel warn
AllowOverride all(针对应用程序的文档根目录)

使用的 MPM: prefork

MPM_PREFORK配置文件

启动服务器 5
最小备用服务器 5
最大备用服务器 10
最大请求工作线程 256
每个子节点的最大连接数 200

已启用模组

access_compat.load autoindex.load mime.load setenvif.load alias.conf deflate.conf mpm_prefork.conf socache_shmcb.load alias.load deflate.load mpm_prefork.load ssl.conf authn_core.load dir.conf negotiation.conf ssl.load authn_file.load dir.load negotiation.load status.conf authz_core.load env.load php5.conf status.load authz_host.load filter.load php5.load authz_user.load headers.load rewrite.load autoindex.conf mime.conf setenvif.conf

Apache 进程平均大小

使用的命令:

sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}' <br/>

Apache 内存使用量(MB):7227.66
平均进程大小(MB):314.246

MaxRequestWorkers 的计算

X = 我想要分配给 Apache 的专用 RAM(13GB):13312 MB
Y = 我在过去 15 天内监控的服务器平均进程大小:314.246
MaxRequestWorkers = X/Y = 大约 40

使用的 MPM: prefork

修改了 MPM_PREFORK.CONF

启动服务器数 5
最小备用服务器数 5
最大备用服务器数 10
最大请求工作线程数 40
每个子节点的最大连接数 8

现在,当 apache 启动时,它将启动 5 个 startservers 进程,每个 startserver 进程将启动 8 个子连接,因此总共可以与服务器建立 40 个并发连接。MaxRequestWorkers 限制为 40,不会超过 40 个并发请求,这将防止发生 DOS、DDOS 或通过占用 13GB 的最大 RAM 来保护服务器免于停机,为服务器留下 2GB 的可用 RAM。
我也不清楚 MaxConnectionsPerChild 参数,如果我使用错误,请纠正我。

PHP.INI 参数(php5)

OLD
output_buffering = 4096
max_execution_time = 60
memory_limit = -1
log_errors = On


output_buffering = 4096
max_execution_time = 60
memory_limit = 64M
log_errors = On

我仍然面临的问题

更改 mpm_prefork_conf 后,内存利用率下降,但由于 MaxRequestWorkers 参数,服务器向许多客户端返回 503 错误。我试图弄清楚为什么我的每个 apache 进程都使用了 315MB 的 RAM,我在 Google 上搜索了大约 2 天,但找不到进一步排除故障的正确方法。所以最后我在这里发布了这个。我现在有两个选择。

  1. 优化apache平均进程限制,增加MaxRequestWorkers限制。

  2. 增加 RAM 并以相同的平均进程大小为客户端提供服务,我认为这不是一个正确的选择。

请为我提供正确的建议,如何识别和减少 Apache 和 php 的平均进程大小。请只提供真实的答案。

答案1

我认为你不可能得到比这更好的结果,我会选择使用 php-fpm,这样非动态内容加载会更快,内存消耗更少,我发现了这一点指南(digitalocean.com),这给出了很好的建议。你可以检查一下在 apache 中更改 keepalive 时间,参见这里

答案2

每个 Apache 进程占用的内存相当多。Ubuntu 14.0.4 于 2019 年停产。

您发布的配置中最令人吃惊的是:

KeepAliveTimeout 5

将其更改为 1。您会发现至少有一半的活动进程当前没有执行任何操作,正在等待保持活动超时。

开始分析您的流量 - 确保所有静态内容都是可缓存的。

检查你的 apache 配置 - 确保你没有加载未使用的模块。

确保您已为 PHP 设置了默认 timeone,并且您的脚本未禁用错误报告。检查您的错误日志并清除错误。尝试调整 Apache 中的 listenBacklog。

每个子节点的最大连接数 8

为什么?这是非常低。Apache 通常非常稳定。您应该能够将其提高到 100,以减少 Apache 需要分叉的次数,从而提高容量。如果更改此值会影响应用程序错误率,请检查您是否没有错误编码的持久数据库连接。如果它影响内存使用,请确保您的补丁是最新的。

相关内容