如何减少Apache平均流程大小?

时间:2016-06-24 14:24:24

标签: memory amazon-ec2 apache2 flask-sqlalchemy flask-restless

我正在运行API到用Python编写的数据库(Flask Restless),并根据Flask Documentation使用apache2和mod_wsgi。

该应用程序托管在自动扩展组内的AWS EC2实例上。 我们目前正在m3.medium实例上托管:

  • 1 vCPU
  • 3.75 Gb RAM

我们遇到的常见问题是内存错误。 Apache耗尽实例中的所有可用内存并导致[critical memory allocation]失败。 apache的这个问题是well documented.

文档和其他S.O.问题解释说我可以通过找到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错误。这在我的场景中是不可接受的。

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

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

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 RAM的服务器而且我不想减少MaxRequestWorkers的数量,因为这样做会导致系统拒绝大约100 reqs / min

0 个答案:

没有答案