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
相关产品推荐
相关产品推荐

