Django Celery 内存未释放

2024-03-26

在我的 django 项目中,我有以下依赖项:

  • Django==1.5.4
  • django-celery==3.1.9
  • amqp==1.4.3
  • 海带==3.0.14
  • librabbitmq==1.0.3 (按照建议https://stackoverflow.com/a/17541942/1452356 https://stackoverflow.com/a/17541942/1452356)

在 dev_settings.py 中:

DEBUG = False
BROKER_URL = "django://"
import djcelery
djcelery.setup_loader()
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
CELERYD_CONCURRENCY = 2
# CELERYD_TASK_TIME_LIMIT = 10 

CELERYD_TASK_TIME_LIMIT按照此处的建议进行评论https://stackoverflow.com/a/17561747/1452356 https://stackoverflow.com/a/17561747/1452356随着debug_toolbar正如建议的https://stackoverflow.com/a/19931261/1452356 https://stackoverflow.com/a/19931261/1452356

我在 shell 中启动我的工作人员:

./manage.py celeryd --settings=dev_settings

然后我发送一个任务:

class ExempleTask(Task):

  def run(self, piProjectId):
    table = []
    for i in range(50000000):
      table.append(1)
    return None

使用 django 命令:

class Command(BaseCommand):

  def handle(self, *plArgs, **pdKwargs):
    loResult = ExempleTask.delay(1)
    loResult.get()
    return None

With:

./manage.py purge_and_delete_test --settings=dev_settings

我通过以下方式监控内存使用情况:

watch -n 1 'ps ax  -o rss,user,command | sort -nr | grep celery |head -n 5'

每次我调用该任务时,它都会增加 celeryd/worker 进程的内存消耗,与其中分配的数据量成比例......

这似乎是一个常见问题(参见其他 stackoverflow 链接),但是即使使用最新的依赖项,我也无法修复它。

Thanks.


这是一个 Python 和操作系统问题,而不是真正的 django 或 celery 问题。无需太深入:

1) 一旦进程向操作系统请求内存寻址空间,它就永远不会释放内存寻址空间。它从来不会说“嘿,我已经完成了,你可以把它拿回来”。在您给出的示例中,我预计进程大小会增长一段时间,然后稳定下来,可能会保持在较高的基线。在示例分配之后,您可以调用gc强制垃圾收集的接口看看如何

2) 这通常不是问题,因为未使用的页面会被操作系统调出,因为您的进程停止访问已释放的地址空间。

3)如果你的进程正在泄漏对象引用,从而阻止 python 进行垃圾收集以重新分配空间以供以后重用,那么这是一个问题通过那个过程,并要求您的进程向操作系统请求更多地址空间。在某些时候,操作系统会喊叔叔,并(可能)用它的 oomkiller 或类似机制杀死你的进程。

4) 如果泄漏,请修复泄漏或设置CELERYD_MAX_TASKS_PER_CHILD,并且您的子进程(可能)会在扰乱操作系统之前自杀。

这是关于 Python 内存管理的一个很好的一般性讨论:CPython内存分配 https://stackoverflow.com/questions/18522574/cpython-memory-allocation

还有一些小事: 使用xrange not range- range 将生成所有值,然后迭代该列表。xrange只是一个发电机。是否设置了 Django DEBUG=False?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Celery 内存未释放 的相关文章

