【发布时间】:2023-03-18 01:13:01
【问题描述】:
我有一个在本地运行的完美服务器(0.13 核心版本)。我在具有 64 GB RAM 和 32 个 CPU 核心的服务器机器上循环调用 flow.run() 100 万次。当它运行到大约 300 次时,它开始从 GraphQL 抛出连接拒绝错误。
我仍在考虑是否在我的工作流程中使用 Prefect,但它看起来占用了太多 RAM。 Prefect 如何同时扩展数千个工作流?
我用一个简单的例子来运行工作流:
176 from flask import Flask
177 app = Flask(__name__)
178
179 import prefect
180 client = prefect.Client()
181
182 @app.route('/')
183 def hello_world():
184 client.create_flow_run("032275d0-6c31-4dc5-bf32-5b2afadbe531")
185 return 'Hello, World!'
然后我调用 REST API 来触发从 1 到 1000 的流。
for i in {1..1000}; do curl localhost:5000/; done
我了解到 GraphQL 正在使用大量内存(最多 10 GB RAM)。然后 Prefect UI 开始徘徊在 100 左右。
我不确定我是否将 Prefect 工作流程用作其预期用途,但如果可能的话,我想解决这个问题。
【问题讨论】:
-
还评估了某些工作流程的 Prefect。我不确定,但看看数据库模式,我可能是错的,但它似乎并不容易扩展。系统将日志、流运行状态、任务运行状态都保存在同一个数据库中。据我了解,UI 连接到 Apollo,Apollo 连接到处理所有突变和东西的 GraphQL 客户端。 GraphQL 使用 Hasura 与 Postgres 进行交互。
-
所以我可以想象大量的请求会使事情变慢。我想也许你可以解决 Postgres 的一些瓶颈,并使用 NoSQL 数据库来加快速度。但奇怪的是他们会重写数据库逻辑的相关方面,不知道......
-
@LifeAndHope 有多少代理在处理这 1000 个流?您是否在服务器上运行单个代理?您的流程的计算密集程度如何?在生产环境中,服务器只是处理调度,代理(复数)将水平运行您的流程。
标签: prefect