项目中需要上传视频,一个视频150M左右,直传基本上都是上传失败,所以改成了切片上传,一个切片2M,这样上传一个视频就得发70多个请求。
业务中一般至少要同时上传3个视频左右,总共发送的请求在200多,3个视频传完,总耗时基本在4分钟左右。
随着请求数量的加多,单个上传切片的处理时间变得越来越长,有时候能达到2~3分钟才能处理一个切片请求。
部分请求历史
单个切片的请求
合并第一个文件,116M
合并第二个文件,116M
合并第三个文件,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
config/server.php
中的count
的数量,感觉没效果特来请教是配置不对,还是哪里有问题,上传很慢。
希望各位大佬多提建议,谢谢。
服务器带宽多少?这种重IO的,不是请求越多越好
公网带宽是200M的。
你这种重IO,就是Block住的进程的,开再多count也没用
打个比方,不严谨,最多同时能处理8个切片,再多就要排队处理,因为这是阻塞IO,要等其中一个处理完空处理才能继续处理后续切片,所以越往后的的越久,
webman上传 下载都不block进程,都是非阻塞的
有啥办法可以增大同时处理的切片数吗?cpu基本上处于闲置状态。
如果你本地网络上行带宽有瓶颈,同时处理多少分片都一样
我感觉应该不是带宽的问题,从http请求历史来看,请求从发送到结束,等待服务器处理的时间很长,服务器真正处理的时间就那几秒钟。
大部分的时间都是在等服务器处理。
弄个本地环境,上传到127.0.0.1:8787 试下
(我猜的,我不太确定)是不是和你开的webman的任务数量有关,如果你开的数量大于webman设置worker数量,多出来的部分应该是阻塞的。 或者硬盘速度?
webman任务数量是可以配置的吗?在哪配置?
看你写了 count 更改无效,我也不确定了,马克一下,等你解决方案 😁
可能是哪里限制网速,比如你是电信100M带宽,那么上行带宽实际只有1.25MB/s,上传三个150MB的文件,确实需要4分钟时间。
应该不会,这是服务器,云服务商应该不会限速。
有可能,通常上下行不对称的,这个普遍存在。我们通常说的“100M”是指下行带宽。
我说的不是云服务商限速,我说是你家庭或者办公室网络服务商。比如你在家里上传,你家庭宽带是100Mbit,上行带宽会被运营商限制成1.25MB。上传150M的文件,最快也要需要2分钟。
你试下直接scp或者ftp文件上传到服务器看要多久
还有,浏览器也有并发限制,70个请求会排队分批处理,并不是真的并发一起发起请求。
这种切片的任务不是一般都异步队列后台处理么? 你这么在前台等不是个事. 我们的切片java做的 效率也不高
这个文件上传是表单的一部分,最耗时的就是文件上传,做异步队列反而麻烦了。
本地搭建服务器 测试一下。
这样可以排除网络问题。
不是网络的问题,就是分片时,请求太多,服务器要排队处理。
正常上传150M的东西也不算很大 应该不会传不成功。