随机推荐

  • IIS 上的 django,进程意外退出

    我已经阅读了关于该主题的所有文章 但我仍然无法在 IIS 上运行 django 项目 错误消息为 500 Internal Server Error c program files x86 python 3 5 python exe Fas
  • 如何更改 WPF 中绑定选项的默认值?

    在我当前的项目中 我使用了几个文本框控件 其内容由来自数据库的对象填充 该对象使用验证来验证文本的正确插入 当我想显示验证错误 即文本有很多字符 时 我必须向文本属性添加一些绑定选项 如下行所示
  • 删除 json_encode() 中的双引号

    我想删除 json encode 中的双引号 这是我的代码
  • 如何使用 Python 多线程处理 MySQL 连接

    我有一个主要的 Python 脚本 它连接到 MySQL 数据库并从中提取一些记录 根据返回的结果 它会启动与抓取的记录一样多的线程 类实例 每个线程都应该返回数据库并通过将一个状态标志设置为不同的状态 进程已启动 来更新另一个表 为了实现
  • Laravel 将数据透视表附加到具有多个值的表

    背景 我正在创建一个围绕食物过敏的数据库 并且食物和过敏之间存在多对多的关系 还有一个枢轴值称为severity其中有一个数字代表对该食品过敏的严重程度 这个链接表看起来像这样 food id allergy id severity 1 1
  • 指定与 Chef Solo 一起运行哪些食谱

    我正在使用 Chef solo 在本地测试我的食谱 但我希望能够只运行我正在测试的食谱 目前 chef solo 似乎将运行在solo rb 中指定的cookbooks 目录中的所有cookbook 我已经在 json 属性文件中指定了运行
  • 通过 jQuery ajax 调用将值列表传递给 django 视图

    我正在尝试使用 jQuery ajax 调用将数值 ids 列表从一个网页传递到另一个网页 我不知道如何传递和读取列表中的所有值 我可以成功发布和读取 1 个值 但不能成功发布和读取多个值 这是我到目前为止所拥有的 jQuery var p
  • Bootstrap 输入组插件对齐问题

    我的输入组插件与我的输入文本框不对齐 我做错了什么 div class form group div
  • 我无法让 phpseclib 工作

    我想做的事 我想要upload download一个文件通过sftp using php The phpseclib library看起来很有前途 我已经做了什么 我将composer json更改为 require nicolab php
  • 如何在Azure中创建或使用本地文件夹?

    我需要从 SFTP 服务器下载文件 下载的文件存储到本地文件夹 D Data tempData csv 我必须从本地文件读取数据并在我的应用程序中使用以进行其他数据操作 此作业是使用 Azure Web 作业中的 Web 挂钩计划程序创建的
  • 我的“zipLatest”运算符是否已经存在?

    关于我自己写的一个运算符的快速问题 请原谅我可怜的大理石图表 zip aa bb cc dd ee ff gg 11 22 33 44 55 a1 b2 c3 d4 e5 combineLatest aa bb cc dd ee ff gg
  • 使用 f:convertNumber 时设置小数点分隔符

    我想知道如何在 JSF 应用程序上设置默认的小数点分隔符 我有一些
  • NodeJS UDP 多播如何

    我正在尝试将 UDP 多播数据包发送到 230 185 192 108 以便每个订阅的人都会收到 有点卡住了 我相信它的广播正确 但似乎无法从任何客户端获取任何信息 Server var news Borussia Dortmund win
  • 如何将多个参数传递给 Scrapy 蜘蛛(不再支持使用多个蜘蛛运行“scrapy scrapy”时出现错误)?

    我想将多个用户定义的参数传递给我的 scrapy spider 所以我尝试遵循这篇文章 如何在 scrapy 蜘蛛中传递用户定义的参数 https stackoverflow com questions 15611605 how to pa
  • CMTime 和 AVFoundation 中单帧的移动

    我正在尝试使用 AVFoundation 播放视频 我使用以下代码作为将播放前进一帧的按钮 它间歇性地工作 在某些执行中它会做正确的事情并前进一帧 但大多数时候我必须按按钮 3 或 4 次才能前进一帧 这让我认为这是某种精度问题 但我无法弄
  • 为什么单函数访问器似乎被认为是坏习惯?

    我经常看到 即在 Slim 框架内 单一函数访问器风格 如下面的 1 已弃用 取而代之的是经典的 Java ish 2 函数访问器 get set 如下面的 2 就我个人而言 我更喜欢更少的代码行 在 1 中 和更少的输入 get set
  • Java多线程数据库访问[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于多线程 Java 应用程序来说 确保所有线程同步访问数据库的最佳解决方案是什么 例如 每个线程代表单独的事务 并且首先检查数据库的
  • 使用 FFT 进行 Matlab 模板匹配

    我正在努力解决 Matlab 中傅立叶域中的模板匹配问题 这是我的图片 艺术家是 DeviantArt 上的 RamalamaCreatures 我的目标是在负鼠的耳朵周围放置一个边界框 就像这个例子 我使用normxcorr2执行模板匹配
  • Stripe webhook 签名失败 - Stripe.net

    我正在尝试使用 Jayme Davis 的 C 库 Stripe net 来实现 stripe webhook 我已经在条带仪表板中设置了测试端点并生成了秘密 端点命中良好 并将使用 StripeEventUtility ParseEven
  • Django Celery 内存未释放

    在我的 django 项目中 我有以下依赖项 Django 1 5 4 django celery 3 1 9 amqp 1 4 3 海带 3 0 14 librabbitmq 1 0 3 按照建议https stackoverflow c