
我使用的是busybox 1.27
純 Linux 系統,因此沒有output=progress
可用的,沒有 busybox 自己的實現,也沒有pv
它本身。pipe_progress
pv
我有兩個問題。第一個是基於https://www.linux.com/training-tutorials/show-progress-when-using-dd/。它表示,透過USR1
向其發送訊號會dd
「暫停」該過程,並且dd
在列印後其當前狀態將繼續其正在執行的工作。我正在嘗試進行一些基準測試,dd
因此我希望對dd
操作的影響最小。我希望每秒獲得當前操作的輸出,因為傳遞的數據dd
是波動的,識別傳輸速率何時下降對我來說很重要。
第一個問題: 每次收到信號時“dd”都會“暫停”,這是真的嗎USR1
?
如果dd
每秒暫停一次,那麼當傳輸數十千兆位元組時,我將增加操作時間。
第二個問題: 假設是的作為第一個問題的答案,我想知道是否可以在dd
不向進程發送任何訊號的情況下列印其當前狀態,也許是某種重定向STDOUT
(如 2>&1)?
我指的是:
# bs with 1Mib so I can have more control on the test.
dd if=/dev/zero of=/dev/null bs=1048576 count=1024
# Printing current operation status.
sudo kill -USR1 $dd_pid
答案1
dd if=/dev/zero of=/dev/null bs=1048576 count=1024
注意dd
可以破壞數據, 至少使用bs
參數時。和其性能優勢如果您為特定的系統配置手動選擇最佳區塊大小,那麼充其量是很小的:cat
或者cp
可以做得更好,最多只是稍微慢一點。所以dd
如果沒有必要就不要使用。
請注意,從 1.23 版本開始,BusyBox 使用sendfile
系統呼叫來複製數據,而不是使用read
and write
。然而,只有諸如cat
和 之類的普通副本才cp
使用sendfile
:dd
被迫使用read
/write
因為它需要精確控制大小。因此,BusyBox ≥1.23,cat
並且cp
很可能比dd
.
'dd' 每次收到 USR1 信號時都會“暫停”,這是真的嗎?
從技術上講,是的,它必須「暫停」來處理訊號。然而,暫停只是幾個 CPU 指令(迄今為止成本最高的部分是列印進度輸出)。所以這不會以任何方式使你的基準失效。
如果 dd 每秒暫停一次,那麼當傳輸數十 GB 資料時,我將增加操作時間。
不,你的數量級錯了。您可能會在單 CPU 執行緒上增加 0.1% 的時間。主要成本是基準測試程式的核心時間,而不是dd
,因此它是您想要執行的操作所固有的,而不是您實現它的方式。
是否可以讓 dd 列印其當前狀態而不向進程發送任何訊號
嗯,不。已經有一種簡單的、歷史上確立的、標準的、容易的方法來做到這一點。為什麼會有另一種更難實施的方式呢?
在 Linux 上,有一種通用方法可以知道副本已到達的點。它並不取決於哪個程式正在執行複製,儘管它並不總是適用於特殊文件。找出$pid
正在執行複製的進程 ID,以及它用於輸入和輸出的檔案描述符。dd
從 fd 0 讀取並寫入 fd 1 cp
。/proc/$pid/fd
$ cp /dev/zero /dev/null & pid=$!
$ readlink /proc/$pid/fd/3
/dev/zero
$ readlink /proc/$pid/fd/4
/dev/null
您可以檢查檔案描述符$n$
中的位置/proc/$pid/fd/$n
。
$ cat /proc/$pid/fdinfo/4
pos: 74252288
flags: 0100001
mnt_id: 27
但是,請注意,檔案描述符位置可能不會使用特殊檔案(例如/dev/zero
、/dev/null
、管道或套接字)進行更新。它始終使用常規文件進行更新。我不知道它是否針對區塊設備進行了更新。因此,它可能不會為您提供任何在/dev/zero
和之間複製的信息/dev/null
,但它可能適用於您的實際用例。
答案2
您也可以透過介面查詢進度/proc
。
# dd bs=1M if=/dev/mmcblk0 of=/dev/null &
# pidof dd
1358
因此,有關此過程的資訊可以在以下位置找到/proc/1358
:
# ls -l /proc/1358/fd
total 0
lr-x------ 1 root root 64 Nov 2 09:16 0 -> /dev/mmcblk0
l-wx------ 1 root root 64 Nov 2 09:16 1 -> /dev/null
lrwx------ 1 root root 64 Nov 2 09:16 2 -> /dev/pts/0
檔案句柄 0 是if=/dev/mmcblk0
,現在進度在哪裡?
# cat /proc/1358/fdinfo/0
pos: 2132803584
flags: 0400000
mnt_id: 17
# cat /proc/1358/fdinfo/0
pos: 2366636032
flags: 0400000
mnt_id: 17
# cat /proc/1358/fdinfo/0
pos: 2587885568
flags: 0400000
mnt_id: 17
透過這種方式,對於 busybox dd,您也可以從其 fdinfo pos 值取得進度。
也就是說,適度發送 USR1 訊號對效能的影響應該很小。在資源很少的嵌入式系統上,輪詢 fdinfo 也可能產生類似的影響。