Вопрос или проблема
Я использую 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
— это один из способов минимизировать риск возникновения проблем при асинхронных операциях ввода-вывода. Обязательно протестируйте конфигурацию, чтобы убедиться, что верификация выполняется корректно и без ложных срабатываний. В случаях, когда требуется высокая степень уверенности в целостности данных, также рекомендуется рассмотреть возможность использования более простых сценариев с меньшей глубиной параллельной записи или временным ограничением.