The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"как максимально быстро записать данные на flash или вообще н..."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"как максимально быстро записать данные на flash или вообще н..."
Сообщение от pari emailИскать по авторуВ закладки(ok) on 20-Сен-04, 18:15  (MSK)
Граждане,
не подскажете как максимально быстро записать что-то на compact flash диск, или вообще на /dev/hda ?
Проблема в следующем...
Юзаем embedded linux на одноплатном компьютере на XScale процессоре (VIPER от arcom.com). Собираем с его помощью данные от устройств, подключенных по 485 шине. Команда на сбор приходит по IRQ - на компе реализована шина PC/104. Драйвер в ядре, обрабатывающий IRQ разблокирует поток в нашей проге, который посылается запрос в COM порт. Отдельным thread'ом принимается ответ от устройств и пишется в файл на compactflash карточку.

И все бы хорошо, да не успеваем записать на карточку достаточно быстро и время от времени происходят сбои (насколько мы понимаем, следующий запрос в линию происходит раньше, чем пришел предыдущий ответ - линия полудуплексная).
Пробовали писать напряму на /dev/hda минуя файловую систему - не помогает. Наоборот, все еще хуже чем писать через ext2 - в ней есть кэш, и пока он не забит все худо-бедно работает. Но как только кэш забивается - все, пошли сбои. Если писать в память - все работает. Но нас это не устраивает, так как надо собирать данные непрерывно (т.е. нет промежутков, чтоб скинуть на диск) и объем их превышает доступный объем памяти.

Есть ли какие-то методы, как ускорить процедуру записи на диск или запись напрямую в /dev/hda это самое быстрое, что может быть?

Спасибо.
Павел Мальцев

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от klalafuda emailИскать по авторуВ закладки on 20-Сен-04, 18:18  (MSK)
>
>Есть ли какие-то методы, как ускорить процедуру записи на диск или запись
>напрямую в /dev/hda это самое быстрое, что может быть?

AFAIU выше головы вы не прыгните :) зависит от Compact Flash карточки. некоторые тянут даже ATA3. у меня по тестам скорость записи на карточку может достигать ~1Mb/s на файловую систему, что вполне приемлемо для большинства приложений.

в общем, как минимум, uname -a и dmesg в студию.

// wbr

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от pari emailИскать по авторуВ закладки(ok) on 20-Сен-04, 21:41  (MSK)
Прошу прощенья, действительно забыл самое главное...
Итак, числа...
Прерывания идут 64 раза в секунду, это 15.62 мс между прерываниями.
Через одну-две милисекунды после прихода прерывания уходит запрос, еще
через пару милисекунд приходит ответ. В результате у нас остается
приблизительно 7 мс чтоб записать максимум 1540 байт на диск и
приготовиться к новому прерыванию.

После проведения тестов выяснили следующее:
Скорость прямой записи на flash (/dev/hda)
ориентировочно 1.3 мегабайта в секунду.
(при записи через ext2 на /dev/hda1 скорость выше 10 мегабайт в секунду,
но потом - при размере файла больше 10 мегабайт падает).
Получается, что для записи 1540 байт у нас есть 1.5 милисекунды, т.е. должно вроде бы хватать. А оно не хватат...


# uname -a
Linux viper 2.4.21-rmk1-pxa1-arcom1-mmx #22 Tue Aug 31 17:08:01 EEST 2004 armv5tel unknown

