首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >芹菜3.1.19为每个工作人员创建太多线程,导致服务器超载,CPU 100%无法创建更多线程

芹菜3.1.19为每个工作人员创建太多线程,导致服务器超载,CPU 100%无法创建更多线程
EN

Stack Overflow用户
提问于 2015-12-09 18:44:45
回答 2查看 1.2K关注 0票数 0

用例:使用Django框架(版本1.6 )中的芹菜来调度本质上写到数据库的任务。我只有一个自定义队列,芹菜调度程序把任务放在上面。创建了一个侦听此队列中并发性为8的芹菜工人。

问题:8个工作人员中的每个人都会继续创建从未被回收的线程(我猜)。这导致线程太多(我见过计数上升到20k线程)。在4-5小时的时间内,线程数触及10k!

我看到了错误:无法启动新线程。

Python对正在启动新线程的人的跟踪给了我以下信息:调用django保存会创建一个新线程。“adgroup”这里是django模型对象

代码语言:javascript
复制
[2015-12-03 18:40:17,133: WARNING/Worker-3] adgroup.save(update_fields=['bids_today', 'impressions_today', 'spent_today', 'last_metric_update_time'])
[2015-12-03 18:40:17,887: WARNING/Worker-3] File "/home/ec2-user/venv/local/lib/python2.7/dist-packages/django/db/models/base.py", line 545, in save
[2015-12-03 18:40:17,887: WARNING/Worker-3] force_update=force_update, update_fields=update_fields)
[2015-12-03 18:40:18,715: WARNING/Worker-3] File "/home/ec2-user/venv/local/lib/python2.7/dist-packages/django/db/models/base.py", line 582, in save_base
[2015-12-03 18:40:18,716: WARNING/Worker-3] update_fields=update_fields, raw=raw, using=using)
[2015-12-03 18:40:18,716: WARNING/Worker-3] File "/home/ec2-user/venv/local/lib/python2.7/dist-packages/django/dispatch/dispatcher.py", line 185, in send
[2015-12-03 18:40:18,716: WARNING/Worker-3] response = receiver(signal=self, sender=sender, **named)
[2015-12-03 18:40:19,300: INFO/MainProcess] Task ExtendTV.celery_tasks.stats_collector.collectAdGroupMetricsTask[2ae52b3d-77b9-46d3-93ac-d7fad9b96382] succeeded in 26.486441362s: None
[2015-12-03 18:40:19,395: WARNING/Worker-3] File "/home/ec2-user/venv/local/lib/python2.7/dist-packages/haystack/signals.py", line 48, in handle_save
[2015-12-03 18:40:19,593: WARNING/Worker-3] index.update_object(instance, using=using)
[2015-12-03 18:40:19,593: WARNING/Worker-3] File "/home/ec2-user/venv/local/lib/python2.7/dist-packages/haystack/indexes.py", line 274, in update_object
[2015-12-03 18:40:19,593: WARNING/Worker-3] backend.update(self, [instance])
[2015-12-03 18:40:19,593: WARNING/Worker-3] File "/home/ec2-user/venv/local/lib/python2.7/dist-packages/haystack/backends/whoosh_backend.py", line 208, in update
[2015-12-03 18:40:20,515: WARNING/Worker-3] writer.commit()
[2015-12-03 18:40:20,516: WARNING/Worker-3] File "/home/ec2-user/venv/local/lib/python2.7/dist-packages/whoosh/writing.py", line 1043, in commit
[2015-12-03 18:40:21,318: WARNING/Worker-3] self.start()
[2015-12-03 18:40:21,642: WARNING/Worker-3] File "/usr/lib64/python2.7/threading.py", line 748, in start
[2015-12-03 18:40:22,340: WARNING/Worker-3] _start_new_thread(self.__bootstrap, ())
[2015-12-03 18:40:22,340: WARNING/Worker-3] error: can't start new thread

Misc信息:从图片中可以看到,内存在正常范围内。这个“线程问题”并不存在于芹菜的前一个版本3.0.x中。然而,在这里,内存变得相当高。

我用芹菜命令来创造一个工人:

代码语言:javascript
复制
celery -A ProjectName worker -l DEBUG -Q ExampleQueueName

我用的芹菜布景:

代码语言:javascript
复制
CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE_TYPE = 'direct'
CELERY_DEFAULT_ROUTING_KEY = 'default'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES=60*60*24
CELERYD_PREFETCH_MULTIPLIER = 128

其他相关设置:使用rabbitmq 3.5.4作为消息代理

最新情况:

代码语言:javascript
复制
def collectAdGroupMetricsTask(*args, **kwargs):
    try:
        adgroup = AdGroup.objects.get(id=kwargs.get("adgroupID"))
        collectAdGroupMetrics(adgroup)
    except Exception as e:
        logger.error("Could not retreive AdGroup for collectAdGroupMetrics. " + str(e))
    return

def collectAdGroupMetrics(adgroup, currDate=None):
    Value1=function1_making_another_db_call()
    Value2=function2_making_another_db_call()
    adgroup.fieldname1 = Value1
    adgroup.fieldname2 = Value2    
    adgroup.save(update_fields=['fieldname1', 'fieldname2'])

工作进程有很多线程的例子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-18 18:49:40

whoosh ( package)出现了一个问题,它试图获得一个写锁,并一直在等待,导致创建了这么多threads.Hence,从django中安装的应用程序列表中删除了whoosh。同时,在芹菜中使用maxtasksperchild配置,以防止内存持续增长。

票数 0
EN

Stack Overflow用户

发布于 2019-01-01 23:08:40

  • 首先,在pythonic虚拟环境中安装了包gevent
  • Next对运行芹菜的命令做了一些更改
  • 最后,我附加了参数--pool gevent。默认情况下,芹菜使用池‘pre叉’,这应该有一些bug。
  • 选择后,,,,芹菜,的进程数降低到子进程数(并发)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34186609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档