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隐藏参数值。
➡️