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

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

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

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

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

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

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

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

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