sho*_*nex 5 linux real-time sd-card fsync ext3
我正在编写一个小应用程序,它在SD卡上以恒定速率写入jpeg图像.我选择了一个EXT3文件系统,但是在EXT2文件系统中观察到了相同的行为.
我的写循环看起来像这样:
get_image()
fwrite()
fsync()
Run Code Online (Sandbox Code Playgroud)
或者像这样:
get_image()
fopen()
fwrite()
fsync()
fclose()
Run Code Online (Sandbox Code Playgroud)
我还显示了一些时序统计信息,我可以看到我的程序有时会被阻止几秒钟.平均速率仍然很好,因为如果我将传入的图像保持为fifo,那么我将在这样的停顿之后的短时间内写出许多图像.您知道操作系统是否存在问题,或者它是否与SD卡本身有关?我怎么能接近实时?我不需要强大的实时性,但是停滞几秒钟是不可接受的.
一些精度:是的,每个文件后都需要fsync,因为我希望图像在磁盘上,而不是在某些用户或内核缓冲区中.没有fsyncing,我有更好的吞吐量,但仍然是不可接受的失速.我不认为这是一个缓冲区问题,因为第一次失速发生在写入50 MB之后.根据手册页,fsync正是为了确保没有数据缓冲.
关于平均写入速率的精确度:我正在以我正在使用的卡可持续的速率写入.如果我在等待fsync完成时堆叠传入的图像,那么在此停顿之后写入传输速率将增加,我将很快回到平均速率.平均传输速率约为1.4 MB/s.
系统是一台现代笔记本电脑运行ubuntu 8.04与库存记录(2.6.24.19)
我在这方面不是很了解,但你描述的症状听起来很像填满缓冲区。您可能正在填充文件写入器或与 SD 卡本身通信的 I/O 设备中的缓冲区。然后,您必须等到它实际将数据写入卡(从而清空缓冲区),然后才能写入更多数据。SD 卡的写入速度并不是特别快。如果您能找到一种方法来检查在这些暂停期间数据是否确实被写入卡,那将验证我的理论。有些读卡器有一个 LED,在访问数据时会闪烁——这可能是一个很好的指示器。
只是一种预感...加点盐:)