从 Celery 后端获取结果异常缓慢

Fetching results from Celery backend is abnormally slow

我正在使用 Celery 和 Redis 代理为我的 Django 应用程序做一些“繁重”的处理。 WSL2 上的 Docker 容器中的所有内容都在 运行 本地。

任务输出一个 JSON,大约有 2.5 Mb 大小,通过 Django 应用程序中的 get() 检索结果最多需要 9 秒。对于较小的有效载荷,时间会减少

我尝试将 WSL2 的 RAM 和 CPU 增加到 6 CPUs 和 8Gb RAM。 Celery 配置为 --max-memory-per-child=1024000 --concurrency=4

我试过使用不同的 result_backend 配置得到了相似的结果:

我尝试在使用 SQLite 时设置一个时间间隔(对于 RPC 和 Redis 无关紧要),改进了 0.5 秒 get(interval=0.01)

我还尝试将 result_serializer 从 JSON 更改为 pickle 以降低性能。但我不认为序列化程序是这里的罪魁祸首,因为序列化/反序列化相同 JSON 在控制台

中非常快
>>> timeit.timeit(lambda: pickle.dumps(big_dict,0), number=10)
0.567067899999528

>>> timeit.timeit(lambda: pickle.loads(str), number=10)
0.3542163999991317

我尝试使用压缩,只有 zlib 似乎提供了一个小增益。

我不太熟悉此设置,但恕我直言,我应该能够更快地检索结果。我能达到的最好成绩是 6 秒。知道如何改进它或如何解释它吗?

settings.py

CELERY_BROKER_URL = "redis://{host}:{port}/{db}".format(
    host=os.environ.get('REDIS_HOST'),
    port=os.environ.get('REDIS_PORT'),
    db=os.environ.get('CELERY_REDIS_DB')
)
CELERY_RESULT_BACKEND = "redis://{host}:{port}/{db}".format(
    host=os.environ.get('REDIS_HOST'),
    port=os.environ.get('REDIS_PORT'),
    db=os.environ.get('CELERY_REDIS_DB')
)
# CELERY_RESULT_BACKEND = 'db+sqlite:///celery.sqlite'  # SQL Example (need SQLAlchemy==1.4.29 in requirements.txt)
# CELERY_RESULT_BACKEND = 'rpc://localhost'  # RPC Example
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

谢谢

一般来说,Redis has a reputation for being bad at dealing with large objects 并不打算成为大型对象存储。您最好使用通用 RDBMS 或文件存储并将密钥返回到可以检索 JSON 的位置。