附录:服务状态码与常见报错

本文为您介绍访问服务调用返回的状态码和常见报错。

状态码说明

状态码

说明

200

服务正常返回。

400

请求体(Body)格式错误或自定义Processor代码异常。

说明

对于自定义Processor,如果代码抛出异常,会在服务端返回状态码400。建议在自定义Processor中指定返回其他状态码,以区分代码异常。

401

服务鉴权失败。详情见401 Authorization Failed

404

找不到服务。详情见404 Not Found

405

方法不被允许。比如服务器只支持GET请求,却发送了POST请求就会返回405。尝试更换请求方法。

408

请求计算超时。服务端为每个请求配置了默认的超时时间(默认为5秒,您可以在创建服务JSON文件中配置metadata.rpc.keepalive字段来调整超时时间),当单个请求的处理时长超过metadata.rpc.keepalive字段配置的值后,服务端会返回状态码408,来中断该请求的处理,并断开该请求所在的TCP连接。

说明

单个请求的处理时长包含Processor的计算时间、请求接收网络数据包时间以及单个请求在队列中排队的时间。

429

请求触发限流。EAS提供了基于QPS的限流功能,您可以在创建服务JSON文件中配置metadata.rpc.rate_limit字段开启该功能。开启限流功能后,如果请求并发数超出了指定限制后,超出的部分请求会被丢弃并返回状态码429。

450

超出队列长度丢弃请求

499

客户端主动断开连接。当客户端主动断开连接时,客户端不会接收到状态码499,该连接上未处理完成的请求会在服务端记录一个状态码499。例如:在客户端配置了HTTP超时时间为30毫秒,服务端的处理延时为50毫秒,客户端等待30毫秒后未获取到返回结果时,会放弃该请求,并主动断开连接,此时在服务端监控中,会出现状态码499。

500

服务器内部错误。服务器遇到错误,无法完成请求。

501

尚未实施。服务器作为网关或代理,从上游服务器收到无效响应。

502

错误网关。服务器作为网关或代理,从上游服务器收到无效响应。

503

服务不可用。通过网关访问服务时,如果后端服务实例状态全部为非Ready,则网关会返回状态码503。详见503 no healthy upstream

504

网关超时。详见504 timeout

505

HTTP版本不受支持。服务器不支持请求中所用的HTTP协议版本。

常见报错

404 Not Found

404 错误通常由无效的请求路径、错误的请求体或服务不支持该接口导致。请根据收到的具体错误信息,参考以下场景进行排查。

错误类型1:{"object":"error","message":"The model `` does not exist.","type":"NotFoundError","param":null,"code":404}

问题原因:调用vLLM部署的服务/v1/chat/completions 接口时,请求体中model参数值为空或无效。

image

解决方案:model的参数值须为正确的模型名称,可通过v1/models接口查询。

错误类型2:{"detail":"Not Found"}

问题原因:请求路径不完整或错误。例如,调用LLM服务对话接口,未在基础地址后添加v1/chat/completions

image

解决方案:确保 API 请求路径完整且正确。对于LLM服务,请参见LLM调用

错误类型3:调用 BladeLLM 的 /v1/models 接口,返回404: Not Found

问题原因:BladeLLM部署的服务不支持v1/models接口。

image

解决方案:请查阅BladeLLM服务调用参数配置说明获取其支持的接口列表。

错误类型4:在线调试页面返回 404,无其它信息。

问题原因:请求路径错误。如在线调试时,基础地址通常是 http://123***.cn-hangzhou.pai-eas.aliyuncs.com/predict/服务名。错误地修改或删除了 服务名会导致 404。

image

解决方案:在线调试时,通常不需要删除或修改默认提供的地址,仅追加需要调用的具体API路径。

错误类型5:API调用ComfyUI返回404 not found page

问题原因:通过 API 调用Serverless 版本的 ComfyUI 服务 ,该版本不支持 API调用。

解决方案:部署标准版或者API版,详情请参见AI视频生成-ComfyUI部署

400 Bad Request

请求体(Body)格式错误。请仔细检查请求体格式(如JSON结构)、字段名、数据类型是否正确。

401 Authorization Failed

访问服务时Token未指定、不正确或使用方式错误。请检查:

  • Token是否正确。服务概览页面,在基本信息区域单击查看调用信息

    说明

    鉴权Token默认后台自动生成,也可以通过自定义鉴权指定Token,并支持在服务更新时修改Token。

  • Token是否正确设置。

    • 使用curl命令,添加在HTTP请求头的Authorization字段中。例如:curl -H 'Authorization: NWMyN2UzNjBiZmI2YT***' http:// xxx.cn-shanghai.aliyuncs.com/api/predict/echo

    • 在使用SDK访问服务时,调用对应的SetToken()函数,详情请参见Java SDK使用说明

