Google Cloud Functions连Cloud SQL频发Aborted Connection日志解决方法
问题根因
Aborted connection ... (Got an error reading communication packets)这类Note日志的核心触发原因是客户端与MySQL服务端的TCP连接没有按规范完成正常断开流程,和是否显式调用session.close()无直接关联:
- SQLAlchemy的
session.close()仅会将底层数据库连接归还给内部连接池,并不会真正关闭与Cloud SQL之间的TCP连接 - 现有代码在模块顶层全局初始化连接池,在Cloud Functions的运行模型下,函数实例闲置一段时间后会被平台直接回收终止进程,池内存留的连接来不及向服务端发送正常断开报文,MySQL端就会将这类异常断开的连接记录为对应Note日志
- 缺少连接有效性校验配置时,Cloud SQL服务端主动超时断开长期闲置的连接后,连接池仍会将这些失效连接返回给业务代码,同样会触发同类通信报错日志
修复方案
- 适配Cloud Functions运行模型调整连接池配置
云函数单实例同一时间一般仅处理1个请求,不需要大规模连接池,原配置中pool_size=5、max_overflow=2会产生大量长期闲置的无用连接,反而提升异常断连的概率。调整方向:- 缩小连接池规模:设置
pool_size=1、max_overflow=0,匹配单实例的并发能力 - 开启连接探活:增加
pool_pre_ping=True参数,每次从池中获取连接前自动发送探活请求,剔除已被服务端超时断开的失效连接 - 主动回收闲置连接:将
pool_recycle值调整为小于Cloud SQL服务端wait_timeout的数值(建议设为300,即5分钟),让连接池主动回收即将被服务端超时清理的连接 - 增加连接超时配置:通过
connect_args设置connect_timeout=10,避免网络异常下连接挂死
- 缩小连接池规模:设置
- 用上下文管理器替代手动关闭会话
原代码中手动调用session.close()的方式存在缺陷:如果查询执行过程中抛出异常,代码会直接中断,无法走到session.close()逻辑,造成连接泄漏。改用with语法管理会话后,无论执行是否报错,都会自动完成会话清理、连接归还的动作。 - 按需初始化数据库连接,请求处理完成后主动释放连接池
不需要在模块顶层全局常驻连接池:每次函数执行时按需创建引擎,请求处理完成后调用engine.dispose()主动关闭池内所有连接,与MySQL服务端完成正常的TCP四次挥手,避免留下半开连接触发服务端日志。
调整后的参考代码
from sqlalchemy import create_engine, MetaData from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() def query_database(): # 适配云函数场景的连接配置 db_config = { "pool_size": 1, "max_overflow": 0, "pool_timeout": 10, "pool_recycle": 300, "pool_pre_ping": True, "connect_args": { "connect_timeout": 10 } } # 按需创建数据库引擎 engine = create_engine( f"mysql+pymysql://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}", **db_config ) conn_factory = sessionmaker(bind=engine) try: with conn_factory() as session: items = session.query(DB_ITEM).all() return items finally: # 主动释放连接池所有连接,完成与数据库的正常断开流程 engine.dispose() # Cloud Functions 入口示例 def cloud_function_entry(request): items = query_database() # 其他业务逻辑 return {"data": items}
注:这类Note日志本身属于MySQL的常规提示,不会影响业务运行,按照上述配置调整后,异常断连场景会被完全消除,对应的冗余日志也会同步消失。
内容的提问来源于stack exchange,提问作者whateveryousayiam
相关产品推荐
相关产品推荐

