Страниц: [1]
  Печать  
Автор Тема: fs-qnx4: в файл можно записать не более 65536 блоков  (Прочитано 8299 раз)
юрамеханик
Участник
*
Offline Offline

Сообщений: 32


Просмотр профиля
« : Апреля 13, 2015, 08:46:02 am »

Добрый день!

Обнаружили тут очень интересный баг (не дай бог фича).

Если мы пишем в несколько файлов на один раздел с фс qnx4 посредством функции  write(),
то после некоторого определенного количества записей write вылетает с ошибкой
EFBIG (File is too large).

При этом возрастает загрузка процессором драйвера devb-eide
как во время записи, так при попытке чтения файла (например ftp) или выполнения
чекдиска, скорость чтения файл так же падает (на порядок).

Если файл скопировать куда-либо -- удалить -- скопировать обратно, то скорость работы
 восстанавливается. Такое впечатление, что файл сильно фрагментирован.
При записи в файл с паузами в 10-20мс devb-eide грузит систему на 20-30%в начале записи и до 80% к "концу"

Если делаем аналогичные операции в фс qnx6 то нет ни ограничения , ни загрузки devb-eide при частой записи.

По поводу размера блоков: если размер каждого блока больше или равно 512 байт, то можно
записать не более 65536 записей, если размер блока меньше, то их количество ограничено
числом, при котором примерно получается размер файла 512*65536  (то бишь если блок 256
то количество блоков 131072).

Прикол еще в том, что если пишем в 1 файл, все нормально. Проблема возникает если
пишем подряд в несколько файлов в не зависимости от того, закрываем мы их после
этого или нет (синхронизируем или нет).

Тестирование проводилось при следующих условиях:

1 qnx 6.5.0 6.5.0sp1
2 devb-eide, fs-qnx4  
  строка запуска
  
Код:
  devb-eide eide nobmstr blk noatime,auto=partition qnx6 sync=optional cam quiet &
   mount -t qnx4 /dev/hd0t77 /flash
 и без nobmstr  , для qnx4 пробовал так же флаги overalloc и grown
3 x86 (Advantech PCI-7031 на intel atom и другие более древние  платы advantech на процессоре LX800) и на vmware x86.
4 sata ssd (intel ssdsc2bb080g401), CompactFlash, ide 2`5 hdd
5 открываем файл по
Код:
open(path_buf,O_APPEND | O_WRONLY |O_CREAT | O_SYNC, S_IRWXU|S_IROTH|S_IWOTH);
 если папки для файл нет создаем по
 
Код:
mkdir(filepath_buf, S_IRWXU |S_IRWXG |S_IRWXO )

  после записи делаем (или не делаем)
 
Код:
sync(); fdatasync(file_id); close(file_id);
    6 файлов при записи больше 2
    7 пауза между записями блоков от 20мс до 2с с большим временем проверять проблематично: как никак 65536с. это 18 часов записи.  [/li]

Собственно так проблему и заметили: в несколько лог файлов по порядку раз в секунду пишутся небольшие порции данных одинаковые по размеру.
 Пока количество данных при одной записи  не превышало определенный объем, количество записей в каждый из файлов за сутки укладывалось в условие , указанное выше, при резком увеличении объема порции данных в файл записывалось не более  65536 блоков  те 18 часов.

Выкладываю утилиту для тестов, в ней можно указать путь для записи файлов, их количество,
размер блоков, пауза между записями и возможность не закрывать файлы на время
записи и не синхронизировать.
Описание по use.

Просьба проверить мой код, а то я уже сильно сомневаюсь в его правильности. Может я что-то делаю не так? Smiley
« Последнее редактирование: Апреля 13, 2015, 12:41:45 pm от юрамеханик » Записан
юрамеханик
Участник
*
Offline Offline

Сообщений: 32


Просмотр профиля
« Ответ #1 : Апреля 13, 2015, 09:40:42 am »

Ха, пока писал запускал еще пару тестов и  нашел еще одно крайне важное условие!
если заменить флаг O_WRONLY на O_RDWR то проблема исчезает! Во всяком случае пока в тестах в файлы пишется без проблем.
Вообще без этих флагов пока проверить не успел
Записан
Страниц: [1]
  Печать  
 
Перейти в: