【发布时间】:2018-06-12 17:37:55
【问题描述】:
我们目前正在使用 Flask RQ 和 Flask SQLAlchemy,但遇到了一些性能问题。这是我们的高级架构:
- API 端点被命中
- 耗时的任务在 RQ 中排队
- RQ 工作器派生一个新进程来执行工作
- 作业通常包括通过 Flask SQLAlchemy 进行的数据库查询 + 附加处理
当使用 cProfile 查看 (4) 的性能时,我看到了
1 5.7e-05 5.7e-05 4.064 4.064 __init__.py:496(__get__)
535/1 0.002901 0.002901 3.914 3.914 base.py:389(_inspect_mapped_class)
1 0.001281 0.001281 3.914 3.914 mapper.py:2782(configure_mappers)
462/1 0.000916 0.000916 3.914 3.914 base.py:404(class_mapper)
1 1.4e-05 1.4e-05 3.914 3.914 mapper.py:1218(_configure_all)
59 0.01247 0.0002113 3.895 0.06601 mapper.py:1750(_post_configure_properties)
985/907 0.01748 1.927e-05 3.29 0.003627 interfaces.py:176(init)
235/157 0.00914 5.822e-05 3.162 0.02014 relationships.py:1650(do_init)
...
和
我看到很多时间都花在了 SQLAlchemy 上;我假设这是将 SQL 数据映射到 ORM 对象的一些开销。所以,我有两个问题:
- 初始化 SQL-ORM 映射所花费的时间量是预期的吗?我在 AWS xlarge 实例上以 70% 的 CPU 运行。根据 pg_stat_statements,我所有的关系都是使用
lazy='dynamic'动态加载的,并且相应的查询需要 - 假设没有办法解决 (1),另一种避免持续开销的方法是使用类似 this 的队列。因此,不是为每个作业派生一个新进程,而是直接在线程中运行该作业。这对于分布式系统是否可取?我无法找到执行此操作的框架,所以这可能不是一个好主意?
最后一点,如果我很愚蠢并且没有看到明显的解决方案,请告诉我!
【问题讨论】:
标签: python flask sqlalchemy flask-sqlalchemy python-rq