V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heavyrainn
V2EX  ›  程序员

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

  •  1
     
  •   heavyrainn · 46 天前 · 2845 次点击
    这是一个创建于 46 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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