升级至Rails 7后Active Record类型映射查询性能问题排查
TL;DR
针对Active Record的某次提交旨在降低初始类型映射查询的开销,但从Rails 6.1.7升级至7.0.4后,该查询耗时远超之前版本,无法确定原因。
补充说明
升级至PostgreSQL 14解决了该问题,执行时间从9656.222 ms降至60.618 ms。
将应用从Rails 6.1.7升级至7.0.4后,我们在Amazon RDS上的PostgreSQL实例出现性能问题,部署完成后CPU使用率达到100%,实例宕机。

查看数据库日志后,发现大量类型映射查询的记录,该查询会在创建新数据库连接时触发。

我们的log_min_duration_statement设置为10000,即会记录所有耗时超过10秒的语句。
Rails升级前,该类型映射查询每天仅出现几次,平均耗时11秒;升级后,该查询频繁出现,耗时在13秒到90秒之间波动。
我已整理了两个版本的查询及EXPLAIN (ANALYZE, BUFFERS)的结果:
- Rails 7版本
- Rails 6版本(升级前)
我注意到此次提交修改了类型映射查询以降低开销,但在我们的应用中却产生了相反的效果,问题似乎出在query_conditions_for_known_type_types方法生成的语句上。
当前我们的环境配置如下:
- Rails 7.0.4(从6.1.7升级)
- Ruby 3.1.2
- Amazon RDS上的PostgreSQL 13.7
- 多租户数据库:单个数据库中每个租户拥有独立schema(约2000个schema)
- ros-apartment gem
- good_job(20线程+外部执行模式)
请问有什么思路可以解释我们遇到的该查询性能问题?
内容的提问来源于stack exchange,提问作者Jorge Arimitsu
相关产品推荐
相关产品推荐

