小弟正在用 java(kotlin)做一个基于 HTTP 的数据传输工具,部分情况可能会需要传输比较大的文件(大于 10G )。目前 server 端使用 commons-fileupload-1.4 包,client 端使用 httpclient 工具。测试下来发现虽然能传,但是速度非常慢,localhost 传输只有不到 20M/S 。请问各位这里有什么好的传输性能好的手段么?
HTTP 传输为硬性条件,没办法使用 SFTP 、FTP 等其他传输协议,悲剧…
小弟正在用 java(kotlin)做一个基于 HTTP 的数据传输工具,部分情况可能会需要传输比较大的文件(大于 10G )。目前 server 端使用 commons-fileupload-1.4 包,client 端使用 httpclient 工具。测试下来发现虽然能传,但是速度非常慢,localhost 传输只有不到 20M/S 。请问各位这里有什么好的传输性能好的手段么?
HTTP 传输为硬性条件,没办法使用 SFTP 、FTP 等其他传输协议,悲剧…
|
thetbwOct 19, 2021
1
多线程上传试试
|
|
ZuckonitOct 19, 2021
2
文件分块,然后在服务端组装
|
|
3
@thetbw 请问有什么方案或者思路可以指导一下么?
|
|
yukongOct 19, 2021
4
速度慢,先看看是不是硬件条件约束,百兆网卡的速度也就 20MB/s 左右,如果要传输大于 10G 的文件,网卡建议万兆起步,其次发现如果不是硬件条件导致速度慢,那么可以尝试多线程+file shard 上传从而尽量的跑满网卡的上限。
|
|
BBCCBBOct 19, 2021
5
多线程的意思就是:
参考 http 协议里的 range , 将文件分位多段,上传后在服务器组装. |
|
thetbwOct 19, 2021
6
@heavyrainn 下载的话 github 上就有好多多线程下载的,上传的话还真没碰见过
|
|
kanegOct 19, 2021
7
可以查看一下几点:
1. 下载还是上传?上传与下载带宽可能不对等 2. 看服务端和客户端的 CPU 占用率 3. 用其他工具来确认服务端和客户端直接的带宽是否只有 20M 4. 是否文件读写是被磁盘速度限制。老一点的机械硬盘也就这个速度 |
|
huangsen365Oct 19, 2021
8
使用阿里云的 OSS 存储,js 方式的接口
|
|
forgottencoastOct 19, 2021
9
20MB/s 吗?挺快了吧,大部分人上网的实际的上传下载速度都到不了这个级别。
|
|
ch2Oct 20, 2021
10
http 可以并发上传的,range 了解一下
|
|
FindHaoOct 20, 2021 via Android
11
先压缩再分块,客户端再解压缩
|
|
12
我是头一次看到有人说 localhost 跑 20MB/s 挺快的。
|
|
wangyu17455Oct 20, 2021
13
分块多线程上传
|
|
xuanbgOct 20, 2021
14
|
|
aruOct 20, 2021
15
可能是你的硬盘比较慢吧,换个 ssd 试试
|
|
unco020511Oct 20, 2021
16
分块后多线程呀
|
|
lusi1990Oct 20, 2021
17
很有可能是网络慢,和语言关系不大
|
|
ungrownOct 20, 2021
18
有人提到磁盘慢,IO 瓶颈确实是个关键因素,在你这个测试之中。
建议先别进行磁盘读写,直接在内存中测试,看看数据块发送接收的速度,收到的数据直接丢掉不用保存。 |
|
summer2019Oct 20, 2021 via iPhone
19
@forgottencoast localhost 啊,20M 快个鬼吧
|
|
darknollOct 20, 2021
20
带宽是固定的,分不分块有什么区别?
|
|
keakonOct 20, 2021
21
也可能是硬盘慢。。
|
|
ikasOct 20, 2021
22
commons-fileupload-1.4 这种接收上传需要写临时文件,然后再复制..太多浪费性能的地方了
前端直接用 js 发送 byte 数据.后端直接 inputstream 接收,直接写. 你要更快,那就是自己分段发送 |
|
aitaiiOct 20, 2021
23
抛开硬件谈优化的意义不大
|
|
x940727Oct 20, 2021
24
先确定到底是哪个限制了只有 20M 的速度,是硬盘吗?你可以直接把 10G 的文件全部加载到内存里面再传。
|
|
lisongeeeOct 20, 2021
25
使用 http3
|
|
youxiachaiOct 20, 2021
26
我觉得..没说用啥 io..讨论这个意义不大
|
|
27
统一回复一下吧,因为我的场景是 localhost 传,可能我有一点没有说清楚,我 localhost 走下载方法的时候速度是可以达到 200M/S 的。所以并不是网络的问题。推测问题应该是我使用的 commons-fileupload-1.4 包上。用这个包的原因是,我使用 javalin 框架,javalin 框架的文件上传功能有问题,一旦数据过大会导致直接报内存爆炸报错。
后来呢…后来我只好换了个框架,改成了 kotlin 自己的 ktor 框架,然后速度一下就飚上去了…ktor 写起来也挺舒服的 |