# dmesg
Linux version 2.4.21-rmk1-pxa1-arcom1-mmx (mmx@alligator) (gcc version 3.3.2) #22 Tue Aug 31 17:08:01 EEST 2004
CPU: XScale-PXA255 revision 6
Machine: Arcom VIPER SBC
Memory clock: 99.53MHz (*27)
Run Mode clock: 199.07MHz (*2)
Turbo Mode clock: 199.07MHz (*1.0, active)
On node 0 totalpages: 16384
zone(0): 16384 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: ro console=ttyS0,115200n8 root=/dev/mtdblock3
Relocating machine vectors to 0xffff0000
Configuring ISA interrupt 3 as IRQ 104
Configuring ISA interrupt 4 as IRQ 105
Configuring ISA interrupt 5 as IRQ 106
Configuring ISA interrupt 6 as IRQ 107
Configuring ISA interrupt 7 as IRQ 108
Configuring ISA interrupt 10 as IRQ 109
Configuring ISA interrupt 11 as IRQ 110
Configuring ISA interrupt 12 as IRQ 111
Console: colour dummy device 80x30
Calibrating delay loop... 198.24 BogoMIPS
Memory: 64MB = 64MB total
Memory: 63416KB available (1036K code, 275K data, 60K init)
Dentry cache hash table entries: 8192 (order: 4, 65536 bytes)
Inode cache hash table entries: 4096 (order: 3, 32768 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 4096 (order: 2, 16384 bytes)
Page-cache hash table entries: 16384 (order: 4, 65536 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Setting core voltage 1.0V (scaling factor 0xfff)<6>
befole cycle 'for'

after cycle 'for'

LD_SET...

udelay...

LD_CLR...
DONE.
Using PXA255 frequency points.
Registering CPU frequency change support.
CPU clock: 199.065 MHz (99.000-400.000 MHz)
Starting kswapd
JFFS2 version 2.2. (C) 2001-2003 Red Hat, Inc.
Not calling pckbd_init_hw()
pty: 256 Unix98 ptys configured
Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ enabled
ttyS00 at 0x0000 (irq = 15) is a PXA UART
ttyS01 at 0x0000 (irq = 14) is a PXA UART
ttyS02 at 0x0000 (irq = 13) is a PXA UART
ttyS03 at 0xf3300010 (irq = 27) is a 16550A
ttyS04 at 0xf3300000 (irq = 26) is a 16550A
loop: loaded (max 8 devices)
Probing VIPER flash device at physical address 0x04000000
flash: Found 1 x16 devices at 0x0 in 16-bit mode
flash: Found an alias at 0x1000000 for the chip at 0x0
flash: Found an alias at 0x2000000 for the chip at 0x0
flash: Found an alias at 0x3000000 for the chip at 0x0
Intel/Sharp Extended Query Table at 0x0031
cfi_cmdset_0001: Erase suspend on write enabled
0: offset=0x0,size=0x20000,blocks=128
Using buffer write method
4 RedBoot partitions found on MTD device flash
Creating 4 MTD partitions on "flash":
0x00000000-0x0001f000 : "FIS directory"
mtd: partition "FIS directory" doesn't end on an erase block -- force read-only
0x0001f000-0x00020000 : "RedBoot config"
mtd: partition "RedBoot config" doesn't start on an erase block boundary -- force read-only
0x00020000-0x000c0000 : "kernel"
0x000c0000-0x01000000 : "filesystem"
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 4096 bind 8192)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
NetWinder Floating Point Emulator V0.97 (double precision)
VFS: Mounted root (jffs2 filesystem) readonly.
Freeing init memory: 60K
i2c-core.o: i2c core module
i2c-algo-bit.o: i2c bit algorithm module
i2c-viper: VIPER I2C Driver
I2C: DS1307 RTC driver successfully loaded. Device at 0x68
usb.c: registered new driver usbdevfs
usb.c: registered new driver hub
hc_isp116x.c: USB ISP116x at f4000000/f4000002,240 IRQ 25 Rev. 10 ChipID: 6122
usb.c: new USB bus registered, assigned bus number 1
hub.c: USB hub found
hub.c: 2 ports detected
smc91x.c: v1.0, mar 07 2003 by Nicolas Pitre <nico@cam.org>
eth0: SMC91C11xFD (rev 1) at 0xc8898300 IRQ 1 [nowait]
eth0: Ethernet addr: 00:80:66:10:06:2e
eth0: PHY=LAN83C183 (LAN91C111 Internal)
<5>eth0: PHY remote fault detected
<5>eth0: Ethernet Link Detected
eth0: PHY 100BaseT
eth0: PHY Full Duplex

root# /usr/sbin/hdparm -I  /dev/hda

/dev/hda:

CompactFlash ATA device, with removable media
        Model Number:       CF 64MB
        Serial Number:      GHS2ABPCF03031400005
        Firmware Revision:  02/08/29
Standards:
        Likely used: 4
Configuration:
        Logical         max     current
        cylinders       1000    1000
        heads           4       4
        sectors/track   32      32
        --
        bytes/track: 0  bytes/sector: 512
        CHS current addressable sectors:     128000
        LBA    user addressable sectors:     128000
        device size with M = 1024*1024:          62 MBytes
        device size with M = 1000*1000:          65 MBytes
Capabilities:
        LBA, IORDY(may be)(cannot be disabled)
        Buffer size: 0.5kB      bytes avail on r/w long: 4      Queue
depth: 1
        Standby timer values: spec'd by Vendor
        R/W multiple sector transfer: Max = 1   Current = 0
        DMA: not supported
        PIO: pio0 pio1 pio2


  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от klalafuda Искать по авторуВ закладки on 20-Сен-04, 22:18  (MSK)
>Прошу прощенья, действительно забыл самое главное...
>Итак, числа...
>Прерывания идут 64 раза в секунду, это 15.62 мс между прерываниями.
>Через одну-две милисекунды после прихода прерывания уходит запрос, еще
>через пару милисекунд приходит ответ. В результате у нас остается
>приблизительно 7 мс чтоб записать максимум 1540 байт на диск и
>приготовиться к новому прерыванию.
>
>После проведения тестов выяснили следующее:
>Скорость прямой записи на flash (/dev/hda)
>ориентировочно 1.3 мегабайта в секунду.

ну где-то так и должно быть, если все работает нормально.

>(при записи через ext2 на /dev/hda1 скорость выше 10 мегабайт в секунду,

если hda1 жесткий диск, то тоже вполне приемлимо.

>но потом - при размере файла больше 10 мегабайт падает).

а вот тут можно уточнить: что именно падает? ничего не должно падать в принципе.

>Получается, что для записи 1540 байт у нас есть 1.5 милисекунды, т.е.
>должно вроде бы хватать. А оно не хватат...

неправильная логика :) вы считаете, что по каждому чиху от приложения ядро будет синхронизировать файловую систему а драйвер соотв. писать на флеш (ATA диск в нашем случае). такой подход более чем неоптимален. для проверки могу предложить настроить драйвер на PIO Mode 0 или подмонтировать файловую систему в полностью синхронном режиме (не знаю, как это делается на Linux). у вас сразу же скорость доступа упадет раз в десять или более :)

