我在一个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
每秒暂停一次,那么当传输数十 GB 时,我将在操作中增加几个小时。
第二个问题: 假设第一个问题的答案是肯定的,我想知道是否可以在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
您也可以通过
/proc
界面查询进度。因此,有关此过程的信息可在以下位置找到
/proc/1358
:文件句柄 0 是
if=/dev/mmcblk0
,现在进度在哪里?以这种方式,对于busybox dd,您还可以从其fdinfo pos 值中获取进度。
也就是说,适度发送 USR1 信号对性能的影响应该很小。在资源很少的嵌入式系统上,轮询 fdinfo 也可能会产生类似的影响。
请注意,至少在使用参数时
dd
可以破坏数据。如果您为特定系统配置手动选择最佳块大小,它的性能优势充其量是很小的:或者可以做得更好,最多只是稍微慢一点。因此,如果您不需要,请不要使用。bs
cat
cp
dd
请注意,从 1.23 版开始,BusyBox 使用
sendfile
系统调用来复制数据,而不是使用read
andwrite
。只有普通副本,例如cat
andcp
usesendfile
,但是:dd
被迫使用read
/write
因为它想要精确控制大小。所以在 BusyBox ≥1.23 的情况下,cat
很cp
可能比dd
.从技术上讲是的,它必须“暂停”来处理信号。然而,暂停只是几个 CPU 指令(迄今为止最昂贵的部分是打印进度输出)。因此,这不会以任何方式使您的基准测试无效。
不,您的数量级错误。您可能会在单 CPU 线程上增加 0.1% 的时间。主要成本是基准测试程序的内核时间,而不是
dd
,因此它是您想要做的事情所固有的,而不是您实现它的方式。嗯,不。已经有一种简单的、历史悠久的、标准的、简单的方法来做到这一点。为什么会有另一种更难实施的方法?
在 Linux 上,有一种通用的方法可以知道副本到达的位置。它不依赖于正在执行复制的程序,尽管它并不总是适用于特殊文件。找出
$pid
正在进行复制的进程 ID,以及它用于输入和输出的文件描述符。dd
从 fd 0 读取并写入 fd 1。BusyBoxcp
通常从 fd 3 读取并写入 fd 4。您可以通过/proc/$pid/fd
.您可以检查文件描述符
$n$
在/proc/$pid/fd/$n
.但是,请注意,文件描述符位置可能不会使用特殊文件(例如
/dev/zero
、/dev/null
、管道或套接字)进行更新。它总是用常规文件更新。我不知道它是否针对块设备进行了更新。因此,它可能不会为您提供在/dev/zero
and之间进行复制的任何信息/dev/null
,但它可能适用于您的实际用例。