Как надежно запустить fio verify в Linux

Вопрос или проблема

Я использую fio с дисками, представленными через iscsi. Я указываю следующие параметры в fio

fio --name=randwrite --ioengine=libaio --iodepth=64 --rw=randrw --rwmixread=50  --bs=4k-2M --direct=1 -filename=data --numjobs=1 --runtime 36000 --verify=md5 --verify_async=4 --verify_backlog=100000 --verify_dump=1 --verify_fatal=1 --time_based --group_reporting

С указанными выше параметрами может ли fio отправлять перекрывающиеся параллельные записи размером больше, чем размер страницы.

Если да, то как fio проверяет контрольную сумму, если атомарность ввода-вывода не гарантируется для размера страницы.

Вы видели опцию serialize_overlap в fio? Вы правы, если fio отправляет проверочное чтение в область, где у него есть запись в процессе, это может привести к ложным сбоям. Я думаю, кто-то другой заметил это и создал проблему по этому поводу на https://github.com/axboe/fio/issues/792

Ответ или решение

Для надежного выполнения верификации с помощью fio в Linux, особенно при работе с дисками, доступными через iSCSI, важно учесть несколько моментов, связанных с параметрами и потенциальными проблемами конкурентной записи и чтения.

Основные параметры

Ваши параметры командной строки могут привести к ситуациям, когда fio выполняет конкурирующие записи и чтения в одной и той же области памяти, что может вызвать ложные отказы при проверке. В частности, параметр --verify=md5 предназначен для расчета контрольных сумм (хэш-кодов) записанных данных, чтобы гарантировать целостность. Однако в вашем случае:

fio --name=randwrite --ioengine=libaio --iodepth=64 --rw=randrw --rwmixread=50 --bs=4k-2M --direct=1 --filename=data --numjobs=1 --runtime=36000 --verify=md5 --verify_async=4 --verify_backlog=100000 --verify_dump=1 --verify_fatal=1 --time_based --group_reporting

Потенциальные проблемы

Фактическая проблема здесь заключается в том, что, когда fio выполняет асинхронные записи и одновременно запускает верификацию, это может привести к ситуации, когда в процессе проверки читается область данных, которая еще не завершила запись. Поскольку гарантии атомарности ввода-вывода отсутствуют для размеров, превышающих размер страницы (обычно 4Кб на современных системах), это создает риск получения неверных данных при верификации.

Решение проблемы

Для предотвращения данного поведения можно использовать параметр --serialize_overlap, который сосредоточит работу fio на том, чтобы не допускать пересечения операций чтения и записи. Используя этот параметр:

fio --name=randwrite --ioengine=libaio --iodepth=64 --rw=randrw --rwmixread=50 --bs=4k-2M --direct=1 --filename=data --numjobs=1 --runtime=36000 --verify=md5 --verify_async=4 --verify_backlog=100000 --verify_dump=1 --verify_fatal=1 --time_based --group_reporting --serialize_overlap

Таким образом, fio будет гарантировать, что операции чтения не будут выполняться в тех же областях, где происходят записи, что обеспечит надежность механизмов проверки.

Заключение

Использование serialize_overlap — это один из способов минимизировать риск возникновения проблем при асинхронных операциях ввода-вывода. Обязательно протестируйте конфигурацию, чтобы убедиться, что верификация выполняется корректно и без ложных срабатываний. В случаях, когда требуется высокая степень уверенности в целостности данных, также рекомендуется рассмотреть возможность использования более простых сценариев с меньшей глубиной параллельной записи или временным ограничением.

Оцените материал
Добавить комментарий

Капча загружается...