Contents

如何在Bash中创建CPU峰值

1. 概述

在本教程中,我们将采用一种实用的方法来创建 CPU 峰值,这在某些开发和测试场景中很有用。

首先,我们将了解如何使用几个不同的命令来检查 CPU 使用率。

之后,我们将介绍多种方法,使用各种命令和实用程序来创建 CPU 峰值。

2. 确定CPU使用率

在 Linux 上,检查 CPU 在给定时刻的繁忙程度非常简单。我们可以利用多种工具,例如topvmstat

2.1. top

大多数 Linux 发行版都提供top 交互式实用程序:

$ top -i

默认情况下,它将显示第一个 CPU 的使用情况。我们可以按1显示所有 CPU 的使用情况。

2.2. htop

此外,我们还可以使用*htop ,这是一个更精致的top版本,可以通过简单的用户界面和丰富多彩的输出轻松与任务管理器进行交互。它在大多数 Linux 系统上都可用,我们只需键入htop*即可启动它:

$ htop -p 0

-p参数用于指定进程的 PID 。默认情况下,不带参数的htop将监视所有进程。在我们的例子中,我们想要查看 CPU 使用率,因此我们放弃了单个进程的监控。

2.3. 使用图形 CPU 监视器

或者,我们可以访问许多提供交互式用户界面的图形任务监视器。一些流行的包括*gnome-system-monitor ksysguard *。我们可以使用包管理器 从我们的分发存储库中安装它们。

要了解有关监控 CPU 使用率的更多信息,请参阅我们关于如何分离进程的 CPU 核心使用情况的 文章。

3. 创建 CPU 峰值

由于各种工具和命令的可用性,在 Linux 上创建 CPU 峰值非常容易。如果我们要进行基准测试、测试或一些分析,我们可以使用以下方法。此外,我们可以在其中一个窗口客户端中打开一个 CPU 监视器并在另一个窗口客户端中执行命令以获得更好的可观察性。

注意:在使用这些方法之前,请注意某些方法会导致系统崩溃。我们强烈建议事先保存任何正在进行的工作。

3.1. 使用dd命令

dd 实用程序可用于大多数类 Unix 系统。我们可以使用dd命令将/dev/zero的内容复制到/dev/null:**

$ dd if=/dev/zero of=/dev/null
  • if参数用于指定输入文件——在我们的例子中,它是/ dev/zero,它是一个包含无限数量的字符的特殊文件
  • of参数用于指定输出文件——在这种情况下,我们将内容保存到*/dev/null*,这是一个丢弃写入它的内容的 void

执行命令后,我们可以看到它使我们的一个 CPU 过载。

但是,我们可以编写一个脚本,我们可以同时执行多次以重载其他内核:

#!/bin/bash
fulload() {
  dd if=/dev/zero of=/dev/null |
  dd if=/dev/zero of=/dev/null |
  dd if=/dev/zero of=/dev/null |
  dd if=/dev/zero of=/dev/null &
};
fulload; read; killall dd

让我们继续并使脚本可执行:

$ chmod +x ./dd.sh
$ ./dd.sh

执行脚本后,我们可以观察到它将使系统中的四个内核过载。完成后,我们可以按EnterCTRL-C来终止进程。

3.2. 使用stress工具

stress 工具是我们可以用来对系统的 CPU、内存和 I/O 进行压力测试的最小实用程序。默认情况下,大多数发行版上都没有安装stress。但是,它在大多数官方软件包存储库中都可用。

要为基于 Ubuntu 的发行版安装,请使用apt

# apt install stress

在 Fedora 和 RHEL 上使用yum

# yum install stress

对于基于 Arch 的发行版,我们可以使用pacman

# pacman -Sy stress

安装完成后,我们可以通过指定要测试的资源来使用stress

$ stress --cpu 2
stress: info: [19941] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd

在我们的例子中,我们想要对 CPU 施加压力。因此,我们传递了*–cpu参数,后跟要生成的工人数量。再一次,我们可以按CTRL-C*来终止进程。

3.3. 使用yes命令

yes 是一个有趣的实用程序,它重复打印作为参数传递的字符串。当然,我们可以用它来超载我们的 CPU。首先,我们需要检查系统上是否存在yes

$ yes --version

如果它不可用,我们可以通过安装我们的包存储库中可用的coreutils 包来获取它。让我们把命令付诸行动:

$ yes "scientia potentia est"

正如我们所看到的,它将字符串打印到我们的控制台而不会停止。或者,我们也可以将输出重定向到*/dev/null*:

$ yes > /dev/null

但是,如果我们检查我们的 CPU 使用率,我们可以看到它只会使我们的一个 CPU 过载。根据情况,我们可能需要重载更多内核:

$ yes > /dev/null | yes > /dev/null

我们可以将更多实例连接在一起以使更多内核过载。例如,如果我们有八个内核,我们可以有八个相同命令的实例来重载它们。

3.4. 使用sha1sum实用程序

sha1sum 是一个计算机程序,它通过计算和验证 SHA1 哈希来验证文件的完整性。它随大多数 Linux 发行版一起提供。要使用该实用程序,我们可以使用来自/dev/zero的读数来保持sha1sum*实用程序运行*。我们可以将第一个实例的输出通过管道传输到第二个实例:

$ sha1sum /dev/zero | sha1sum /dev/zero

像往常一样,我们可以按CTRL-C来终止进程。

3.5. 使用while循环

我们可以使用 Bash 中可用的while循环来重载内核。当上述工具均不可用且我们需要快速超载 CPU 时,它可以派上用场。这是一个简单的while循环:

$ while :; do :; done

: 类似于true,它什么都不做并以 0 退出。但是,它只会使 CPU 内核之一过载。作为替代,我们将稍微修改命令以使两个内核过载:

$ while true; do echo; done

我们应该注意,它不适用于两个以上的内核。

3.6. fork炸弹攻击

fork炸弹 功能对CPU 资源发起拒绝服务攻击。一旦我们调用该函数,它就会不断地调用fork函数来无限期地复制自己。结果,它耗尽了系统资源,从而导致资源匮乏。要调用fork炸弹,只需输入以下不寻常的命令:

$ :(){ :|:& };:

为了更好地理解结构,让我们在脚本中稍微格式化一下:

#!/bin/bash
:() {
  :|: &;
}
:;

第一个 : 表示fork炸弹功能。所以,我们定义了一个函数,在函数体中,我们对函数本身进行了多次调用。脚本中的最后一个 : 表示对fork炸弹函数的调用。

我们应该避免运行这个命令并且只将它作为最后的手段,因为这个命令可能会导致我们的系统崩溃。但是,如果我们运行该命令,我们可以在使用完后使用kill命令杀死它。

3.7. 从*/dev/urandom*读取

/dev/urandom文件是一个生成随机内容的特殊文件。让我们测试一下:

$ cat /dev/urandom

正如我们所见,它打印随机字符。我们可以将其输出重定向到*/dev/null*并观察 CPU 使用情况:

$ cat /dev/urandom > /dev/null

正如我们所看到的,它使 CPU 过载,但并不完全达到 100%。当我们不需要将核心加载到最大时,它可能会派上用场。