You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Cloud Run两实例REST通信延迟问题排查求助

问题描述

我有两个通过REST API通信的Google Cloud Run实例:基于NodeJS的微服务MS1和基于Python的微服务MS2。MS1通过axios POST请求向MS2发送数据,MS2处理后通过requests POST将结果返回给MS1。当MS1发送大量请求时,MS2接收数据出现严重延迟,部分场景延迟达150秒。

已完成的排查:

  • MS2冷启动时间约10秒,远低于观测到的延迟
  • 已增加实例数,排除了高负载时实例扩容限制

现附上MS2的Dockerfile和代码片段,恳请指导排查方向。


更新1:MS2的Dockerfile

FROM ubuntu:20.04

RUN apt-get update
RUN apt-get install -y python3-dev 
RUN apt-get install -y python3-pip
RUN apt-get install -y python3-venv
RUN apt-get install -y python3-six

RUN python3 -m pip install Flask==2.2.3
RUN python3 -m pip install waitress==2.1.2
RUN python3 -m pip install numpy==1.24.2
RUN python3 -m pip install pandas==1.5.3
RUN python3 -m pip install matplotlib==3.7.1
RUN python3 -m pip install requests==2.28.2
RUN python3 -m pip install protobuf==3.19.0

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "python3", "run.py" ]

更新2:MS2的代码片段

from flask import Flask, request, jsonify
from waitress import serve
import pandas as pd
import time
import logging
import json
import internal_function_1
import internal_function_2
import internal_function_3
import os
import requests

# Flask constructor takes the name of
# current module (__name__) as argument.
app = Flask(__name__)

@app.route('/start', methods=['POST'])
# ‘/’ URL is bound with hello_world() function.
def start():
    # process the data received 
    json_data = process_input()
    
    target_endpoint = "MS1/endpoint"
    headers = {'Content-Type': 'application/json'}
    response = requests.post(url=target_endpoint,
                             data=json_data, headers=headers)
                             
    return json_data

排查方向建议
  • 请求阻塞问题:当前MS2处理完数据后,同步调用MS1的接口,若MS1处于高负载状态,会导致MS2的请求线程被长时间占用,无法及时处理新请求。建议改用异步方式发送请求到MS1(比如用aiohttp替代requests,或把回调任务放入消息队列)。
  • 核心处理函数性能:process_input()是请求处理的核心,大量请求下若存在计算密集型操作、IO阻塞(如文件读写、数据库查询),会严重拖慢单请求处理时间。给这个函数添加详细的计时日志,统计每一步耗时,定位瓶颈。
  • 服务器配置优化:当前未显式配置Waitress的线程数、连接数等参数,默认配置可能无法应对高并发,导致请求排队。建议显式设置参数,比如:
    serve(app, host='0.0.0.0', port=8080, threads=10)
    
  • 资源限制检查:查看Cloud Run实例的CPU和内存配置是否足够。若分配的资源不足,处理pandas这类计算密集型任务时会卡顿,可以临时调高资源配置测试延迟是否改善。
  • 请求体大小排查:若MS1发送的POST请求体过大,会增加网络传输和MS2的解析耗时。检查请求体大小,考虑分块传输或压缩数据。
  • 日志与监控细化:在MS2的关键节点(请求接收、process_input开始/结束、请求发送到MS1)添加毫秒级计时日志,结合Cloud Run的监控指标(CPU使用率、请求队列长度、响应时间分布),定位延迟发生的具体阶段。
  • 冗余依赖清理:检查matplotlib等非必要依赖是否在运行时被加载,这类库初始化可能占用资源。若process_input中未用到,可从Dockerfile中移除,减少镜像大小和资源占用。

内容的提问来源于stack exchange,提问作者KK2491

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:05:41