【问题标题】:Diagnosing Memory leak in boto3诊断 boto3 中的内存泄漏
【发布时间】:2018-10-24 21:14:16
【问题描述】:

我有一个在 Elastic Beanstalk 上运行的 celery 工作程序,它轮询 SQS 队列、获取消息(包含 S3 文件名)、从 S3 下载这些文件并处理它们。我的工作人员计划每 15 秒运行一次,但由于某种原因,内存使用量会随着时间的推移而不断增加。

这是我用来访问 SQS 的代码

def get_messages_from_sqs(queue_url, queue_region="us-west-2", number_of_messages=1):
    client = boto3.client('sqs', region_name=queue_region)
    sqs_response = client.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=number_of_messages)
    messages = sqs_response.get("Messages", [])
    cleaned_messages = []
    for message in messages:
        body = json.loads(message["Body"])
        data = body["Records"][0]
        data["receipt_handle"] = message["ReceiptHandle"]
        cleaned_messages.append(data)
    return cleaned_messages

def download_file_from_s3(bucket_name, filename):
    s3_client = boto3.client('s3')
    s3_client.download_file(bucket_name, filename, '/tmp/{}'.format(filename))

完成该过程后,是否需要在 boto3 中关闭客户端连接?如果是这样,我们该怎么做?

【问题讨论】:

  • 如果系统没有尽快释放内存,试试这个。 stackoverflow.com/questions/1316767/…
  • 你用的是哪个 celery 版本?
  • 芹菜 4.1.0
  • 如果您怀疑内存泄漏,识别它的方法是在内存使用率高的某个时刻创建内存转储,并尝试了解哪些类型的对象占用了内存。这可以让您了解实现的哪个部分泄漏了内存。您可以为此使用GuppyHeapy
  • 另一方面,尝试重用client 实例,而不是在每次调用get_messages_from_sqs 时创建新实例

标签: python django memory celery boto3


【解决方案1】:

我在生产中使用 Celery 时遇到过类似的问题,与 Boto 完全无关。虽然我没有对内存泄漏的解释(这需要一些认真的代码探索和分析),但如果您的目标只是不耗尽内存,我可以提供一个潜在的解决方法。

设置max tasks per child 应该允许您在被终止进程释放内存时不断回收内存。

【讨论】:

  • 我正在寻找的错误肯定与 boto3 相关
  • 我绝对相信,我只是不确定您的问题是否与尝试诊断内存泄漏或如何让 celery 越过它并保持运行有关。
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2014-06-16
  • 2016-04-29
相关资源
最近更新 更多