Java 用 http 传输文件速度很慢,请问各位大神有什么好办法么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
heavyrainn
V2EX    程序员

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

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

    小弟正在用 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     Solana     3118 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 10:58 PVG 18:58 LAX 03:58 JFK 06:58
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86