python - 诊断 boto3 中的内存泄漏
问题描述
我有一个在 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))
解决方案
我在生产中使用 Celery 遇到了类似的问题,与 Boto 完全无关。虽然我没有对内存泄漏的解释(这需要一些认真的代码探索和分析),但如果您的目标只是不耗尽内存,我可以提供一个潜在的解决方法。
设置每个孩子的最大任务数应该允许您在被终止进程释放时不断回收内存。
推荐阅读
- r - 使用 R RODBC 参数化 SQL 查询
- javascript - innerHTML 属性不会用内容填充容器
- html - 调整大小时寡妇的列高
- django - Pyinstaller django 静态文件未在 Windows 上使用
- java - 哪个 ojdbc 版本支持 oracle 12.1 和 tomcat 6?
- reactjs - 调用异步方法后在反应上测试状态变化
- visual-studio - 如何分发 Visual Studio 项目的源代码
- ajax - 在 Prestashop 1.7 中增加和减少购物车中的产品数量
- c# - Npgsql:在 Npgsql 提供程序清单中找不到存储类型“jsonb”
- android - Ionic 未找到已安装的构建工具。安装 Android 构建工具 19.1.0 或更高版本