V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
yuedingwangji
V2EX  ›  Linux

Linux 如何快速拷大量文件, cp 是单进程的?

  •  
  •   yuedingwangji · 2018-11-28 00:21:05 +08:00 · 22242 次点击
    这是一个创建于 2213 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT,最近需要给服务器传一些图片,大概有 200 多 G,文件个数更加是不知道多少了,直接考虑先压缩文件夹在传,但是后来想了一下,图片压缩率太小了,而且这样压缩的时候也很长,到时放到服务器还得解压,感觉反而更慢了, 网上有些说可以在复制的时候用流来压缩,这方法还真没实际测试过,不知道怎么样,最后我还是用古老的 cp 来操作的, 操作的时候,我观察进程的 fd 发现,cp 进程居然每次只有 2 个文件符,一个指向源文件,一个指向目标文件, 这是不是就说明 cp 复制了单进程的,如果是的话,那 cp 复制也太慢了吧, 每次复制一个文件,那我 10 几 w 的文件要复制到什么时候呀,求 v2 大神科普

    59 条回复    2019-09-09 13:15:00 +08:00
    66450146
        1
    66450146  
       2018-11-28 00:24:57 +08:00
    多进程不见得更快,而且在出错的时候恢复现场更麻烦

    拷大量文件还是用 rsync 吧
    likuku
        2
    likuku  
       2018-11-28 00:53:40 +08:00
    移动硬盘全盘加密后直接快递 /人肉到 IDC,直接连服务器上对拷,当然也是要用 rsync,能断点续传,能显示进度
    likuku
        3
    likuku  
       2018-11-28 00:55:24 +08:00
    传输压缩?你图片若已经是 jpg,gif 之类已经被高度压缩过的图,那么传输压缩没啥卵用。
    JasonYo
        4
    JasonYo  
       2018-11-28 00:59:12 +08:00 via Android
    rsync
    wwqgtxx
        5
    wwqgtxx  
       2018-11-28 01:02:59 +08:00 via iPhone
    cp 是单线程的不是很正常么,哪个系统自带的复制是多线程的,而且在绝大部分情况下多线程复制反而会更慢
    congeec
        6
    congeec  
       2018-11-28 01:11:55 +08:00   ❤️ 1
    tar
    flynaj
        7
    flynaj  
       2018-11-28 01:26:23 +08:00 via Android
    rsync 后台慢慢来,这个瓶颈应该是你的网络上传速度,按家用带宽 4m 上行,一个小时 1g,最快也要 200 小时。
    yuedingwangji
        8
    yuedingwangji  
    OP
       2018-11-28 01:52:49 +08:00
    哈哈,我现在就是直接拷到硬盘硬盘,然后到机房那里去复制数据的,但感觉用 cp 真的好慢呀
    xeaglex
        9
    xeaglex  
       2018-11-28 01:58:27 +08:00
    那你自己用脚本异步执行 cp 不就好了
    ysc3839
        10
    ysc3839  
       2018-11-28 01:59:54 +08:00
    个人认为复制的瓶颈在于硬盘读写速度。如果你使用多进程复制,会导致硬盘在多个位置读写,速度会比顺序读写慢很多的。
    johnnie502
        11
    johnnie502  
       2018-11-28 02:38:56 +08:00
    先打包,不用压缩,比如用楼上的 tar,这样开销小,传的比较快
    dsnake1984
        12
    dsnake1984  
       2018-11-28 03:03:56 +08:00
    我用 cos/oss 花点钱 还是挺爽的
    ryd994
        13
    ryd994  
       2018-11-28 04:44:25 +08:00   ❤️ 15
    震惊,Linux 下最好用的复制命令居然不是 cp
    tar c -C /src/ | tar xv -C /dst/
    cp 慢主要是没有缓存还每文件一次 sync。这个 tar 命令实际上是利用 pipe buffer。
    另外,rsync 也可以用于本地,不妨试试
    ericgui
        14
    ericgui  
       2018-11-28 05:28:38 +08:00
    scp
    clino
        15
    clino  
       2018-11-28 07:38:01 +08:00
    上面用 tar 的方法应该是很好的,如果是远程我记得用 ssh 也能用管道
    hawhaw
        16
    hawhaw  
       2018-11-28 07:46:06 +08:00 via Android   ❤️ 1
    scp 走的是 ssh 性能会有损失,建议服务器直接 nc 开个口子接收数据再传给 tar 解压缩,客户端上用 tar 打包再扔给 nc 发给服务器( nc 开的那个口)
    congeec
        17
    congeec  
       2018-11-28 08:04:52 +08:00 via iPhone
    @hawhaw 这种方案必须保证链接够稳定,不会断掉。还是 rsync 通用
    crystone
        18
    crystone  
       2018-11-28 08:12:54 +08:00   ❤️ 1
    文件多就打包传啊,有没有压缩无所谓。如 ls 所言的
    l4ever
        19
    l4ever  
       2018-11-28 08:26:25 +08:00
    曾经花了一天时间从公司把 400G JPG,pdf 等资源用 rsync 上传到服务器上的路过.
    挂机放那里不管他呗.
    liangzi
        20
    liangzi  
       2018-11-28 08:34:44 +08:00 via Android
    rsync or Syncthing
    mamax
        21
    mamax  
       2018-11-28 08:41:10 +08:00
    图片是压缩率太大,搞反了
    yidinghe
        22
    yidinghe  
       2018-11-28 08:42:08 +08:00 via Android
    如果有几万甚至几十万小文件,打包再拷贝通常会更快
    zhongyiio
        23
    zhongyiio  
       2018-11-28 08:42:38 +08:00 via Android   ❤️ 2
    rsync -avzP ...,一定要考虑断点续传,就是这里的 P,否则网络一个闪断之类的就傻了
    smdbh
        24
    smdbh  
       2018-11-28 08:47:38 +08:00
    挂一晚就好了
    tnt666666
        25
    tnt666666  
       2018-11-28 08:52:19 +08:00 via Android
    瓶颈是 io,不是 cpu
    arrow8899
        26
    arrow8899  
       2018-11-28 09:10:38 +08:00
    这个跟你的网速或硬盘速度有关系吧,单线程多线程其实影响不大
    fcten
        27
    fcten  
       2018-11-28 09:15:20 +08:00
    随机读取大量小文件本来就很慢,多线程也没用
    xiaogui
        28
    xiaogui  
       2018-11-28 09:17:05 +08:00
    如果是大量碎小文件的话,推荐打成 tar 包 ,不要压缩,比如每个包 1 G,然后拷贝过去。
    aa514758835
        29
    aa514758835  
       2018-11-28 09:38:56 +08:00
    手写一个多线程的 cp,我记得之前写过,没几行
    pierre1994
        30
    pierre1994  
       2018-11-28 09:42:11 +08:00
    线程或进程过多,会有磁盘随机 IO 问题
    kernel
        31
    kernel  
       2018-11-28 09:52:59 +08:00
    @ericgui scp 200G 小文件要复制到明年
    liuxu
        32
    liuxu  
       2018-11-28 10:43:05 +08:00
    说真的,大文件邮寄硬盘更快,毕竟你有 100M 电信,最多也就 10M 上传
    zhongyiio
        33
    zhongyiio  
       2018-11-28 10:58:46 +08:00 via Android
    @kernel 联通 100m 带宽,上传速度能到 15MB/s,也就十几个小时吧
    omph
        34
    omph  
       2018-11-28 11:04:58 +08:00
    写个脚本,定量 tar 打包,然后网络流
    liwl
        35
    liwl  
       2018-11-28 11:08:16 +08:00
    瓶颈是带宽...不是 IO
    kernel
        36
    kernel  
       2018-11-28 11:12:54 +08:00
    @zhongyiio scp 和 rsync 不同。每复制一个文件要停一会。感觉是每复制一个文件都要断开新开一次连接。对于大量小文件效率比 rsync 低几十倍。
    TotoroSora
        37
    TotoroSora  
       2018-11-28 11:13:33 +08:00
    不管是硬盘对拷还是网络流,感觉都是先 tar 打包比较好
    likuku
        38
    likuku  
       2018-11-28 11:16:18 +08:00 via iPhone
    #13 @ryd994 tar 的办法,哈哈,想起来当年还不知道 rsync 时,硬盘对拷系统就这么用 tar 和管道来着
    liberize
        39
    liberize  
       2018-11-28 12:43:08 +08:00
    刚用 parsync 传了 800G 的数据到服务器,平均每个文件 10M 吧,瓶颈在上行带宽
    stebest
        40
    stebest  
       2018-11-28 14:50:14 +08:00
    @ryd994
    @zhongyiio

    @hawhaw
    到这里我想问下,如果使用 Samba 协议挂载远程目录到本地磁盘,然后使用 cp 命令和 rsync 命令,哪个快?
    Rekkles
        41
    Rekkles  
       2018-11-28 14:59:40 +08:00
    懒人的我通常都是打包 开个 80 端口 然后 wget
    msg7086
        42
    msg7086  
       2018-11-28 15:19:38 +08:00   ❤️ 1
    打包传用 tar,目录直传用 rsync。cp 是复制,但不是给你复制那么多文件用的。
    cp 是一个底层命令,也就是要做到「最简单」,「最不容易出问题」,要是做成多线程的话非让人打死不可。

    @stebest 要速度的话,rsync 几乎总是最快的。
    Gathaly
        43
    Gathaly  
       2018-11-28 17:14:26 +08:00
    tar | scp
    ryd994
        44
    ryd994  
       2018-11-28 19:43:09 +08:00 via Android
    @Gathaly 都 tar 了还 scp 干嘛
    tar cz -C /src/ | ssh user@host tar xzv -C /dst/
    还带压缩哦

    然后你会发现这么蛋疼还是 rsync 靠谱,毕竟能断点续传
    wanderpoet
        45
    wanderpoet  
       2018-11-28 19:47:17 +08:00 via iPhone
    @ryd994 #13 学习了
    qmake
        46
    qmake  
       2018-11-28 19:54:28 +08:00 via Android
    远程机器建一个稍微大一点的 lv 然后 dd 过去 如果要看进度的话 用 pv
    tanpengsccd
        47
    tanpengsccd  
       2018-11-28 21:32:17 +08:00 via iPhone
    学习了。
    cy97cool
        48
    cy97cool  
       2018-11-28 23:23:20 +08:00
    大量小文件推荐用 seaweedfs
    https://github.com/chrislusf/seaweedfs
    to store billions of files! to serve the files fast!
    SeaweedFS implements an object store with O(1) disk seek, and an optional Filer with POSIX interface.
    enjoyCoding
        49
    enjoyCoding  
       2018-11-28 23:34:40 +08:00 via iPhone
    可不可以拆成多个文件夹 多个窗口 cp ?
    timothyye
        50
    timothyye  
       2018-11-28 23:35:39 +08:00 via Android
    今天正好服务器搬家,rsync 又快又棒
    ymj123
        51
    ymj123  
       2018-11-28 23:56:56 +08:00 via Android
    单纯论速度 scp 比 rsync 快的,我实验过很多次。当然楼上说 rsync 有断点续传功能,那挺好。还有 scp 不能拷贝软链接,rsync 可以。你这个就 tar 打包,然后 scp 慢慢传吧。
    figo
        52
    figo  
       2018-11-29 00:43:51 +08:00
    老实点吧,作为过来人告诉你最稳定的办法就是先 tar 然后在 scp。
    WilliamHL
        53
    WilliamHL  
       2018-11-29 00:47:30 +08:00 via iPhone
    rsync 真的很好用
    scholar
        54
    scholar  
       2018-11-29 00:55:57 +08:00 via Android
    看看 phzip2 的介绍,这个压缩了可以调用多线程。我们计算数据都是 Gb 来的,用它压缩比 tar 压缩成 tar.gz 等都快,压缩率也高很多!但不确定你这小文件众多的情况
    ps1aniuge
        55
    ps1aniuge  
       2018-11-29 01:56:07 +08:00
    rsync 需要安装,若是 win,winscp 最简单。支持多线程。
    在选项===》传输===》后台里设定。
    具体多少线程,根据 **基本跑满服务器带宽,不怎么波动** 为准。
    noqwerty
        56
    noqwerty  
       2018-11-29 02:39:52 +08:00 via Android
    上次备份服务器用的是 rsync -avzhP --progress
    aa514758835
        57
    aa514758835  
       2018-11-29 08:40:55 +08:00
    手写多线程 cp,代码不多的
    realpg
        58
    realpg  
       2018-11-29 15:05:49 +08:00
    rsync,或者 tar 直接把流通过 tcp 传输
    lostsummer
        59
    lostsummer  
       2019-09-09 13:15:00 +08:00
    内网环境下,磁盘 IO 是瓶颈,单磁盘服务器多进程 /线程无意义,还可能是负分,rsync 是最佳选择。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3684 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.