是否可以为 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”命令中的设备映射器设置表中的字段是:
- 起始扇区本节的设备映射器设备(
0
) - 扇区数本节的设备映射器设备(
204800
) - 这类型本节的设备映射器设备 (
delay
) - “延迟”的第一个参数是要使用的设备延迟后的真实读/写 (
/dev/loop/0
) - “延迟”的第二个参数是源设备中的偏移量使用 (
0
) - “延迟”的第三个参数是延迟时间(毫秒)读取(如果未指定其他参数,则读取和写入。)(
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
答案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