我有一个 Google App Engine 应用程序,它会定期处理大量内存密集型长时间运行的任务。我在 Python2.7 运行时以线程安全模式使用任务队列 API,因此我的每个实例都同时处理多个任务。结果,我经常遇到这些错误:
Exceeded soft private memory limit with 137.496 MB after servicing 8 requests total
After handling this request, the process that handled this request was found to be using too much memory and was terminated. This is likely to cause a new process to be used for the next request to your application. If you see this message frequently, you may have a memory leak in your application.
据我所知,每个实例各承担 8 个任务,并最终达到软内存限制。这些任务开始时使用的内存量非常少,但最终会增长到大约 15-20MB。
有什么方法可以限制告诉 App Engine 向一个实例分配不超过 5 个请求?或者告诉 App Engine 该任务预计将在 10 分钟内使用 20MB 内存并进行相应调整?
我不想使用后端 API,因为我希望处理任务的实例数量能够自动扩展,但如果这是唯一的方法,我想知道如何构建它。
请您参考如下方法:
目前没有任何方法可以就此向 App Engine 基础架构提出建议。如果您的任务现在不应该运行,您可以让它们返回一个非 200 的状态代码,在这种情况下它们将自动重试(可能在另一个实例上),但这可能会导致大量流失。后端可能是您的最佳选择。
如果您设置动态后端,它们只会根据任务队列流量的需要启动。您可以通过将后端的 URL 指定为“目标”参数来将任务发送到后端。
通过使用拉取队列,您可以获得对任务执行的更多控制。然后,您可以根据自己的选择启动后端(或使用推送队列任务,就此而言),并让实例以任何适合的方式从拉取队列中提取任务。
