linux:如何模拟硬盘延迟?我想在不使用 CPU 电源的情况下增加 iowait 值

use*_*233 8 linux performance io

是否可以为 I/O 操作设置任意延迟?

我想了解 iowait 和磁盘 %util 如何影响性能。有很多工具可以对磁盘施加压力(bonnie++ 等),但我正在寻找一种方法来引入延迟,就像 tc(流量控制)工具对网络所做的那样。可以使用 hdparm 工具禁用一些优化,例如将 AAM 设置为安静或禁用 DMA 并切换到 PIO 模式 - 这只是减少 I/O 的间接方法。

Ste*_*nds 9

设备映射器“延迟”设备

查看设备映射器设备的“延迟”目标。这正是它存在的原因。

例子

以下是如何实现这一目标的示例:

创建一个地方来读/写

[root@centos6 ~]# dd if=/dev/zero of=/tmp/100M-of-zeroes bs=1024k count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.141834 s, 739 MB/s
Run Code Online (Sandbox Code Playgroud)

使其成为块设备

Dev-mapper 只从一个块设备映射到另一个块设备,而不是在文件和块设备之间映射。这就是环回设备的工作。

[root@centos6 ~]# losetup --show --find /tmp/100M-of-zeroes
/dev/loop0
Run Code Online (Sandbox Code Playgroud)

以块为单位获取设备大小

由于这是 dev-mapper 稍后需要的东西......

[root@centos6 ~]# blockdev --getsize /dev/loop0
204800
Run Code Online (Sandbox Code Playgroud)

设置“慢”设备

# echo "0 204800 delay /dev/loop0 0 200" | dmsetup create dm-slow
(about a 30 second pause here with no output)
Run Code Online (Sandbox Code Playgroud)

上面“echo”命令中设备映射器设置表中的字段是:

  1. 设备映射器设备本节的起始扇区( 0)
  2. 设备映射器设备本节的扇区数( 204800)
  3. 类型设备映射器装置的这个部分(delay
  4. “delay”的第一个参数,它是延迟后用于真正读/写的设备( /dev/loop/0)
  5. “延迟”的第二个参数是要使用的源设备中偏移量( 0)
  6. “delay”的第三个参数是延迟读取(或读取和写入,如果未指定其他参数)的时间毫秒。 ( 200)

我们只有一行,因为我们将整个设备映射器设备视为相同,但这让您可以拥有具有不同支持设备的不同扇区,只有其中一些变慢,只有其中一些出现错误,等等。

有关更多信息,请参阅https://linux.die.net/man/8/dmsetup,包括可能也有用的“flakey”映射器类型。device-mapper 延迟功能的权威文档位于https://www.kernel.org/doc/Documentation/device-mapper/delay.txt

慢吗?

[root@centos6 ~]# dd if=/dev/mapper/dm-slow of=/dev/null count=25000
25000+0 records in
25000+0 records out
12800000 bytes (13 MB) copied, 10.2028 s, 1.3 MB/s
Run Code Online (Sandbox Code Playgroud)

是的,这很慢,尤其是与原始版本相比:

[root@centos6 ~]# dd if=/dev/loop0 of=/dev/null count=25000
25000+0 records in
25000+0 records out
12800000 bytes (13 MB) copied, 0.0361308 s, 354 MB/s
Run Code Online (Sandbox Code Playgroud)

所以映射的设备肯定会引入延迟。

结合以上

我故意把事情分开,所以这个过程很容易遵循。但是,您可以轻松地将上述步骤组合成更少的命令。

  • 为了撤销这个设置,我运行了 `dmsetup remove dm-slow ; Lostup -d /dev/loop0` 并用 `dmsetup ls 确认;丢失 -l` (5认同)

eww*_*ite 5

使用fioblktrace,您可以重播I/O 跟踪。您想模拟什么类型的破坏?

如果您希望引起的延迟来自现有生产系统,您可以将其用作跟踪的基础。