如何并行化dd?

Kar*_*ter 11 linux dd parallelism

我目前在使用dd稀疏文件作为输入 ( if) 和文件作为输出 ( of)调用时遇到问题conv=sparsedd似乎只使用 CPU 的一个内核(Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4 个内核 + 4 个英特尔超线程)(100% 的 1 个内核),所以我一直想知道是否可以并行化dd. 我一直

  • 寻找到info ddman dd而且似乎内置功能corutils 8.23版本
  • sgp_ddsg3-utils包中检查(不了解它是否适​​合我的需要),但它似乎无法处理稀疏文件
  • dcfldd 似乎没有并行化能力

AFAIK

  • 在多线程中内部处理程序部分的增强版本/分支(避免上下文更改杀死 I/O 性能)优于
  • parallel本地运行GNU 的解决方案优于
  • 自定义(可能未经测试)代码片段

如何避免 CPU 成为 I/O 密集型操作的瓶颈?我想在带有 Linux 3.13 的 Ubuntu 14.04 上运行该命令,并在任何支持稀疏文件的文件系统上使用它处理稀疏文件磁盘映像(至少该解决方案不应绑定到一个特定的文件系统)。

背景:我正在尝试在 zfs(zfsonlinux 0.6.4 不稳定版本,可能是错误和 CPU 瓶颈的原因(最终缓慢的孔搜索)上创建 11TB 稀疏文件(包含大约 2TB 数据)的副本。对于如何并行化 dd (以一种非常通用的方式)的问题,这不应该改变任何事情。

Ole*_*nge 5

在 Bash 中测试:

INFILE=in
seq 0 1000 $((`stat --format %s $INFILE` /100000 )) |
  parallel -k dd if=$INFILE bs=100000 skip={} conv=sparse seek={} count=1000 of=out
Run Code Online (Sandbox Code Playgroud)

您可能需要调整 1000。


G-M*_*ca' 3

即将出现一个自定义的、未经测试的代码片段:

\n\n
dd if=oldf conv=sparse bs=1k                 count=3000000000                 of=newf &\ndd if=oldf conv=sparse bs=1k skip=3000000000 count=3000000000 seek=3000000000 of=newf &\ndd if=oldf conv=sparse bs=1k skip=6000000000 count=3000000000 seek=6000000000 of=newf &\ndd if=oldf conv=sparse bs=1k skip=9000000000 count=3000000000 seek=9000000000 of=newf &\nwait\n
Run Code Online (Sandbox Code Playgroud)\n\n

这应该在逻辑上将文件划分为四个 3TB 块\n并并行处理它们。\xc2\xa0\n(skip=跳过输入块;seek=查找输出块。)\xc2\xa0\n当然,第四个命令将读取到旧文件的末尾,因此该count=参数并不是绝对必要的。

\n

  • 可能还需要 `conv=notrunc` (3认同)