dd
我目前在使用稀疏文件作為輸入 ( if
) 和文件作為輸出 ( of
)進行呼叫時遇到問題conv=sparse
。dd
似乎只使用 CPU 的一個核心(Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
4 個核心 + 4 個英特爾超線程)(1 個核心的 100%),所以我一直想知道是否可以並行化dd
。我去過
- 看
info dd
andman dd
and 似乎在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=
參數並不是嚴格必要的。