AWS RDS PostgreSQL表更新时出现连接冻结问题排查求助
排查AWS RDS PostgreSQL连接耗尽与ReadTimeout问题
嘿,从你的描述和提供的脚本来看,核心问题应该是数据库连接资源耗尽导致的随机ReadTimeout错误。结合你的场景,我整理了几个具体的排查和修复方向:
1. 先修复脚本中的连接泄漏问题
你当前的脚本使用了NullPool(每次请求新建连接,不复用),这本身适合短生命周期的cronjob,但你的连接管理存在隐患:
- 代码中
connection.close()放在if块末尾,如果try语句内抛出异常,connection.close()会被跳过,导致连接没有被正确释放,长期积累就会造成连接泄漏。 - 建议用Python的
with语句自动管理连接,它会在代码块结束后(无论成功还是异常)自动关闭连接,完全避免手动关闭的疏漏。
优化后的脚本示例:
def main(): coin1 = 'bitcoin' time_period = '1d' DATABASE_URI = f'postgresql+psycopg2://{USR}:{token}@{ENDPOINT}:{PORT}/{DBNAME}' engine = create_engine(DATABASE_URI, echo=False, poolclass=NullPool) # 使用with语句自动管理连接,无需手动调用close() with engine.connect() as connection: old_btc_data = pd.read_sql("SELECT * FROM daily_data", connection) start_date= str(old_btc_data['datetime'].iloc[-1].date() - datetime.timedelta(days=7)) latest_data_btc = get_daily_data(coin1, start_date, time_period) if latest_data_btc is not None: try: latest_data_btc = latest_data_btc.reset_index() latest_data_btc['datetime'] = latest_data_btc['datetime'].dt.tz_localize(None) latest_data_btc = pd.concat([old_btc_data, latest_data_btc], ignore_index=True) latest_data_btc = latest_data_btc.drop_duplicates(keep='last') latest_data_btc = latest_data_btc.set_index('datetime') latest_data_btc.to_sql('daily_data', if_exists='replace', con=connection) print(f"Pushed BTC daily data to the database") except Exception as e: # 打印具体错误,方便后续排查 print(f"BTC daily data update FAILED!!!!!! Error: {str(e)}") if __name__ == '__main__': main()
2. 检查RDS实例的连接数上限
AWS RDS PostgreSQL的最大连接数和实例类型直接相关(比如t2.micro默认只有66个连接),20个cronjob同时运行加上其他潜在连接,很容易打满上限:
- 登录AWS RDS控制台,找到你的实例,查看监控中的
Database Connections指标,对比Maximum Connections(可在参数组中查看max_connections参数值)。 - 如果连接数经常接近最大值,要么升级到更大的实例类型(提升连接数上限),要么调整
max_connections参数(注意:该参数和实例内存挂钩,不能随意调大,避免影响数据库性能)。
3. 查看PostgreSQL日志确认错误细节
RDS的PostgreSQL日志会记录连接相关的错误,比如too many connections,这能直接确认是否是连接耗尽导致的问题:
- 在RDS控制台的日志和事件中,下载或查看
postgresql.log,搜索关键词connection或timeout,找到具体的错误信息。
4. 降低cronjob的并发度
20个cronjob同时触发,瞬间会创建大量连接,超过数据库的处理能力。你可以:
- 把每5分钟运行的脚本错开执行(比如设置成
*/5 * * * *、1-59/5 * * * *、2-59/5 * * * *等,分散启动时间)。 - 每日运行的脚本也尽量避免和高频脚本同时执行,减少并发连接数。
另外你提到活动会话数是浮点数,这大概率是监控数据的采样精度问题,不用过度关注,重点看连接数的增长趋势即可。
按照这个顺序排查,应该能快速定位并解决问题!
内容的提问来源于stack exchange,提问作者yash
相关产品推荐
相关产品推荐

