Можно ли установить произвольную задержку для операций ввода-вывода?
Я хотел бы узнать, как iowait и disk% util влияют на производительность. Есть много инструментов для нагрузки на диск (bonnie ++ и т. Д.), Но я ищу способ ввести задержку, как инструмент tc (контроль трафика) для сети. Можно отключить некоторые оптимизации с помощью инструмента hdparm, например, настроить AAM на тихий или отключить DMA и переключиться в режим PIO, что является лишь косвенным способом уменьшить количество операций ввода-вывода.
Посмотрите на цель «задержки» для устройств сопоставления устройств. Именно поэтому он существует.
Вот пример того, как это сделать:
[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 отображает только одно блочное устройство на другое, а не между файлами и блочными устройствами. Это работа устройства обратной петли.
[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":
У нас есть только одна строка, поскольку мы обрабатываем все устройство сопоставления устройств одинаково, но это позволяет вам иметь разные секторы с разными устройствами поддержки, только некоторые из них медленные, только некоторые из них выдают ошибки и т. Д.
Видеть https://linux.die.net/man/8/dmsetup для получения дополнительной информации, включая, возможно, также полезный тип "flakey" 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
Да, это довольно медленно, особенно по сравнению с оригиналом:
[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
Таким образом, подключенное устройство определенно вносит задержку.
Я намеренно разбивал вещи на части, чтобы было легко следить за процессом. Однако вы можете легко объединить описанные выше шаги в меньшее количество команд.
С участием фио и blktrace, ты можешь переиграть трассировка ввода-вывода. Какие нарушения вы пытаетесь смоделировать?
Если задержки, которые вы хотите вызвать, связаны с существующей производственной системой, вы можете использовать это в качестве основы для трассировки.
Вы можете попробовать использовать dm_delay для имитации отложенного ввода-вывода для устройства. Вот какой документ может вам понадобиться: 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
Вы можете попробовать такую простую команду:
while true
do
find / -type f -exec cat {} \; >/dev/null 2>/dev/null
done
Примечание: он не будет вносить никаких изменений, просто кошка