Назад | Перейти на главную страницу

linux: как имитировать задержку жесткого диска? Я хочу увеличить значение iowait без использования мощности процессора

Можно ли установить произвольную задержку для операций ввода-вывода?

Я хотел бы узнать, как iowait и disk% util влияют на производительность. Есть много инструментов для нагрузки на диск (bonnie ++ и т. Д.), Но я ищу способ ввести задержку, как инструмент tc (контроль трафика) для сети. Можно отключить некоторые оптимизации с помощью инструмента hdparm, например, настроить AAM на тихий или отключить DMA и переключиться в режим PIO, что является лишь косвенным способом уменьшить количество операций ввода-вывода.

device-mapper "задерживающие" устройства

Посмотрите на цель «задержки» для устройств сопоставления устройств. Именно поэтому он существует.

пример

Вот пример того, как это сделать:

Создайте место для чтения / записи

[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":

  1. начальный сектор этого раздела устройства отображения устройства (0)
  2. количество секторов этого раздела устройства отображения устройства (204800)
  3. тип устройства отображения устройства для этого раздела (задержка)
  4. первый аргумент «задержки», который является устройством, которое будет использоваться для реальных операций чтения / записи после задержки.
  5. второй аргумент для «задержки», который является смещением в исходном устройстве для использования (0)
  6. третий аргумент для "delay", который представляет собой миллисекунды времени задержки чтения (или чтения и записи, если другие параметры не указаны.) (200)

У нас есть только одна строка, поскольку мы обрабатываем все устройство сопоставления устройств одинаково, но это позволяет вам иметь разные секторы с разными устройствами поддержки, только некоторые из них медленные, только некоторые из них выдают ошибки и т. Д.

Видеть 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

Примечание: он не будет вносить никаких изменений, просто кошка