2012-03-08 13 views
8

Estoy trabajando en una aplicación de grabación de video Linux incorporada que escribe video de formato MP4 en un archivo (en una tarjeta SD de formato FAT).Método de escritura de archivos más eficiente para la grabadora de video Linux

Algunos factores complicados son que los datos de video y audio provienen de códecs de hardware que tienen que ser atendidos con baja latencia y deben escribirse en búferes compatibles con DMA.

En este momento para el archivo de salida utilizo open() y write(), pero encuentro que write() puede tardar cientos de milisegundos en volver cuando el sistema está bajo carga, por lo que mis escrituras se realizan en un hilo separado .

Tal como está, copio datos de los buffers DMA (pequeño, de número limitado) en un búfer circular malloc'd de varios megabytes, luego escribo() desde allí en otro hilo. Esto significa que estoy haciendo al menos dos copias, una vez en el búfer de la aplicación y una vez en la memoria caché del búfer del sistema.

Estoy considerando intentar escribir O_DIRECT para evitar una copia, pero estoy interesado en cualquier comentario. Observo que Robert Love comments that O_DIRECT is terrible pero no dice por qué.

Por otro lado, también me interesaría saber si alguien sabe cómo hacer que write() no se detenga durante periodos de tiempo largos (AIO?), Entonces podría usar el caché del búfer como pretendía Linus.

Esta pregunta no está relacionada con my very old question about write stalls.

+1

El rendimiento de escritura de la tarjeta SD puede variar mucho según el fabricante, el sistema operativo, el tamaño del sector, etc. Tal vez ya haya hecho esto, pero ¿sus escritos se hacen en límites de buen tamaño (por ejemplo, 64 K a la vez)? ¿Ha intentado preasignar el archivo de la tarjeta SD a un tamaño superior al necesario para que los sectores ya se hayan reservado en la FAT? – BitBank

+0

@BitBank Hago escrituras en binario pero todavía no prealloc, estaba pensando en probarlo. ¿Tienes alguna experiencia con eso? – blueshift

+0

Leí en algún lugar sobre retrasos de escritura SD debido a la asignación de sector FAT. – BitBank

Respuesta

2

Si esto es realmente un producto incrustado en que usted controla su fuente de controlador, consideraría seriamente el mmap'ping de la memoria para permitir que el proceso de usuario acceda a la misma memoria que el controlador del dispositivo y evite todas esas copias.

Y here es un ejemplo de implementación del controlador de memoria se comparte con un proceso de espacio de usuario mediante mmap.

+0

El proceso hace mmap() los búferes DMA entrantes. ¿Sugiere usar mmap() para el lado de escritura como alternativa a O_DIRECT? Interesado si tiene alguna experiencia o documentación sobre ese uso. – blueshift

+0

Básicamente, el controlador usaría remap_pfn_range para mapear su memoria para el espacio de usuario. Agregué un enlace a una muestra que encontré a través de Google. – idlethread

Cuestiones relacionadas