5

在 Heroku 上不断收到错误 R14(超出内存配额)。

在本地分析 django 应用程序上的内存我没有看到任何问题。我们已经安装了 New Relic,那里的一切似乎都很好,除了一个奇怪的地方:

http://screencast.com/t/Uv1W3bjd

每个测功机的内存使用量在 15mb 左右徘徊,但由于某种原因,“测功机运行”的东西迅速扩展到 10+。不确定这有什么意义,因为我们目前只在 web dyno 上运行。

我们也在运行 celery,那里的情况看起来也很正常(大约 15mb)。虽然这是可疑的,因为我相信我们在启动时就开始出现错误。

我们的一些请求确实需要一段时间,因为它们会发出一个回显的肥皂请求,有时可能需要 6-10 秒才能响应。这是否以某种方式阻塞并导致新的测功机旋转?

这是我的proc文件:

web: python manage.py collectstatic --noinput; python manage.py compress; newrelic-admin run-program python manage.py run_gunicorn -b "0.0.0.0:$PORT" -w 9 -k gevent --max-requests 250
celeryd: newrelic-admin run-program python manage.py celeryd -E -B --loglevel=INFO

主要问题是内存错误。

4

1 回答 1

14

我相信我可能已经找到了问题所在。

基于这样的帖子认为我应该有 9-10 名枪手工人。我认为这是不正确的(或者至少,它适用于我的应用程序正在做的工作)。

我一直在运行 9 个 gunicorn worker,最后意识到这是 heroku 和 local 之间唯一真正的区别(就配置而言)。

根据gunicorn 设计文件,对工人的建议是这样的:

不要将工作人员的数量扩展到您期望拥有的客户数量。Gunicorn 应该只需要 4-12 个工作进程来处理每秒数百或数千个请求。

Gunicorn 在处理请求时依靠操作系统来提供所有的负载平衡。通常我们推荐 (2 x $num_cores) + 1 作为开始的工人数量。虽然不是太科学,但该公式是基于这样的假设,即对于给定的核心,一个工作人员将在另一个工作人员处理请求时从套接字读取或写入。

虽然那里有关于 Heroku Dyno CPU 能力的信息,但我现在读到每个 dyno 都在大约 1/4 的核心上运行。不是超级强大,但我想足够强大。

将我的员工调到 3(根据他们的粗略公式,这个数字甚至更高)似乎已经停止了我的记忆问题,至少现在是这样。当我想到它时,我会得到的关于内存警告的有趣之处在于它永远不会上升。它达到了 103% 左右,然后就停留在那里,而如果它实际上是泄漏,它应该一直上升直到被关闭。所以我的理论是我的工人最终消耗了足够的内存来超过 512mb。

HEROKU 应该在某处添加此信息!至少我应该能够top进入我的跑步测功机看看发生了什么。本来可以节省我几个小时和几天的时间。

于 2012-08-23T05:53:09.477 回答