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

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

  •  1
     
  •   heavyrainn · 2021-10-19 19:37:15 +08:00 · 4452 次点击
    这是一个创建于 891 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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