You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:37:31