webman大文件切片上传,很慢

mine

问题描述

项目中需要上传视频,一个视频150M左右,直传基本上都是上传失败,所以改成了切片上传,一个切片2M,这样上传一个视频就得发70多个请求。
业务中一般至少要同时上传3个视频左右,总共发送的请求在200多,3个视频传完,总耗时基本在4分钟左右。
随着请求数量的加多,单个上传切片的处理时间变得越来越长,有时候能达到2~3分钟才能处理一个切片请求。

  1. 部分请求历史
    部分请求历史

  2. 单个切片的请求
    单个切片的请求

  3. 合并第一个文件,116M
    合并第一个文件,116M

  4. 合并第二个文件,116M
    合并第二个文件,116M

  5. 合并第三个文件,152M
    合并第三个文件,152M

服务器是8核16G,config/server.php中的count配置的是cpu_count() * 2,在上传文件时,我看了下服务器的负载,只有两个进程的cpu占用在2%多一点,其他的全是0。

项目已经做了nginx代理

upstream webman {
    server 127.0.0.1:8787;
    keepalive 10240;
}

server
{
    listen 80;
    server_name aaa.ccc;
    index index.php index.html index.htm default.php default.htm default.html;
    root /app/webman/public;

    location /api/ {
      add_header Access-Control-Allow-Origin *;
      add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE ,OPTIONS';
      add_header Access-Control-Allow-Headers 'DNT,Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization,token';

      if ($request_method = 'OPTIONS') {
          return 204;
      }
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $host;
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_pass http://webman/;
      client_max_body_size 200M;
    }

   ...
   其他配置省略
}

PHP版本:8.0.22,已经开启opcache
webman版本:1.4.8

为此你搜索到了哪些方案及不适用的原因

  1. 尝试过增加单个切片的大小,从而减少请求的数量,但总耗时差不多
  2. 尝试增加config/server.php中的count的数量,感觉没效果

特来请教是配置不对,还是哪里有问题,上传很慢。
希望各位大佬多提建议,谢谢。

1405 6 1
6个回答

nitron

服务器带宽多少?这种重IO的,不是请求越多越好

  • mine 2022-10-21

    公网带宽是200M的。

  • nitron 2022-10-21

    你这种重IO,就是Block住的进程的,开再多count也没用
    打个比方,不严谨,最多同时能处理8个切片,再多就要排队处理,因为这是阻塞IO,要等其中一个处理完空处理才能继续处理后续切片,所以越往后的的越久,

  • six 2022-10-21

    webman上传 下载都不block进程,都是非阻塞的

  • mine 2022-10-21

    有啥办法可以增大同时处理的切片数吗?cpu基本上处于闲置状态。

  • six 2022-10-21

    如果你本地网络上行带宽有瓶颈,同时处理多少分片都一样

  • mine 2022-10-21

    我感觉应该不是带宽的问题,从http请求历史来看,请求从发送到结束,等待服务器处理的时间很长,服务器真正处理的时间就那几秒钟。
    大部分的时间都是在等服务器处理。

  • six 2022-10-21

    弄个本地环境,上传到127.0.0.1:8787 试下

缝合

(我猜的,我不太确定)是不是和你开的webman的任务数量有关,如果你开的数量大于webman设置worker数量,多出来的部分应该是阻塞的。 或者硬盘速度?

  • mine 2022-10-21

    webman任务数量是可以配置的吗?在哪配置?

  • 缝合 2022-10-24

    看你写了 count 更改无效,我也不确定了,马克一下,等你解决方案 😁

six

可能是哪里限制网速,比如你是电信100M带宽,那么上行带宽实际只有1.25MB/s,上传三个150MB的文件,确实需要4分钟时间。

  • mine 2022-10-21

    应该不会,这是服务器,云服务商应该不会限速。

  • liziyu 2022-10-21

    有可能,通常上下行不对称的,这个普遍存在。我们通常说的“100M”是指下行带宽。

  • six 2022-10-24

    我说的不是云服务商限速,我说是你家庭或者办公室网络服务商。比如你在家里上传,你家庭宽带是100Mbit,上行带宽会被运营商限制成1.25MB。上传150M的文件,最快也要需要2分钟。
    你试下直接scp或者ftp文件上传到服务器看要多久

  • six 2022-10-24

    还有,浏览器也有并发限制,70个请求会排队分批处理,并不是真的并发一起发起请求。

Gin

这种切片的任务不是一般都异步队列后台处理么? 你这么在前台等不是个事. 我们的切片java做的 效率也不高

  • mine 2022-10-22

    这个文件上传是表单的一部分,最耗时的就是文件上传,做异步队列反而麻烦了。

hongs

本地搭建服务器 测试一下。
这样可以排除网络问题。

  • mine 2022-10-31

    不是网络的问题,就是分片时,请求太多,服务器要排队处理。

hongs

正常上传150M的东西也不算很大 应该不会传不成功。

  • 暂无评论
年代过于久远,无法发表回答
🔝