• 请不要在回答技术问题时复制粘贴 AI 生成的内容
heavyrainn
V2EX  ›  程序员

Java 用 http 传输文件速度很慢,请问各位大神有什么好办法么

  •  1
     
  •   heavyrainn · Oct 19, 2021 · 6060 views
    This topic created in 1841 days ago, the information mentioned may be changed or developed.

    小弟正在用 java(kotlin)做一个基于 HTTP 的数据传输工具,部分情况可能会需要传输比较大的文件(大于 10G )。目前 server 端使用 commons-fileupload-1.4 包,client 端使用 httpclient 工具。测试下来发现虽然能传,但是速度非常慢,localhost 传输只有不到 20M/S 。请问各位这里有什么好的传输性能好的手段么?

    HTTP 传输为硬性条件,没办法使用 SFTP 、FTP 等其他传输协议,悲剧…

    27 replies  •  2021-10-22 16:24:46 +08:00
    thetbw
    thetbw
    Oct 19, 2021
    1
    多线程上传试试
    Zuckonit
    Zuckonit
    Oct 19, 2021
    2
    文件分块,然后在服务端组装
    heavyrainn
    heavyrainn
    OP
    Oct 19, 2021
    3
    @thetbw 请问有什么方案或者思路可以指导一下么?
    yukong
    yukong
    Oct 19, 2021
    4
    速度慢,先看看是不是硬件条件约束,百兆网卡的速度也就 20MB/s 左右,如果要传输大于 10G 的文件,网卡建议万兆起步,其次发现如果不是硬件条件导致速度慢,那么可以尝试多线程+file shard 上传从而尽量的跑满网卡的上限。
    BBCCBB
    BBCCBB
    Oct 19, 2021
    5
    多线程的意思就是:

    参考 http 协议里的 range , 将文件分位多段,上传后在服务器组装.
    thetbw
    thetbw
    Oct 19, 2021
    6
    @heavyrainn 下载的话 github 上就有好多多线程下载的,上传的话还真没碰见过
    kaneg
    kaneg
    Oct 19, 2021
    7
    可以查看一下几点:
    1. 下载还是上传?上传与下载带宽可能不对等
    2. 看服务端和客户端的 CPU 占用率
    3. 用其他工具来确认服务端和客户端直接的带宽是否只有 20M
    4. 是否文件读写是被磁盘速度限制。老一点的机械硬盘也就这个速度
    huangsen365
    huangsen365
    Oct 19, 2021
    8
    使用阿里云的 OSS 存储,js 方式的接口
    forgottencoast
    forgottencoast
    Oct 19, 2021
    9
    20MB/s 吗?挺快了吧,大部分人上网的实际的上传下载速度都到不了这个级别。
    ch2
    ch2
    Oct 20, 2021
    10
    http 可以并发上传的,range 了解一下
    FindHao
    FindHao
    Oct 20, 2021 via Android
    11
    先压缩再分块,客户端再解压缩
    msg7086
    msg7086
    Oct 20, 2021❤️1
    12
    我是头一次看到有人说 localhost 跑 20MB/s 挺快的。
    wangyu17455
    wangyu17455
    Oct 20, 2021
    13
    分块多线程上传
    xuanbg
    xuanbg
    Oct 20, 2021
    14
    @kaneg localhost 上传和网卡网络没关系,倒是和磁盘 IO 关系很大。我估计楼主是在老旧笔记本电脑上测试的吧

    建议楼主换两台好点的电脑,用个千兆网络测试一下。
    aru
    aru
    Oct 20, 2021
    15
    可能是你的硬盘比较慢吧,换个 ssd 试试
    unco020511
    unco020511
    Oct 20, 2021
    16
    分块后多线程呀
    lusi1990
    lusi1990
    Oct 20, 2021
    17
    很有可能是网络慢,和语言关系不大
    ungrown
    ungrown
    Oct 20, 2021
    18
    有人提到磁盘慢,IO 瓶颈确实是个关键因素,在你这个测试之中。
    建议先别进行磁盘读写,直接在内存中测试,看看数据块发送接收的速度,收到的数据直接丢掉不用保存。
    summer2019
    summer2019
    Oct 20, 2021 via iPhone
    19
    @forgottencoast localhost 啊,20M 快个鬼吧
    darknoll
    darknoll
    Oct 20, 2021
    20
    带宽是固定的,分不分块有什么区别?
    keakon
    keakon
    Oct 20, 2021
    21
    也可能是硬盘慢。。
    ikas
    ikas
    Oct 20, 2021
    22
    commons-fileupload-1.4 这种接收上传需要写临时文件,然后再复制..太多浪费性能的地方了

    前端直接用 js 发送 byte 数据.后端直接 inputstream 接收,直接写.
    你要更快,那就是自己分段发送
    aitaii
    aitaii
    Oct 20, 2021
    23
    抛开硬件谈优化的意义不大
    x940727
    x940727
    Oct 20, 2021
    24
    先确定到底是哪个限制了只有 20M 的速度,是硬盘吗?你可以直接把 10G 的文件全部加载到内存里面再传。
    lisongeee
    lisongeee
    Oct 20, 2021
    25
    使用 http3
    youxiachai
    youxiachai
    Oct 20, 2021
    26
    我觉得..没说用啥 io..讨论这个意义不大
    heavyrainn
    heavyrainn
    OP
    Oct 22, 2021
    27
    统一回复一下吧,因为我的场景是 localhost 传,可能我有一点没有说清楚,我 localhost 走下载方法的时候速度是可以达到 200M/S 的。所以并不是网络的问题。推测问题应该是我使用的 commons-fileupload-1.4 包上。用这个包的原因是,我使用 javalin 框架,javalin 框架的文件上传功能有问题,一旦数据过大会导致直接报内存爆炸报错。
    后来呢…后来我只好换了个框架,改成了 kotlin 自己的 ktor 框架,然后速度一下就飚上去了…ktor 写起来也挺舒服的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5262 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 132ms · UTC 02:50 · PVG 10:50 · LAX 18:50 · JFK 21:50
    ♥ Do have faith in what you're doing.