|
QNX и запись на диск, медленная запись |
|
|
|
Oct 1 2012, 08:27
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 11-02-10
Пользователь №: 55 413

|
Добрый день всем!
Такая ситуация. Имеется компьютер Lippert на Celeron 650MHz и чипсетом VIA VT8606. К нему по шине PCI подключена плата захвата данных. Плата в режиме мастер пишет в буфер в памяти липперта данные. Размер буфера 600Кб. Буфер заполняется 30 раз в сек. и должен сливаться на диск. Диск IDE подключен 40 жильным кабелем, на 120 Гб. В общем, при записи буфера время выполнения функции write около 5 мс., но периодически, примерно раз в секунду, функция write висит в течении 300мс, соответственно пропускается куча буферов. Я так понял, что зависон происходит в момент слива кэша файловой системы на диск. Да, файловая система - fat32. Почему сливает так долго, можно ли как-то ускорить процесс?
|
|
|
|
|
 |
Ответов
(1 - 12)
|
Oct 1 2012, 09:44
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(Caxec @ Oct 1 2012, 11:27)  В общем, при записи буфера время выполнения функции write около 5 мс., но периодически, примерно раз в секунду, функция write висит в течении 300мс, соответственно пропускается куча буферов. Я так понял, что зависон происходит в момент слива кэша файловой системы на диск. Да, файловая система - fat32. Почему сливает так долго, можно ли как-то ускорить процесс? 1. Здесь не лучшее место спрашивать конкретные вопросы по QNX. Спрашивайте на qnx.org.ru, например. Здесь никто в QNX толком не понимает... 2. Кстати, и QNX какой: 4 или 6? 3. В QNX не особенно эффективный драйвер IDE. Кроме того, он сильно зависит от режима, как они называют: DMA / без DMA. Смотрите внимательно. Вы хотите достаточно высокую скорость: 600Кб. * 30 - 18Mb/sec. - это не так мало. За 120*10**3/18=6000 sec. < 2 час. - вы зальёте весь свой HDD полностью. И что дальше с ним будете делать? P.S. могу предположить, что здесь имеет место плохо продуманная архитектура задачи. 4. Для QNX fat32 совершенно чужеродная система. Используйте родные qnx4/qnx6 файловую систему. 5. Попробуйте взять под свой контроль сброс буферов на диск: сопровожайте каждый write операцией sync. 6. Вынесите всё, что касается write в отдельный процесс/поток с пониженным приоритетом ... и не будет у вас "пропускается куча буферов"(с).
|
|
|
|
|
Oct 1 2012, 09:55
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(Caxec @ Oct 1 2012, 12:27)  Добрый день всем!
Такая ситуация. Имеется компьютер Lippert на Celeron 650MHz и чипсетом VIA VT8606. К нему по шине PCI подключена плата захвата данных. Плата в режиме мастер пишет в буфер в памяти липперта данные. Размер буфера 600Кб. Буфер заполняется 30 раз в сек. и должен сливаться на диск. Диск IDE подключен 40 жильным кабелем, на 120 Гб. В общем, при записи буфера время выполнения функции write около 5 мс., но периодически, примерно раз в секунду, функция write висит в течении 300мс, соответственно пропускается куча буферов. Я так понял, что зависон происходит в момент слива кэша файловой системы на диск. Да, файловая система - fat32. Почему сливает так долго, можно ли как-то ускорить процесс? Вот я не у верен что это кеш. Какой QNX 4 или 6? Может просто головка винчестера улетает в начало диска для обновления фат таблицы, хотя частовато. Я делал два процесса с расшаренной между ними памятью. Один забирал данные из буфера PCI в мой буфер (размером несколько мегабайт, а второй отписывал или обрабатывал данные из этого буфера разделённого пополам. Всё успевало. Данные лучше копировать из PCI не по 32, а по 64 или даже 128 бит - может быть прирост в зависимости от конкретной мамки. Дрючить диск каждые 33мс - в корне неверно!
|
|
|
|
|
Oct 1 2012, 15:03
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 11-02-10
Пользователь №: 55 413

|
Цитата(Olej @ Oct 1 2012, 13:44)  2. Кстати, и QNX какой: 4 или 6? QNX 6.5SP1 Цитата(Olej @ Oct 1 2012, 13:44)  3. В QNX не особенно эффективный драйвер IDE. Кроме того, он сильно зависит от режима, как они называют: DMA / без DMA. Смотрите внимательно. Вы хотите достаточно высокую скорость: 600Кб. * 30 - 18Mb/sec. - это не так мало. За 120*10**3/18=6000 sec. < 2 час. - вы зальёте весь свой HDD полностью. И что дальше с ним будете делать? P.S. могу предположить, что здесь имеет место плохо продуманная архитектура задачи. Как раз час и есть время работы всей системы. Винт потом вынимаем - и на обработку Цитата(Olej @ Oct 1 2012, 13:44)  4. Для QNX fat32 совершенно чужеродная система. Используйте родные qnx4/qnx6 файловую систему. Попробовал qnx6 и qnx4. В qnx4 слегка побыстрее, но всё равно раз в секунду - тормоза, где то на 0,2 сек. Цитата(Olej @ Oct 1 2012, 13:44)  5. Попробуйте взять под свой контроль сброс буферов на диск: сопровожайте каждый write операцией sync. После этого всё стало ещё медленнее - теперь просто каждую запись тормоза где-то 70-80 мс, а мне надо 33 мс. Цитата(Olej @ Oct 1 2012, 13:44)  6. Вынесите всё, что касается write в отдельный процесс/поток с пониженным приоритетом ... и не будет у вас "пропускается куча буферов"(с). Запись и так в отдельном потоке - он получает сигнал от основного и по нему пишет из буфера, указатель на который объявлен глобальным, на диск. Может дело в медленном интерфейсе? Просто нет под рукой кабеля uata100 для 2.5 дюймовых дисков. Пользую 40 жильный uata33. Цитата(_4afc_ @ Oct 1 2012, 13:55)  Вот я не у верен что это кеш. Какой QNX 4 или 6? Может просто головка винчестера улетает в начало диска для обновления фат таблицы, хотя частовато.
Я делал два процесса с расшаренной между ними памятью. Один забирал данные из буфера PCI в мой буфер (размером несколько мегабайт, а второй отписывал или обрабатывал данные из этого буфера разделённого пополам. Всё успевало.
Данные лучше копировать из PCI не по 32, а по 64 или даже 128 бит - может быть прирост в зависимости от конкретной мамки.
Дрючить диск каждые 33мс - в корне неверно! А какая была средняя скорость обмена в Вашем проекте? Мне в идеале надо 22,5 Мб/сек считывания из PCI и записи на диск. Устройство на шине PCI пишет данные в режиме мастер. Бёрст сделал 128 слов - пришлось переконфигурировать регистры чипсета, т.к. биос не давал настроить и ограничивал 32 словами. Завтра попробую сделать два переключающихся буфера, сейчас у меня в один и тот же и пишет и из него же сохраняет на диск.
|
|
|
|
|
Oct 1 2012, 16:34
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(Caxec @ Oct 1 2012, 18:03)  После этого всё стало ещё медленнее - теперь просто каждую запись тормоза где-то 70-80 мс, а мне надо 33 мс. Это значит, что вы видите реальное время записи без буферизации - 70-80 мс. Цитата(Caxec @ Oct 1 2012, 18:03)  Запись и так в отдельном потоке - он получает сигнал от основного и по нему пишет из буфера, указатель на который объявлен глобальным, на диск. Если вы укладываетесь с записью в отдельном потоке в условия задачи, то это вам и решение. Если нет, то вы упёрлись в скорость записи на ваше устройство: файловая система + IDE. Можете попробовать буферизовать N последовательных циклов под единую операцию write... с малой вероятностью это может помочь. А иначе: меняйте оборудование + меняйте архитектуру проекта (скорее 2-е).
|
|
|
|
|
Oct 1 2012, 22:27
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(Caxec @ Oct 1 2012, 18:03)  Мне в идеале надо 22,5 Мб/сек считывания из PCI и записи на диск. 22,5 Мб/сек - это уже достаточно близко к пределу для некоторых устройств хранения в Linux (для сравнения), см.: Производительность диска. В QNX, за счёт микроядерности, все временные характеристики будут ещё хуже, да и драйвер IDE там, как утверждается, проработан не лучшим образом. Так что ваши пожелания находятся вообще достаточно близко к потенциальному пределу возможностей.
|
|
|
|
|
Oct 2 2012, 13:36
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 11-02-10
Пользователь №: 55 413

|
Цитата(gosha @ Oct 2 2012, 17:29)  Какой номер режима dma/udma для диска используется? Изначально использовался ATA 33 (пишет при запуске компа). Стомегабайтный файл копировался где-то 15 сек. Теперь сделал кабель 80 жильный. В биосе пишет ata 100, файл 100Мб копируется секунды 4. Но разницы в скорости записи буфера вообще никакой! Как было 0,05 сек и 0,15 сек. раз в секунду, так и осталось. Кстати, задержки зависят от размера кэша файловой системы - чем больше кэш, тем реже, но продолжительнее задержки.
Сообщение отредактировал Caxec - Oct 2 2012, 13:45
|
|
|
|
|
Oct 2 2012, 19:47
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Идеологически правильным решением будет организация цепочки буферов DMA (например, 256 буферов по 600 кБ), указатели на которые организованы в кольцевой буфер. Это позволит рассинхронизировать полностью потоки, управляющие захватом данных и записью на диск. Думаю, что идея очевидная и понятная - поток, управляющий захватом начинает по очереди заполнять буфер за буфером, при достижении определённого порога (скажем, заполнено 16 из 256 буферов) начинает работу поток записи на диск, опрожняющий буфера. Тут главная задача - добиться, чтобы затянувшаяся операция записи не приводила к остановке потока захвата данных. Цепочка буферов позволит снивелировать спонтанные задержки, вызванные записью на диск, но не решит проблему, если задержка носит систематический характер, в этом случае нужно искать другие архитектурные решения.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Oct 3 2012, 08:47
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30

|
QUOTE (Caxec @ Oct 2 2012, 17:36)  Изначально использовался ATA 33 (пишет при запуске компа). Стомегабайтный файл копировался где-то 15 сек. Теперь сделал кабель 80 жильный. В биосе пишет ata 100, файл 100Мб копируется секунды 4. Но разницы в скорости записи буфера вообще никакой! Как было 0,05 сек и 0,15 сек. раз в секунду, так и осталось. Кстати, задержки зависят от размера кэша файловой системы - чем больше кэш, тем реже, но продолжительнее задержки. Для начала: Там как-то можно посмотреть, какой режим udma выбрал devb-eide http://www.qnx.com/developers/docs/6.3.0SP.../devb-eide.htmlOptions: udma=mode Set ultra DMA mode. Values for mode can be 0-6 (or off to disable). Какой режим авто-определил и использует devb-eide, как-то можно посмотреть в /proc/ Какой HDD используется? Какова скорость записи по datasheet? Для измерения скорости записи можно ли выполнить: fwrite(f); fflush(f); Какая скорость записи получилась? Если сформатировать в qnx6 filesystem, скорость записи не изменяется?
|
|
|
|
|
Oct 3 2012, 13:25
|
Знающий
   
Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960

|
Цитата(Caxec @ Oct 1 2012, 12:27)  ... при записи буфера время выполнения функции write около 5 мс., но периодически, примерно раз в секунду, функция write висит в течении 300мс, соответственно пропускается куча буферов. Я так понял, что зависон происходит в момент слива кэша файловой системы на диск. Да, файловая система - fat32. Почему сливает так долго, можно ли как-то ускорить процесс? может обновление фат мешает. Надо его исключить. Попробуйте на заранее дефрагментированном чистом диске создать пустой файл на весь размер записи. Данные будуте писать в уже существующий файл поверх старых. Обновления фат при этом не должно быть. Но может выполняться подгрузка буфера фат. Как это обойти - не представляю.
|
|
|
|
|
Oct 8 2012, 07:37
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 11-02-10
Пользователь №: 55 413

|
Вроде получилось. Пришлось уменьшить в два раза разрядность данных. Соответственно, буферы теперь тоже в два раза меньше. Сделал два банка буферов - пока один сливается на диск, второй заполняется. В каждом банке по 8 буферов - чтобы операции записи на диск были реже. Поставил минимальныое значение кэша файловой системы - при этом время записи примерно выравнивается, нет провалов каждую секунду. Файловая система - QNX4. QNX6 пробовал - гораздо медленнее.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|