如何並行化dd?

如何並行化dd?

dd我目前在使用稀疏文件作為輸入 ( if) 和文件作為輸出 ( of)進行呼叫時遇到問題conv=sparsedd似乎只使用 CPU 的一個核心(Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4 個核心 + 4 個英特爾超線程)(1 個核心的 100%),所以我一直想知道是否可以並行化dd。我去過

  • info ddand man ddand 似乎在corutils 8.23版本中有內建函數
  • sgp_dd從包中檢查sg3-utils(不了解它是否適合我的需要),但它似乎無法處理稀疏文件
  • dcfldd似乎沒有平行化能力

AFAIK

  • 優先於在多個執行緒中對程式部分進行內部處理的增強版本/分支(避免上下文變更破壞 I/O 效能)
  • 本地運行GNU 的解決方案parallel優於
  • 自訂(可能未經測試)程式碼片段

如何避免CPU成為I/O密集型作業的瓶頸?我想在具有 Linux 3.13 的 Ubuntu 14.04 上運行該命令,並在任何支援稀疏檔案的檔案系統上使用它處理稀疏檔案磁碟映像(至少該解決方案不應綁定到特定的檔案系統)。

背景:我正在嘗試在 zfs(zfsonlinux 0.6.4 不穩定版本,可能有錯誤以及 CPU 瓶頸的原因(最終緩慢的空洞搜尋))上建立 11TB 稀疏檔案(包含約 2TB 資料)的副本。對於如何並行化 dd (以非常通用的方式)的問題,這不應該改變任何事情。

答案1

在 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

您可能需要調整 1000。

答案2

即將出現一個自訂的、未經測試的程式碼片段:

dd if=oldf conv=sparse bs=1k                 count=3000000000                 of=newf &
dd if=oldf conv=sparse bs=1k skip=3000000000 count=3000000000 seek=3000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=6000000000 count=3000000000 seek=6000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=9000000000 count=3000000000 seek=9000000000 of=newf &
wait

這應該在邏輯上將文件劃分為四個 3TB 的區塊並並行處理它們。 (skip=跳過輸入區塊;seek=尋找輸出區塊。)當然,第四個命令將讀取到舊檔案的末尾,因此該count=參數並不是嚴格必要的。

相關內容