部署在AWS上的FastAPI服务频繁自动重启问题求助
排查建议
禁用Uvicorn的开发重载模式:你的
main.py里用了reload=True,这是开发环境专属的代码热加载选项,生产环境绝对不能用。重载机制会监听文件变动,容器内的临时文件更新、日志写入都可能触发无意义的重启。修改代码为:uvicorn.run("app.main:app", host="0.0.0.0", port=9026, reload=False)或者直接删除
reload参数(默认值即为False)。检查容器资源限制与监控:
- 登录AWS控制台,查看容器服务(ECS/Beanstalk)的监控指标:CPU使用率、内存使用率、OOM(内存不足)事件。处理请求时调用OpenAI API可能导致资源占用突增,一旦超过容器配置的资源限额,系统会强制杀掉进程触发重启。
- 尝试调高容器的CPU/内存配额,观察重启现象是否消失。
增强日志捕获能力:
- 调整Uvicorn启动参数开启debug级日志:
uvicorn.run(..., log_level="debug"),记录更多启动、请求处理的细节。 - 在OpenAI调用逻辑外层添加全局异常捕获,记录所有可能的错误(包括未捕获的异常):
from fastapi import FastAPI import openai import logging logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) app = FastAPI() # 全局单例OpenAI客户端 client = openai.OpenAI() @app.post("/generate") def generate_text(): try: response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "test"}], timeout=30 ) return {"result": response.choices[0].message.content} except Exception as e: logger.error(f"OpenAI调用失败: {str(e)}", exc_info=True) raise - 确认容器的stdout/stderr日志是否完整输出,避免被截断。
- 调整Uvicorn启动参数开启debug级日志:
检查健康检查配置:
- 查看AWS容器的健康检查规则:是否设置了过短的超时时间?健康检查的端点是否涉及复杂逻辑(比如调用OpenAI)?
- 新增一个轻量的健康检查端点:
然后将健康检查路径指向@app.get("/health") def health_check(): return {"status": "ok"}/health,延长超时时间(比如10秒),调整检查间隔(比如30秒)。
排查进程退出原因:
- 在AWS控制台查看容器任务的停止原因(ECS任务详情/Beanstalk应用日志),系统会记录进程退出的状态码、终止原因(比如OOM kill、用户进程主动退出)。即使应用日志无有效信息,AWS的系统日志可能存在线索。
检查连接与资源泄漏:
- 确保OpenAI客户端是全局初始化的单例,不要在每个请求里创建新客户端,避免连接数过多耗尽文件描述符。
- 排查代码中是否存在未关闭的文件、数据库连接等资源泄漏情况,长期运行后可能导致进程崩溃。
内容的提问来源于stack exchange,提问作者Deepali
相关产品推荐
相关产品推荐