да и зачем вам сохранять данные с такой точностью? в реальном времени сохраняйте данные в памяти. сколько нужно столько и отведите. и заведите отдельный поток/процесс, который будет перекачивать данные из буффера на флеш в файл. это наиболее правильный IMHO путь. загрузка системы должна получиться почти нулевая и ничего не будет валиться.

ps: учитывайте, что запись на флеш через ATA идет в блочном режиме. в т.ч. за счет этого вы имеете скорость записи ~1Mb/s.

// wbr

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от dimus Искать по авторуВ закладки(??) on 21-Сен-04, 09:14  (MSK)
А RAID подцепить никак нельзя?
И еще можно попробовать данные хоть немного сжать. Например если они не очень сильно меняются по времени, то можно вместо самих данных писать приращения.
А насчет буферизации klalafuda правильно говорит. Даже если вы хотите писать прямо на винт, то все равно лучше это делать через буфер, причем через БОЛЬШОЙ буфер.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от klalafuda emailИскать по авторуВ закладки on 21-Сен-04, 09:30  (MSK)
>А RAID подцепить никак нельзя?

на плате VIPER? ой наврятли :) да и RAID на базе флеш-дисков..

>И еще можно попробовать данные хоть немного сжать. Например если они не
>очень сильно меняются по времени, то можно вместо самих данных писать
>приращения.

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

// wbr

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от Pablo Искать по авторуВ закладки on 21-Сен-04, 11:03  (MSK)

>
>Есть ли какие-то методы, как ускорить процедуру записи на диск или запись
>напрямую в /dev/hda это самое быстрое, что может быть?
>

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от pari emailИскать по авторуВ закладки(ok) on 21-Сен-04, 13:05  (MSK)
Ого, какая оживленная дискуссия получается. Спасибо всем ответившим.

Отвечаю по-порядку сразу всем.

Никаких дисков (винчестеров) в системе нет - compactflash карта работает в режиме эмуляции ide винта, поэтому доступ осуществляется через /dev/hda.

Сжать данные real-time тоже не удастся. Да и честно говоря, это мало
что даст - шумоподобные данные плохо сжимаются... переменные сигнал.

Теперь о том, почему скорость записи падает. Я несколько неправильно
выразился: это не скорость падает, а увеличивается время возврата из
функции write. Как мы предполагаем, скорость как была, так и осталась,
просто вначале забивался кэш, а потом, когда кэш уже забит - приходиться
скидывать все на flash, и вот тут-то начинаются проблемы.

По-поводу флага O_DIRECT попробуем... О результатах сообщим.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от maxcraft Искать по авторуВ закладки(ok) on 21-Сен-04, 13:21  (MSK)
Поскольку я писал эту ситему, позволю себе несколько уточнить ситуацию. Есть драйвер, который отлавливает прерывание, приходящее с частотой 64 Гц. По прибытии прерывания он посылает сигнал SIGIO программе. Обработчик сигнала в программе посылает по RS485 спец посылку в 6 байт.

Другая часть программы считывает все что приходит по этому же порту и пытается в определенном виде записать данные в файл (в данном случае FIFO). Другая программа считывает данные из этого FIFO, отправляет в TCP/IP socket и записывает на флеш.

Сбой происходит тогда, когда оброботка сигнала задерживается настолько, что высылаемая посылка глушит ответки от внешних датчиков на этой же линии. Експериментально выяснили, что сбоя нет если не писать на диск.

