lev*_*lev 3 python django performance rabbitmq celery
我正在尝试发送~400个HTTP GET请求并收集结果.我是从django跑来的.我的解决方案是使用芹菜与gevent.
要启动芹菜任务,我调用get_reports:
def get_reports(self, clients, *args, **kw):
sub_tasks = []
for client in clients:
s = self.get_report_task.s(self, client, *args, **kw).set(queue='io_bound')
sub_tasks.append(s)
res = celery.group(*sub_tasks)()
reports = res.get(timeout=30, interval=0.001)
return reports
@celery.task
def get_report_task(self, client, *args, **kw):
report = send_http_request(...)
return report
Run Code Online (Sandbox Code Playgroud)
我用4个工人:
manage celery worker -P gevent --concurrency=100 -n a0 -Q io_bound
manage celery worker -P gevent --concurrency=100 -n a1 -Q io_bound
manage celery worker -P gevent --concurrency=100 -n a2 -Q io_bound
manage celery worker -P gevent --concurrency=100 -n a3 -Q io_bound
Run Code Online (Sandbox Code Playgroud)
我使用RabbitMq作为经纪人.
虽然它的工作速度比按顺序运行请求要快得多(400个请求需要大约23秒),但我注意到大部分时间都是来自芹菜本身的开销,即如果我更改了get_report_task,就像这样:
@celery.task
def get_report_task(self, client, *args, **kw):
return []
Run Code Online (Sandbox Code Playgroud)
整个操作耗时约19秒.这意味着我只花了19秒钟将所有任务发送到芹菜并将结果恢复
对Rabbit mq的消息的排队速率似乎是28个消息/秒,我认为这是我的瓶颈.
如果重要的话,我正在使用win 8机器.
我试过的一些事情:
调整这些设置
BROKER_POOL_LIMIT = 500
CELERYD_PREFETCH_MULTIPLIER = 0
CELERYD_MAX_TASKS_PER_CHILD = 100
CELERY_ACKS_LATE =假
CELERY_DISABLE_RATE_LIMITS = True
我正在寻找任何有助于加快速度的建议.
你真的在没有虚拟机的Windows 8上运行吗?我在运行OS X 10.7的2核心Macbook 8GB RAM上进行了以下简单测试:
import celery
from time import time
@celery.task
def test_task(i):
return i
grp = celery.group(test_task.s(i) for i in range(400))
tic1 = time(); res = grp(); tac1 = time()
print 'queued in', tac1 - tic1
tic2 = time(); vals = res.get(); tac2 = time()
print 'executed in', tac2 - tic2
Run Code Online (Sandbox Code Playgroud)
我使用Redis作为经纪人,Postgres作为结果后端和默认工作者--concurrency=4.猜猜输出是什么?这里是:
排队在3.5009469986
执行于2.99818301201
事实证明我有两个不同的问题。
首先,该任务是一个成员方法。从课堂上提取出来后,时间缩短到了12秒左右。我只能假设这与self的酸洗有关。
第二件事是它在 Windows 上运行。在我的linux机器上运行后,运行时间不到2秒。我猜窗户并不是为了高性能而切割的。
| 归档时间: |
|
| 查看次数: |
6974 次 |
| 最近记录: |