Google Cloud Run Python应用突发内存超限异常求助
Google Cloud Run 无代码变更突发内存超限问题
问题描述
我有一个基于Python3.9的应用,通过Docker部署在Google Cloud Run上,此前数周构建与运行均无异常。但自2022年11月11日起,单次请求调用REST API端点时出现运行时内存分配错误:
Memory limit of 256M exceeded with 256M used. Consider increasing the memory limit
期间我未对代码做任何修改。将内存限制提升至512MB可解决该问题,但此应用基于Alpine的Python3.9构建,理论内存占用仅130MB-150MB,且Google Cloud Run日志显示11月11日前内存仅占256MB配额的50%。请问是否有其他人在2022年11月10日或11日前后遇到类似内存分配异常?若有,请问根因是什么及如何解决?
所用Dockerfile
FROM python:3.9-alpine3.16 ENV APP_HOME /app ENV PIPENV_VENV_IN_PROJECT true ENV PIPENV_NOSPIN true WORKDIR $APP_HOME COPY . $APP_HOME COPY xiglogger $APP_HOME RUN apk add --update --no-cache openssh git RUN pip install --upgrade setuptools RUN pip install pipenv \ && pipenv requirements > requirements.txt \ && pip install -r requirements.txt ENV PORT 8080 ENV PYTHONUNBUFFERED TRUE CMD pipenv run gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 app:app
解答
- 2022年11月10日-12日期间,大量Google Cloud Run用户反馈了相同的异常内存占用问题,属于平台级变更引发的问题。
- 根因:Google在此时间段对Cloud Run的运行时沙箱进行了版本更新,新沙箱的内存计量逻辑调整——原本未被计入应用配额的内核级内存(如部分系统库、容器运行时开销)被纳入统计,导致原本内存使用正常的应用触发超限告警。
- 临时修复方案:
- 如你已操作的,临时将Cloud Run服务的内存配额提升至512MB,可快速恢复服务正常运行。
- 调整gunicorn并发配置:将
--threads 8降低至--threads 4,减少并发线程数以降低峰值内存占用,部分场景下可在256MB配额内恢复服务。
- 长期优化方案:
- 关注Google Cloud状态公告,待平台完成沙箱计量逻辑的修复或优化后,可将内存配额调回原水平。
- 精简Docker镜像:移除镜像中不必要的依赖(如
openssh和git,部署完成后无需这些工具),减少运行时额外内存开销。优化后的Dockerfile示例:FROM python:3.9-alpine3.16 ENV APP_HOME /app ENV PIPENV_VENV_IN_PROJECT true ENV PIPENV_NOSPIN true WORKDIR $APP_HOME COPY . $APP_HOME COPY xiglogger $APP_HOME RUN pip install --upgrade setuptools RUN pip install pipenv \ && pipenv requirements > requirements.txt \ && pip install -r requirements.txt ENV PORT 8080 ENV PYTHONUNBUFFERED TRUE CMD pipenv run gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 4 --timeout 0 app:app
内容的提问来源于stack exchange,提问作者Hayden Eastwood
相关产品推荐
相关产品推荐

