Richard Yen:调试RDS Proxy锁定:隐藏的JIT切换如何导致数千个锁定连接

💡 原文英文,约1100词,阅读约需4分钟。
📝

内容提要

使用AWS RDS Proxy时,连接复用因会话状态变化被锁定,导致高CPU使用和大量活动连接。分析日志发现,asyncpg在注册JSON编码器时临时禁用JIT,影响RDS Proxy跟踪会话状态。通过添加连接钩子禁用JIT,成功减少锁定会话数量,提升性能。

🎯

关键要点

  • 使用AWS RDS Proxy时,连接复用因会话状态变化被锁定,导致高CPU使用和大量活动连接。
  • 通过分析日志发现,asyncpg在注册JSON编码器时临时禁用JIT,影响RDS Proxy跟踪会话状态。
  • 添加连接钩子禁用JIT,成功减少锁定会话数量,提升性能。
  • SQLAlchemy在连接初始化时运行on_connect钩子,注册优化的JSON和JSONB编码器。
  • asyncpg在注册编码器时需要查找类型OID,触发内部函数introspect_types()。
  • asyncpg临时禁用JIT会导致RDS Proxy无法安全跟踪会话状态,从而锁定连接。
  • 通过添加SQLAlchemy连接钩子,禁用asyncpg的JIT能力标志,避免会话锁定。
  • 部署修复后,锁定会话数量显著减少,改善超过50%。
  • 尝试其他修复方法未成功,最终解决方案是添加防止锁定的钩子。
  • 调试经验教训包括:RDS Proxy锁定来源意外,小会话级变化也会影响复用,pg_stat_statements隐藏参数值。
➡️

继续阅读