AWS Lambda Python Docker镜像部署字符串转向量函数超时问题求助
- 补充代码埋点日志
在代码的关键执行节点增加带时间戳的日志输出,明确卡住的具体环节。参考改造后的代码:
import logging import time from functools import lru_cache logging.basicConfig(level=logging.INFO) logger = logging.getLogger() def _encode(text: str): logger.info("开始执行_encode核心逻辑") start = time.time() [<main functionality>] logger.info(f"_encode执行完成,耗时{time.time()-start:.2f}s") return result @lru_cache def encode(text: str): logger.info("进入encode函数,检查缓存命中情况") start = time.time() res = _encode(text) logger.info(f"encode执行完成,耗时{time.time()-start:.2f}s") return res def handler(event, context): logger.info(f"收到请求,event参数:{event}") start = time.time() try: res = encode(event["text"]) logger.info(f"请求处理总耗时{time.time()-start:.2f}s") return res except Exception as e: logger.error(f"处理报错:{str(e)}", exc_info=True) raise e
所有日志会自动同步到AWS CloudWatch,可通过日志流查看完整输出。
调整Lambda资源配置
Lambda的CPU性能与内存配额直接绑定,默认的低内存配额会导致大依赖/大模型加载速度极慢。先将Lambda内存调整到最大值(当前支持最高10GB),再重新测试,排查是否是资源不足导致的超时。排查冷启动初始化耗时
本地测试容器时,函数已经完成初始化、依赖/模型已经加载到内存,所以响应速度快。但部署到Lambda后冷启动的第一次请求会触发所有初始化逻辑,如果模型加载逻辑写在_encode函数内(首次调用才加载),1GB以上的模型加载时间很容易超过60s。
建议将模型加载等重初始化逻辑移到全局作用域(handler函数外),容器启动时就完成加载,也可以开启预置并发提前预热函数,避免冷启动耗时算到handler执行时间内。本地模拟冷启动场景验证
每次测试前重启Docker容器,模拟Lambda冷启动场景,执行curl请求查看首次请求的耗时,若本地冷启动首次请求耗时就超过60s,说明问题出在自身代码的初始化逻辑,与Lambda运行环境无关。检查网络配置
如果你的Lambda配置了VPC,需要确认子网路由、安全组配置正确:如果代码逻辑需要访问公网,需要为子网配置NAT网关;如果不需要公网访问,确认代码中没有额外的外网请求逻辑。错误的VPC配置会导致网络请求卡住超时,是本地正常但Lambda运行超时的常见原因。查看完整CloudWatch日志
不要仅依赖Lambda控制台的测试结果输出,进入CloudWatch日志组找到对应Lambda的日志流,查看完整的运行日志,排查是否有权限不足、依赖加载失败等隐藏错误。
内容的提问来源于stack exchange,提问作者Carsten

