Google Cloud Run缩容后扩容时为何不执行启动探针?
问题描述
我用Rust开发了一个部署在Google Cloud Run Docker容器中的服务端,核心逻辑如下:
- 接收低频请求后立即返回200状态码确认
- 异步执行后台任务,任务完成后发送回调请求
- 所有后台任务排队串行执行
- 任务运行期间,服务端会主动请求自身的
/ping端点以维持实例存活,避免Cloud Run将实例缩容至0 - 收到SIGINT信号时立即退出,该流程在测试阶段表现正常
Cloud Run配置
- 容器命令:
./server - 容器参数:
--port 8080 - 启动CPU增强:关闭
- 持续分配CPU:开启
- 执行环境:第二代
- 最小实例数:0
- 最大实例数:1
- 健康检查:默认TCP端口8080启动探针
异常现象
部署初期扩缩容流程正常,但闲置数小时后收到新请求时,实例无法从0正常扩容至1:
- 正常启动时,日志会显示启动探针成功等信息
- 闲置后扩容时,日志仅记录POST请求和
Container terminated on signal 4 - POST请求返回503服务不可用,必须重新部署才能恢复,数小时后问题会再次出现
排查疑点
- 无法理解为何触发SIGILL信号(信号4),且启动探针未执行
- 后台任务会使用AVX2和AVX512指令,但程序已做运行时平台支持性检查
- 服务端未输出请求处理前就会打印的
Monitor thread started.日志
未尝试的解决方案
- 切换至第一代实例
- 将TCP探针替换为HTTP探针
- 设置最小实例数为1以避免缩容
部署命令
gcloud run deploy my-service \ --image=europe-west2-docker.pkg.dev/my-service-398017/docker/my_service:${{ github.ref_name }} \ --region=europe-west2 \ --allow-unauthenticated \ --command=./server \ --args=--port,8080 \ --execution-environment=gen2 \ --min-instances=0 \ --max-instances=1 \ --cpu=8 \ --memory=4Gi \ --no-cpu-throttling
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