Программа, которая пишет на флеш запущена с меньшим приоритетом, чем программа, собирающая данные.

С системным кешированием все хорошо, пока не надо сбрасывать данные на флеш. Как только надо это сделать сразу начинается работа со сбоями.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от pari emailИскать по авторуВ закладки(ok) on 21-Сен-04, 13:56  (MSK)
Да, вот еще что запущено в системе... Может что-то можно убить без вреда
для здоровья? (lemi415-server это наше творенье - его убивать нельзя)

VmSize Stat Command
  520 S   init
      SW  [keventd]
      SWN [ksoftirqd_CPU0]
      SW  [kswapd]
      SW  [bdflush]
      SW  [kupdated]
      SW  [mtdblockd]
      SWN [jffs2_gcd_mtd3]
      SW  [khubd]
  504 S   dhcpcd eth0
  476 S   /sbin/portmap
  720 S   /sbin/syslogd -p /var/run/log
  552 S   /sbin/klogd
  864 S   /sbin/rpc.statd
  716 S   /sbin/cardmgr
  584 S   /usr/sbin/inetd
  824 S   /usr/sbin/thttpd -C /etc/thttpd.conf
1316 S   /usr/sbin/sshd
  576 S N /usr/local/bin/lemi415-server -v -p 4000
  632 S   /usr/sbin/cron
  500 S   /sbin/getty 38400 tty1
  500 S   /sbin/getty 38400 tty2
  500 S   /sbin/getty 38400 tty3
  500 S   /sbin/getty 38400 tty4
  500 S   /sbin/getty 38400 tty5
  500 S   /sbin/getty 38400 tty6
  516 S   /sbin/getty -L ttyS0 115200 vt100
  576 S N /usr/local/bin/lemi415-server -v -p 4000

  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от klalafuda emailИскать по авторуВ закладки on 21-Сен-04, 14:30  (MSK)
>Да, вот еще что запущено в системе... Может что-то можно убить без
>вреда
>для здоровья? (lemi415-server это наше творенье - его убивать нельзя)

все сильно зависит от вашего здоровья :)

>VmSize Stat Command
>      SWN [jffs2_gcd_mtd3]

не уверен, что jffs2 так уж необходим. ессно только в случае, если у вас все живет на CF (загрузка, система и пр).

>  864 S   /sbin/rpc.statd
>  476 S   /sbin/portmap

убить, если не требуется NFS

>  716 S   /sbin/cardmgr

убить, если не требуется CardBus (afair)

>  720 S   /sbin/syslogd -p /var/run/log
>  504 S   dhcpcd eth0
>  584 S   /usr/sbin/inetd
>  824 S   /usr/sbin/thttpd -C /etc/thttpd.conf
> 1316 S   /usr/sbin/sshd
>  632 S   /usr/sbin/cron
>  500 S   /sbin/getty 38400 tty1
>  500 S   /sbin/getty 38400 tty2
>  500 S   /sbin/getty 38400 tty3
>  500 S   /sbin/getty 38400 tty4
>  500 S   /sbin/getty 38400 tty5
>  500 S   /sbin/getty 38400 tty6

убить, если не требуется соотв. сервисов.

ps: но это вам слабо поможет :) хотя cleanup сама по себе вещь неплохая.

// wbr

  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "как максимально быстро записать данные на flash или вообще н..."
Сообщение от klalafuda emailИскать по авторуВ закладки on 21-Сен-04, 15:55  (MSK)
>Поскольку я писал эту ситему, позволю себе несколько уточнить ситуацию. Есть драйвер,
>который отлавливает прерывание, приходящее с частотой 64 Гц. По прибытии прерывания
>он посылает сигнал SIGIO программе. Обработчик сигнала в программе посылает по
>RS485 спец посылку в 6 байт.
>
>Другая часть программы считывает все что приходит по этому же порту и
>пытается в определенном виде записать данные в файл (в данном случае
>FIFO). Другая программа считывает данные из этого FIFO, отправляет в TCP/IP
>socket и записывает на флеш.
>
>Сбой происходит тогда, когда оброботка сигнала задерживается настолько, что высылаемая посылка глушит
>ответки от внешних датчиков на этой же линии. Експериментально выяснили, что
>сбоя нет если не писать на диск.

ps: при описанном подходе у меня возникает только одно стойкое ощущение - у вас неверно спланирована архитектура железки и сбора данных :) что незамедлительно дало результат. и попытки всеми доступными методами переложить проблему с больной головы на здоровую aka заставить драйвер ATA изображать из себя устройство реального времени, в лучшем случае, отдалит проблему, но никак ее не решит полностью.

// wbr

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру