linux – SD卡写性能

我正在编写一个小应用程序,它在SD卡上以恒定速率写入jpeg图像.
我选择了一个EXT3文件系统,但是在EXT2文件系统中观察到了相同的行为.

我的写循环看起来像这样:

get_image()
fwrite()
fsync()

或者像这样:

get_image()
fopen() 
fwrite()
fsync()
fclose()

我还显示了一些时序统计信息,我可以看到我的程序有时会被阻止几秒钟.
平均速率仍然很好,因为如果我将传入的图像保持为fifo,那么我将在这样的停顿之后的短时间内写出许多图像.您知道操作系统是否存在问题,或者它是否与SD卡本身有关?
我怎么能接近实时?我不需要强大的实时性,但是停滞几秒钟是不可接受的.

一些精度:
是的,每个文件后都需要fsync,因为我希望图像在磁盘上,而不是在某些用户或内核缓冲区中.没有fsyncing,我有更好的吞吐量,
但仍然是不可接受的失速.我不认为这是一个缓冲区问题,因为第一次失速发生在写入50 MB之后.根据手册页,fsync正是为了确保没有数据缓冲.

关于平均写入速率的精确度:
我正在以我正在使用的卡片可持续的速度写作.如果我在等待fsync完成时堆叠传入的图像,那么在此停顿之后写入传输速率将增加,我将很快回到平均速率.
平均传输速率约为1.4 MB / s.

系统是一台现代笔记本电脑运行ubuntu 8.04与库存记录(2.6.24.19)

最佳答案
尝试使用O_DIRECT打开文件并在应用程序级别执行缓存.

当我们在STB Box中实现PVR(个人视频记录)功能时,我们遇到了类似的问题. O_DIRECT技巧最终满足了我们的需求.(*)

没有O_DIRECT. write()的数据首先缓存在内核缓冲区中,然后在调用fsync或内核缓存缓冲区已满时刷新到媒体.(**).

使用O_DIRECT.Th内核将DMA直接作为参数传递给写入系统调用用户空间缓冲区指向的物理内存.因此,在用户空间内存和内核缓存之间的副本中不会占用cpu和内存带宽,并且在内核中不会花费cpu时间来管理缓存(如缓存查找,每页锁等). (从here复制)

不确定它是否也可以解决您的问题,但您可能想尝试一下.

*尽管Linus的O_DIRECT是critize,它确实解决了我们的问题.

**假设您没有使用O_DSYNC或O_SYNC打开文件

相关文章

文件查找(find) 1 find 简单的说,就是实时查找指定的内容或条件。特点:最新、最快、最准确。 用法:...
非交互式添加分区 方法一 添加/deb/sdb 下的分区,其实位置为1到1000M,第二个分区位置为1001至3000M,...
编译安装httpd 1 去官网下载源码包 为避免非法软件,一定要去官网下载http://www.apache.org httpd-2.4...
gdisk用法 gdisk - InteractiveGUIDpartitiontable (GPT) manipulator GPTfdisk (akagdisk) isatext-mo...
1 一定用快捷键 这里简单的说下几个常用的快捷按键。 1.1 移动光标快捷键 Crtl + a 光标回到命令行...
bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立...