1

我正在运行一个用 Python ( Flask Restless ) 编写的数据库的 API,并根据Flask 文档使用 apache2 和 mod_wsgi 提供服务。

该应用程序托管在 Auto-scaling 组内的 AWS EC2 实例上。我们目前托管在 m3.medium 实例上,这些实例具有:

  • 1 个虚拟 CPU
  • 3.75 Gb 内存

我们经常遇到的问题是内存错误。Apache 用完实例中的所有可用内存并导致[critical memory allocation]失败。apache 的这个问题有据可查。

文档和其他 SO 问题解释说,我可以通过查找 apache 进程的平均大小然后限制MaxRequestWorkers(又名MaxClients)来防止过多的内存使用,以确保我不能启动比可用内存更多的工作人员,但是大多数文档没有首先展示如何减少 apache 使用的 RAM。

我正在使用以下命令来给出平均进程大小:

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)}'

目前约为 130Mb,这是一个不合理的大数字吗

sudo free -m表明我有大约 3000Mb 的可用内存,所以在我使用太多内存之前我可以拥有 3000/130 = 大约 20 个工人。

我可以成功地限制工作人员的数量以防止过多的内存使用,但是当我这样做时,结果只是我放弃了 ~100 个请求/分钟,返回 504 错误。这在我的场景中是不可接受的。

显然,我有 2 个选项,增加服务器中的 RAM 量或减少每个 Apache 进程消耗的内存量。

我已经从 apache 中删除了不必要的模块,但我不再确定我还能做些什么来减少每个 apache2 进程的内存占用。我想运行 50-100 名工人,这需要 13GB 的 RAM,这似乎太多了?

WebApp 用于管理一个由大约 30,000 个互联网连接产品组成的系统。大多数请求是记录与系统的连接或向用户返回一个 json 数据数组。

我的 Apache2.conf 文件如下:

Timeout 120
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 5
ThreadsPerChild 20
MaxRequestWorkers 100
ServerLimit 100
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Include ports.conf
AccessFileName .htaccess
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf

我现在可以采取什么步骤,因为我认为我的应用程序不应该需要具有 13+Gb 内存的服务器,并且我不想减少 MaxRequestWorkers 的数量,因为这样做会导致系统拒绝大约 100 个请求/分钟

4

0 回答 0