我正在开发一个嵌入式 Linux 项目,该项目将 ARM9 连接到硬件视频编码器芯片,并将视频写入 SD 卡或 USB 记忆棒。软件架构涉及将数据读取到缓冲区池中的内核驱动程序,以及将数据写入已安装可移动设备上的文件的用户级应用程序。
我发现在超过一定的数据速率(大约 750kbyte/sec)时,我开始看到用户级视频编写应用程序停止大约半秒,大约每 5 秒。这足以导致内核驱动程序耗尽缓冲区——即使我可以增加缓冲区的数量,视频数据也必须与其他实时发生的事情同步(最好在 40 毫秒内)。在这 5 秒的“滞后峰值”之间,写入在 40 毫秒内完成(就应用程序而言 - 我很欣赏它们被操作系统缓冲)
我认为这个延迟峰值与 Linux 将数据刷新到磁盘的方式有关——我注意到 pdflush 被设计为每 5 秒唤醒一次,我的理解是这就是写作的目的。一旦停顿结束,用户态应用程序就能够快速服务并写入缓冲区的积压(没有溢出)。
我认为我正在写入的设备具有合理的最终吞吐量:从内存 fs 复制 15MB 文件并等待同步完成(并且 USB 棒的指示灯停止闪烁)给了我大约 2.7MBytes/sec 的写入速度。
我正在寻找两种线索:
我怎样才能阻止突发性写入停止我的应用程序——可能是进程优先级、实时补丁或调整文件系统代码以连续写入而不是突发性写入?
如何让我的应用程序知道文件系统在写入积压和卡/棒的吞吐量方面发生了什么?我有能力动态更改硬件编解码器中的视频比特率,这比丢帧或对最大允许比特率施加人为上限要好得多。
更多信息:这是一个 200MHz ARM9,当前运行基于 Montavista 2.6.10 的内核。
更新:
- 挂载文件系统 SYNC 会导致吞吐量太差。
- 可移动媒体为 FAT/FAT32 格式,设计目的必须是媒体可以插入任何 Windows PC 并读取。
- 定期调用 sync() 或 fsync() 说,每秒都会导致定期停顿和不可接受的低吞吐量
- 我正在使用 write() 和 open(O_WRONLY | O_CREAT | O_TRUNC) 而不是 fopen() 等。
- 我无法立即在网上找到有关上述“Linux 实时文件系统”的任何信息。链接?
我希望这是有道理的。关于stackoverflow的第一个嵌入式Linux问题?:)