设备映射器“延迟”设备

设备映射器“延迟”设备

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

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

答案1

设备映射器“延迟”设备

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

例子

下面是一个如何实现这一点的例子:

创建一个可以读/写的地方

[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

使其成为块设备

Dev-mapper 只能将一个块设备映射到另一个块设备,而不能将文件映射到块设备。这是 loopback 设备的工作。

[root@centos6 ~]# losetup --show --find /tmp/100M-of-zeroes
/dev/loop0

获取设备大小(以块为单位)

因为这正是 dev-mapper 马上需要的……

[root@centos6 ~]# blockdev --getsize /dev/loop0
204800

设置“慢速”设备

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

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

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

由于我们将整个设备映射器设备视为相同,因此我们只有一行,但是这使您可以拥有具有不同支持设备的不同扇区,只有其中一些扇区速度较慢,只有其中一些扇区会出现错误,等等。

https://linux.die.net/man/8/dmsetup了解更多信息,包括可能同样有用的“flakey”映射器类型。有关设备映射器延迟功能的权威文档位于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

是的,这非常慢,特别是与原来相比:

[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

因此映射设备肯定会引入延迟。

结合以上内容

我故意将流程拆分开来,以便于理解。不过,您可以轻松地将上述步骤合并为更少的命令。

答案2

菲奥黑踪, 你可以重播I/O 跟踪。您要模拟哪种类型的中断?

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

答案3

您可以尝试使用 dm_delay 来模拟设备的延迟 IO。以下是您可能需要的一些文档:http://www.mjmwired.net/kernel/Documentation/device-mapper/delay.txt 以下是一些有用的 iostats 链接: iostat - %util 如何影响 %idle 和 %iowait https://stackoverflow.com/questions/4458183/how-the-util-of-iostat-is-computed

答案4

您可以尝试如下简单命令:

while true
do
find / -type f -exec cat {} \; >/dev/null 2>/dev/null
done

注意:它不会做任何修改,只是 cat

相关内容