在沒有 USR1 的情況下檢查 dd 的進度嗎?

在沒有 USR1 的情況下檢查 dd 的進度嗎?

我使用的是busybox 1.27純 Linux 系統,因此沒有output=progress可用的,沒有 busybox 自己的實現,也沒有pv它本身。pipe_progresspv

我有兩個問題。第一個是基於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系統呼叫來複製數據,而不是使用readand write。然而,只有諸如cat和 之類的普通副本才cp使用sendfiledd被迫使用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 也可能產生類似的影響。

相關內容