У меня есть программа уровня пользователя, которая открывает файл с помощью флагов O_WRONLY|O_SYNC
. Программа создает 256 потоков, которые пытаются записать 256 или более байтов данных каждый в файл. Я хочу получить 1280000 запросов, что составляет около 300 МБ данных. Программа заканчивается, когда 1280000 запросов были выполнены.
Я использую pthread_spin_trylock()
для увеличения переменной, которая отслеживает количество запросов, которые были выполнены. Чтобы гарантировать, что каждый поток записывает в уникальное смещение, я использую pwrite()
и вычисляю смещение как функцию от количества уже написанных запросов. Следовательно, я не использую мьютекс при записи в файл (обеспечивает ли этот подход целостность данных?)
Когда я проверяю среднее время, в течение которого звонок pwrite()
был заблокирован, и соответствующие номера (т. Е. Среднее время Q2C - которое является мерой времени для полного жизненного цикла BIO), найденное с использованием blktrace
, я считаю, что есть существенная разница. Фактически, среднее время завершения для данного BIO намного больше, чем средняя задержка вызова pwrite()
. В чем причина этого несоответствия? Разве эти числа не должны быть похожими, поскольку O_SYNC
гарантирует, что данные действительно записываются на физический носитель перед возвратом?