先把一次任务的时间线拆开

图片处理、生成或识别服务出现“一直转圈”,先核对请求是否成功提交、任务是否进入队列、执行进程是否接到任务,以及结果是否已经保存。页面等待的总时间可能跨越多个环节,需要分别记录提交、开始执行、结束和结果可取的时间。

用一个稳定的任务标识把这些记录串起来,再选取正常任务与异常任务比较。这样可以看清时间花在了哪里,也能判断是没有开始计算、计算过程中失败,还是后台已经完成而前端没有取回结果。

队列变长时,查看进入与处理的速度

先观察单位时间内新任务和完成任务的变化,再看执行进程、并发限制与实际资源占用。任务都在等待时,继续增加入口请求可能只会拉长队列;已经在执行却耗时异常,则要进一步查看模型调用、图片读取或外部接口。

对耗时差别明显的任务,可以评估分队列或分配不同执行资源,让处理顺序更符合业务需要。Celery 官方文档也讨论了长任务与短任务分配到不同 worker 的方式,并提醒为网络等 I/O 操作设置超时。[1] 具体配置仍应结合正在使用的任务系统。

调并发与批处理之前,先建立可比较的基准

挑选有代表性的图片尺寸、模型与参数,记录单任务耗时、资源占用和多任务运行时的变化。逐步调整并发,并同时观察等待时间、执行时间和失败情况。图片输入或模型不同,不能只凭一个测试样本决定整个服务的配置。

NVIDIA Triton 的动态批处理面向无状态模型,文档建议在可接受延迟内测量批量大小、等待时间与吞吐的关系。[2] 这是评估方法的参考。是否适合批处理,仍取决于当前模型、推理框架和业务对等待时间的要求。

失败后能恢复,也要避免重复处理

对超时、执行进程退出和结果保存失败,分别定义如何确认状态、是否重试,以及什么时候停止重试。重新执行之前先确认上次是否已经产生结果,避免同一业务请求反复生成、反复扣费或覆盖已有文件。

Celery 文档强调任务重复执行时的幂等性,并说明消息确认与重投行为受到配置和退出情形影响。[1] 因此,恢复方案需要结合实际队列验证。可以在测试环境模拟中断,检查任务状态、结果记录与重复提交的处理是否保持一致。

把处理结果可靠地交到用户手里

执行成功后继续确认文件存储、访问权限、结果地址和前端更新。前端可以展示有依据的等待、执行、完成或失败状态;尚无可靠进度时,避免让一个虚构的百分比代替任务状态。失败提示应让人知道可以重试还是需要进一步查看。

整条链路一起验:从提交一张图片,到收到可用结果,再覆盖重复点击、刷新页面和中途失败。保留任务标识、状态变化和错误原因,后续排查就能沿同一条记录追踪,而不必从“又卡住了”重新开始。