本文为您介绍访问服务调用返回的状态码和常见报错。
状态码说明
状态码 | 说明 |
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}
错误类型2:{"detail":"Not Found"}
错误类型3:调用 BladeLLM 的 /v1/models
接口,返回404: Not Found
。
错误类型4:在线调试页面返回 404,无其它信息。
错误类型5:API调用ComfyUI返回404 not found page
。
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
服务器作为网关或代理,但是没有及时从上游服务器收到请求。这通常意味着模型推理耗时过长。解决方法:
在调用代码中,主动延长HTTP请求的超时时间。
对于耗时很长的任务,建议改用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”:
请如下排查:
查看实例状态,如实例已停止,重启服务即可。
如服务处于运行中状态,可能是实例运行时资源不足,如CPU、内存和显存被过度占用,导致没有足够的缓冲余量。
当资源类型为公共资源时,建议稍后在非高峰时段再尝试调用,或更换其他资源规格和地域。
当资源类型为专属资源(EAS资源组)时,确保专属资源组为实例预留足够的CPU、内存和显存(建议至少保留20%空闲资源作为缓冲)。
还有一种比较常见的场景是,服务部署完成后状态为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 file或Write 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 Processor的Request Body采用非明文的protobuf格式。目前在线调试仅支持明文的文本格式输入,因此该服务暂时无法在控制台上直接进行在线调试。您可以使用EAS配套提供的SDK来进行请求访问,各语言版本SDK可参考:服务调用SDK。