我使用的是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
Run Code Online (Sandbox Code Playgroud)
\n\n\n
dd if=/dev/zero of=/dev/null bs=1048576 count=1024
请注意,至少在使用参数时dd可能会破坏数据。如果您为特定的系统配置手动选择最佳块大小,那么它的性能优势充其量也很小:或者可以做得更好,最多只是稍微慢一点。因此,如非必要,请勿使用。bscatcpdd
请注意,从 1.23 版本开始,BusyBox 使用sendfile系统调用来复制数据,而不是使用readand write。然而,只有诸如cat和 之类的普通副本cp才使用sendfile:dd被迫使用read/write因为它需要精确控制大小。因此,使用 BusyBox \xe2\x89\xa51.23,cat并且cp很可能比dd.
\n\n每次收到 USR1 信号时“dd”都会“暂停”,这是真的吗?
\n
从技术上讲是的,它必须 \xe2\x80\x9cpause\xe2\x80\x9d 来处理信号。然而,暂停只是几个 CPU 指令(迄今为止成本最高的部分是打印进度输出)。所以这不会以任何方式使你的基准失效。
\n\n\n如果 dd 每秒暂停一次,那么当传输数十 GB 数据时,我将增加操作时间。
\n
不,你的数量级错了。您可能会在单 CPU 线程上增加 0.1% 的时间。主要成本是基准测试程序的内核时间,而不是dd,因此它是您想要执行的操作所固有的,而不是您实现它的方式。
\n\n是否可以让 dd 打印其当前状态而不向进程发送任何信号
\n
嗯,不。已经有一种简单的、历史上确立的、标准的、容易的方法来做到这一点。为什么会有另一种更难实施的方式呢?
\n在 Linux 上,有一种通用方法可以知道副本已到达的点。它不依赖于哪个程序正在执行复制,尽管它并不总是适用于特殊文件。找出$pid正在执行复制的进程 ID,以及它用于输入和输出的文件描述符。dd从 fd 0 读取并写入 fd 1。BusyBoxcp通常从 fd 3 读取并写入 fd 4。您可以通过 中的符号链接检查哪个文件在哪个文件描述符上打开/proc/$pid/fd。
$ cp /dev/zero /dev/null & pid=$!\n$ readlink /proc/$pid/fd/3\n/dev/zero\n$ readlink /proc/$pid/fd/4\n/dev/null\nRun Code Online (Sandbox Code Playgroud)\n您可以检查文件描述符$n$中的位置/proc/$pid/fd/$n。
$ cat /proc/$pid/fdinfo/4\npos: 74252288\nflags: 0100001\nmnt_id: 27\nRun Code Online (Sandbox Code Playgroud)\n但是,请注意,文件描述符位置可能不会使用特殊文件(例如/dev/zero、/dev/null、管道或套接字)进行更新。它始终使用常规文件进行更新。我不知道它是否针对块设备进行了更新。因此,它可能不会为您提供任何在/dev/zero和之间复制的信息/dev/null,但它可能适用于您的实际用例。
您还可以通过界面查询进度/proc。
# dd bs=1M if=/dev/mmcblk0 of=/dev/null &
# pidof dd
1358
Run Code Online (Sandbox Code Playgroud)
因此,有关此过程的信息可以在以下位置找到/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
Run Code Online (Sandbox Code Playgroud)
文件句柄 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
Run Code Online (Sandbox Code Playgroud)
通过这种方式,对于 busybox dd,您还可以从其 fdinfo pos 值获取进度。
也就是说,适度发送 USR1 信号对性能的影响应该很小。在资源很少的嵌入式系统上,轮询 fdinfo 也可能会产生类似的影响。
| 归档时间: |
|
| 查看次数: |
2000 次 |
| 最近记录: |