504 timeout

服务器作为网关或代理,但是没有及时从上游服务器收到请求。这通常意味着模型推理耗时过长。解决方法:

  1. 在调用代码中,主动延长HTTP请求的超时时间。

  2. 对于耗时很长的任务,建议改用EAS的 队列服务(异步调用) 模式,它可以处理批量或长时间运行的推理任务。

450 超出队列长度丢弃请求

服务端的计算实例在接收到请求后,会先将请求放入队列中进行排队。当实例中的worker(worker数量默认为5,您可以在创建服务JSON文件中配置metadata.rpc.worker_threads字段来调整worker数量)空闲时,会从队列中获取数据进行计算。当worker计算时间过长,导致队列中请求堆积。当队列打满时(队列长度默认为64,您可以在创建服务JSON文件中配置metadata.rpc.max_queue_size字段来调整队列长度),新来的请求会直接被拒绝,并返回状态码450,来避免队列过度堆积导致所有请求RT越来越高最终服务不可用。

说明

队列限长在一定程度上也是一种限流保护,避免大流量导致服务雪崩。

处理方法

  • 当返回的状态码有少量450时,因为服务端的实例是相互独立的,您可以通过重试调度到其他相对空闲的实例上,避免客户端感知,但不能无限重试,否则限流的保护作用会失效。

  • Processor内部代码卡住时,所有请求均返回状态码450。当所有worker在处理请求时出现死锁等场景,导致没有worker从队列中获取数据进行处理,这种场景需要排查Processor代码的Bug。

503 no healthy upstream

在线调试时报错,错误码为503,错误提示为“no healthy upstream”:

image

请如下排查:

  1. 查看实例状态,如实例已停止,重启服务即可。

  2. 如服务处于运行中状态,可能是实例运行时资源不足,如CPU、内存和显存被过度占用,导致没有足够的缓冲余量。

    • 当资源类型为公共资源时,建议稍后在非高峰时段再尝试调用,或更换其他资源规格和地域。

    • 当资源类型为专属资源(EAS资源组)时,确保专属资源组为实例预留足够的CPU、内存和显存(建议至少保留20%空闲资源作为缓冲)。

  3. 还有一种比较常见的场景是,服务部署完成后状态为Running,且服务各实例状态均为Ready,但发起请求后触发了代码中的Bug,导致后端服务实例Crash,从而无法正常响应请求,此时网关会向客户端返回状态码503。请结合日志修复Bug。

curl调用报错no URL specified

使用如下命令发起请求后报错no URL specified

curl -X http://17****.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/service_name/**path** \
-H "Content-Type: application/json" \
-H "Authorization: **********==" \
-d '{"***":"****"}'

原因:curl命令使用了-X参数,但缺少了POST

调用返回ASCII 编码

可参考如下示例修改代码:

from flask import Flask, Response

@app.route('/hello', methods=['POST'])
def get_advice(): 
    result = "result"
    return Response(result, mimetype='text/plain', charset='utf-8')

服务日志中出现[WARN] connection is closed: End of fileWrite a Invalid stream: End of file,如何解决?

客户端与服务端之间的连接断开,服务端在向该连接中回写请求结果时,发现连接已断开后所打的warning日志,连接断开一般分两种情况:

  • 服务端超时断开连接:在Processor模式下,服务端默认超时时间为5秒,您可以通过服务的metadata.rpc.keepalive参数来修改。在超时时间到达后,服务端将关闭该连接,并在服务端的监控中记录一个408状态码。

  • 客户端超时断开连接:客户端的超时时间由您的调用端代码中设置的超时时间决定。因超时未返回HTTP响应,客户端会主动断开连接,此时服务端的监控记录中会记录一个499状态码。

upstream connect error or disconnect/reset before headers. reset reason: connection termination

通常是由于长连接超时导致请求失败或实例负载不均衡等问题引起。服务端的处理超过客户端配置的HTTP超时时间后,客户端会放弃该请求,主动断开连接,此时服务端监控会出现状态码499,可以查看监控指标进一步确认。对于推理耗时较长的情况,建议部署异步推理服务

Tensorflow/Pytorch processor部署的服务请求在线调试失败,如何解决?

出于性能考虑,TensorFlow/PyTorch ProcessorRequest Body采用非明文的protobuf格式。目前在线调试仅支持明文的文本格式输入,因此该服务暂时无法在控制台上直接进行在线调试。您可以使用EAS配套提供的SDK来进行请求访问,各语言版本SDK可参考:服务调用SDK