线上接收附件回调超时排查复现

问题概述

线上环境收到多起关于文件上传及合同归档功能响应缓慢甚至超时的反馈。具体表现为:在执行包含多个大文件(约40MB/个)的上传操作时,接口响应时间极长,查看php-fpm日志和慢查询日志可以看到executing too slow (34.738390 sec), logging
WARNING:[pool www] child 4545... execution timed out (104.745266 sec)

堆栈追踪

堆栈信息清晰地指向了文件处理与OSS上传阶段。
[0x00007f8661e15880] curl_exec() /.../vendor/aliyuncs/oss-sdk-php/src/OSS/Http/RequestCore.php:844
[0x00007f8661e15160] putFile() /.../vendor/topthink/framework/src/think/filesystem/Driver.php:104
[0x00007f8661e14ec0] createData() /.../File.php:249

深度排查与根因定位

在排除内存溢出因素后,我们对上传耗时进行了分段测试,结果如下:

OSS上传耗时:约20秒/个文件(主要瓶颈)

带宽测算

单个文件大小约40MB,上传耗时20秒。

计算公式:

Speed=40 MB20 s=2 MB/sSpeed=20 s40 MB​=2 MB/s

Bandwidth=2 MB/s×8=16 MbpsBandwidth=2 MB/s×8=16 Mbps

结论

服务器的公网带宽上限约为15-20Mbps。当单次请求并发上传5个文件(总大小约200MB)时,带宽被瞬间占满,导致物理传输极限被锁定在2MB/s。

总耗时计算:

Total_Time=5×20s=100sTotal_Time=5×20s=100s

虽然104秒超过PHP设置的100秒阈值,线上设置的阈值就是100。

方案

方案一:启用OSS内网上传(强烈推荐)

若应用服务器与OSS Bucket位于同一地域(如均为华东1-杭州),应强制使用内网Endpoint进行通信。

  • 优势:内网传输不占用公网带宽,速度可达千兆级,且免流量费。
  • 预期效果:单文件上传耗时将从20秒降低至1秒以内。
  • 配置修改 :修改config/filesystem.php中的endpoint配置。

方案二:调整超时配置(兜底方案)

若必须维持现有的并发上传逻辑,需调整服务端超时配置以适应低带宽环境。

  • PHP-FPMrequest_terminate_timeout = 300
  • Nginxfastcgi_read_timeout = 300
  • 注意:此方案仅能防止报错,无法提升用户体验,且会长时间占用服务器进程资源。

方案三:异步上传队列

若必须维持现有的并发上传逻辑,需要修改上传为异步队列处理,不限制时间。

相关推荐
keyipatience1 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao1 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
weixin_408099671 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
爱喝水的鱼丶2 小时前
SAP-ABAP:ALV通用封装实践——搭建可复用的ALV开发工具类,减少80%重复代码
开发语言·性能优化·sap·abap·erp·alv
脱胎换骨-军哥2 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
songroom2 小时前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust
kebeiovo2 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang
迷途呀3 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
Herbert_hwt3 小时前
建立Java程序开发
java·开发语言
愚公移码4 小时前
蓝凌EKP18产品:流程虚拟机(PVM)
java·开发语言·前端