You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Flask/Gunicorn的大文件上传提速方案咨询

问题分析与优化方案

一、关于增加vCPU的作用

增加vCPU对当前上传慢的问题几乎没有帮助。你遇到的瓶颈是磁盘写入IO速度、网络传输效率或请求处理的同步阻塞逻辑,而非CPU计算资源不足。

二、具体优化措施

1. 优化磁盘写入性能

  • 升级磁盘类型:AWS Lightsail默认磁盘若为机械硬盘,立即换成SSD磁盘。SSD的连续写入速度比机械盘高数倍,能直接缩短file.save()的耗时。
  • 异步化文件写入:当前请求流程中同步写入磁盘会阻塞响应,可改为先将文件读入内存,再把内容交给Celery异步写入磁盘,让请求快速返回:
    # 替换原有的file.save(upload_path)
    file_content = file.read()
    # 将文件内容传给Celery任务,由后台处理保存和解析
    process_xml_file.delay(nome_xml, file_content, 'testuser', id_evento_db)
    
    Celery任务中完成磁盘写入:
    @celery.task
    def process_xml_file(nome_xml, file_content, user, evento_id):
        upload_path = os.path.join(app.config['UPLOAD_PATH'], nome_xml)
        with open(upload_path, 'wb') as f:
            f.write(file_content)
        # 后续XML处理逻辑...
    

2. 调整Nginx上传配置

让Nginx先接收完整文件再转发给Flask,避免Flask进程被长时间占用:

client_max_body_size 500M; # 对应Flask的MAX_CONTENT_LENGTH
client_body_buffer_size 10M; # 设置缓冲区,大文件会先写到临时文件
client_body_temp_path /tmp/nginx_upload_temp; # 指定临时目录,建议放在SSD上

3. 优化Flask与Gunicorn运行配置

  • 改用异步Worker:因为你的视图用了async def,搭配Uvicorn Worker提升异步请求处理能力,避免单文件上传阻塞其他请求:
    gunicorn -w 4 -k uvicorn.workers.UvicornWorker your_app:app
    
  • 合理设置Worker数:基于2vCPU,设置worker数为4(2核*2),在内存允许的前提下提升并发处理能力。

4. 减少上传前的阻塞操作

  • 将数据库查重逻辑移到Celery任务中:当前上传前同步查询数据库exists = db.session.query(...),若数据库查询慢会拖慢流程,交给后台任务处理即可。
  • 给XML.xml字段添加索引:如果必须保留上传前查重,给该字段加索引能大幅加快查询速度。

5. 网络层面优化

  • 检查Lightsail实例带宽:若实例带宽不足(比如基础版仅1-5Mbps),升级带宽套餐;同时确保客户端与实例在同一AWS区域,减少跨区域传输延迟。
  • 启用HTTP/2:在Nginx配置中开启HTTP/2,提升大文件传输效率:
    listen 443 ssl http2;
    

内容的提问来源于stack exchange,提问作者Kabllez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:52:55