递归调用Flask API时IIS服务器偶发卡顿问题排查
问题:递归Ajax调用Flask API启动一分钟后出现卡顿
我用递归函数通过Ajax调用Flask API,多数时候运行正常,但启动约一分钟后会出现卡顿。大部分API请求耗时仅60-70毫秒,但偶尔会有请求耗时长达10.24秒,直接导致相机应用卡顿。
我一开始以为是代码问题,但在代码内部做了计时测试后,发现所有API的处理耗时稳定在60-70毫秒,所以推测卡顿出现在IIS服务器把请求转发到Flask API之前。
IIS服务器配置
配置文件路径:C:\Windows\System32\inetsrv\config\applicationHost.config
</fastCgi> ... <application fullPath="D:\aiml_python_code\yolov7-main\venv37\Scripts\python.exe" arguments="D:\aiml_python_code\yolov7-main\venv37\Lib\site-packages\wfastcgi.py" monitorChangesTo="" stderrMode="ReturnStdErrIn500" maxInstances="400" idleTimeout="2592000" activityTimeout="3000" requestTimeout="900000" instanceMaxRequests="200000" signalBeforeTerminateSeconds="0" protocol="NamedPipe" queueLength="100000" flushNamedPipe="false" rapidFailsPerMinute="1000" /> </fastCgi>
JavaScript递归函数代码
function api_Call() { cameraSensor.width = cameraView.videoWidth; cameraSensor.height = cameraView.videoHeight; cameraSensor.getContext("2d").drawImage(cameraView, 0, 0); let c = document.getElementById("cam_frame"); c.width = cameraView.videoWidth; c.height = cameraView.videoHeight; $.ajax({ type: "POST", headers: { 'Content-Type': 'application/json' }, dataType: "json", <!-- timeout: 1000, --> data: JSON.stringify({'image':cameraSensor.toDataURL("image/webp")}), url: "/flaskapi3/imagepred", success: function (response) { data = response['data']; c.src = "data:image/png;base64, "+data; api_Call(); }, error: function (err) { setTimeout(function () { api_Call(); }, 1000); } }); };
排查与解决建议
1. 调整IIS FastCGI配置参数
- 把
activityTimeout="3000"(3秒)改为10000(10秒):当前值过短,可能导致正常处理的请求被强制终止,引发后续队列阻塞 - 降低
idleTimeout="2592000"(30天)为300(5分钟):避免闲置过久的Python实例占用资源却无法高效响应新请求 - 启用IIS的FastCGI监视功能,实时查看实例数量、队列长度变化,确认是否有请求堆积
2. 优化JS请求逻辑
- 在成功回调中添加固定间隔,比如
setTimeout(api_Call, 30):避免无间隔发送请求,短时间内压垮IIS队列 - 取消注释并设置
timeout: 5000:防止长时间挂起的请求阻塞后续调用 - 修复未声明的全局变量:将
data = response['data']改为let data = response['data'],避免内存泄漏
3. 验证IIS与Flask的通信效率
- 尝试将FastCGI协议从
NamedPipe改为TCP:NamedPipe在高并发场景下容易出现管道阻塞问题,TCP可能更稳定 - 用工具抓取IIS和Flask之间的通信包,确认转发环节是否存在延迟
4. 检查系统资源状态
- 监控Python进程(Flask实例)的CPU、内存占用:排查是否有内存泄漏导致的性能下降
- 查看IIS工作进程的资源使用情况:确认是否存在CPU过载或内存不足的情况
内容的提问来源于stack exchange,提问作者Mogli141
相关产品推荐
相关产品推荐

