在旁边

在旁边

我正在为我的网站创建测试负载,我想了解这个命令的真正含义是什么?

('dd if=/dev/zero bs=100M count=500 | gzip | gzip -d  > /dev/null &')

到目前为止我的理解是,这是一次获取 100MiB 的数据块,将它们复制到磁盘,然后压缩和解压缩它们。这听起来正确吗?

答案1

让我们将命令分为三个部分

  • dd if=/dev/zero bs=100M count=500
  • gzip
  • gzip -d > /dev/null &

简洁版本

  • dd if=/dev/zero bs=100M count=500将 500 个空字符块(ASCII 中的 0x00)、每个块 100 MiB 的数据读取到管道 ( |) 中,本质上是“馈送” gzip请注意,这不会写入磁盘。
  • gzip压缩数据
  • gzip -d > /dev/null解压缩然后丢弃数据。

更长的解释

dd if=/dev/zero bs=100M count=500

  • dd命令通常有两个参数,if分别of表示输入和输出文件。这里的参数if设置为 /dev/zero,这是一个特殊的设备文件,它返回空字符(或 ASCII 中的 0x00)的“数组”。
  • 您关于读取 100MiB 块的说法是正确的,该bs参数有助于实现这一点。但请注意,它不会写入磁盘,请参阅下一点。
  • 当该of参数不存在时,它将写入标准输出或stdout(不是磁盘上的文件,而是一个溪流)。由于在命令之后使用了管道 ( |),因此写入的数据stdout将通过管道(馈送)到另一个程序中,此处 gzip
  • count参数指定复制的块数。

gzip

  • 当 gzip 在不指定文件的情况下运行时,它从标准输入或stdin(此处是来自 dd 的管道输入)读取并写入标准输出。
  • 默认情况下(没有-d选项),gzip 执行压缩。

gzip -d > /dev/null

  • 当使用该选项运行 gzip 时-d,它会执行解压缩。在这里,它从 gzip 读取管道输入并输出到 stdout(因为没有指定文件)。
  • >字符重定向当前命令的流 ( stdout, stdin, )。stderr这里它将命令stdout的标准输出gzip -d写入设备/dev/null,用于丢弃所有写入的数据。
  • '&' 字符指示 shell 在后台运行该进程。

答案2

在旁边

首先我假设命令是:

dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &

而不是:

('dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &')

括号相当无害,指示 shell 在子 shell 中执行管道,但单引号会导致问题。它们将指示 shell 将整个管道视为单个参数,然后 shell 将尝试将其作为命令名称执行。 shell 将(很可能)无法在其路径中找到具有该名称的命令('dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &'),并告诉您:

-bash: dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &: No such file or directory

现在来回答问题

dd命令将标准输入或用 指定的文件复制if=到标准输出或用 指定的文件of=。此负载测试命令用于/dev/zero输入。/dev/zero是由内核处理的特殊伪设备文件。读取时,文件会产生无穷无尽的空字符流。

然后,命令的输出dd(500 个块,每块 100M,除了空字符之外什么都没有)通过管道元字符传递|gzip命令,该命令动态压缩数据并通过另一个管道将其传递到|gzip -d后者解压缩管道上的数据飞。是>一个 shell 重定向运算符,指示 shell 将管道中最后一个命令的输出写入指定文件(在本例中为 )/dev/null。实际上没有写入任何内容,因为/dev/null这是由内核处理的另一个特殊伪设备文件,并且对此文件的所有写入操作都会被静默删除。

您提到了将数据复制到磁盘。因为/dev/null它是一个特殊的“黑洞”文件,并且其他命令从标准输入和标准输出读取和写入,所以不会将任何内容写入任何磁盘,除非系统将内存交换到磁盘。

&字符指示 shell 在后台运行管道。

答案3

好吧,转写一下意思是这样的:

dd if(entry device)=/dev/zero(device) (then set)bs=100M(size) (each time)count=500(times) (then send to) | (compressing)gzip (then send to) | (decompressing)gzip -d (redirect process to) > (null device)/dev/null &(don't wait)

现在,干净而详细的解释:

dd,是您正在执行的命令或程序。

if=、输入设备

/dev/zero,设备路径,在本例中为“/dev/zero”,即值为 0 的设备

bs=,指定生成从上述设备 /dev/zero 获得的零的大小

100M,在本例中从 /dev/zero 获取 0(零)数字的 100 MB。

count=,重复该过程以填充某些内容的次数,或者在本例中为输出

500,500次,即等于100M * 500 = 50000Megabytes

|,将输出发送到,在本例中发送到 gzip

gzip、负责压缩 gzip 格式文件的命令或程序,它将压缩来自 dd 命令或程序的数据。

|,再次发送到 de 命令 gzip 但在这种情况下'gzip-d'

gzip -d, gzip 命令或要执行的程序,'-d' 是表示解压缩的选项

> /dev/null,将 gzip 的进程重定向到 '/dev/null'

/dev/null,一个像垃圾或空白空间一样工作的空设备

&, 在这种情况下意味着不要等到命令完成,但它是 shell 脚本、bash 和其他编程语言的基本运算符。

摘要:您正在使用“dd”程序创建一个充满零(0 位数字)的文件,在本例中为 50000 个零,然后将其直接发送到 gzip 程序进行压缩,然后将其发送回 gzip,但在本例中再次解压。

50000 个零可以根据二进制或十进制的格式而变化,这已经取决于数学和预先建立的测量

如果括号是命令的一部分,那么 i 括号表示子操作示例:(这里是子操作),另一个示例:(命令[参数]),但通常需要符号“$”来触发,使用这些括号可以根据执行代码的程序改变其含义,例如:shell 脚本、bash 等。

答案4

正如其他答案提到的第一个命令从设备获取 50G 符号/dev/zero并将其发送到 STDOUT,同时gzip从 STDIN 获取该流,压缩它并将其发送到 STDOUT,同时gzip -d从 STDIN 获取压缩流并将其解压缩发送输出到dev/null(黑洞)。把这一切放在后台

但通过小的修改,该命令可以提供更大的负载,因为压缩零是一个微不足道的过程:)

dd if=/dev/random bs=100M count=500 | gzip -9 | gzip -d > /dev/null &

获得随机数将使压缩更加“重”。此外,增加压缩级别也会增加机器的负载。

相关内容