当前位置: 首页 > 面试题库 >

Bursty写入SD / USB使我的时间紧迫的应用程序停滞在嵌入式Linux上

章安宜
2023-03-14
问题内容

我正在从事一个嵌入式Linux项目,该项目将ARM9连接到硬件视频编码器芯片,并将视频写到SD卡或USB记忆棒中。该软件体系结构包括将数据读入缓冲池的内核驱动程序,以及将数据写入已安装的可移动设备上的文件的用户态应用程序。

我发现在一定的数据速率(大约750kbyte /
sec)以上时,我开始看到userland视频编写应用程序停顿了大约半秒钟,大约每5秒钟。这足以使内核驱动程序用尽缓冲区-
即使我可以增加缓冲区的数量,也必须将视频数据与实时进行的其他事情同步(最好在40ms之内)。在这5秒的“滞后尖峰”之间,写入在40ms内完成得很好(就应用程序而言-
我感谢它们被操作系统缓冲)

我认为这种延迟高峰与Linux将数据刷新到磁盘的方式有关-
我注意到pdflush设计为每5秒唤醒一次,我的理解是,这就是编写的内容。一旦停滞结束,userland应用程序便能够快速服务并编写缓冲区的积压(未溢出)。

我认为我正在写入的设备具有合理的最终吞吐量:从内存fs复制15MB文件并等待同步完成(并且USB记忆棒的光停止闪烁)使我的写入速度约为2.7MBytes /
sec。

我正在寻找两种线索:

  1. 如何阻止突发写入停止我的应用程序-可能处理优先级,实时补丁或调整文件系统代码以连续写入而不是突发写入?

  2. 如何使我的应用程序从写入积压和卡/棒的吞吐量方面了解文件系统的状况?我可以即时更改硬件编解码器中的视频比特率,这比丢弃帧或对最大允许比特率施加人为上限要好得多。

更多信息:这是一个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问题?:)


问题答案:

据记录,除了最极端的情况外,似乎有两个主要方面消除了这个问题。该系统仍在开发中,尚未经过严格的折磨测试,但运行良好(触摸木头)。

最大的胜利来自使userland
writer应用程序成为多线程。有时会阻塞对write()的调用:其他进程和线程仍在运行。只要我有一个线程为设备驱动程序提供服务并更新帧数和其他数据以与正在运行的其他应用程序同步,就可以在几秒钟后对数据进行缓冲和写出,而不会中断任何截止日期。我首先尝试了一个简单的乒乓双缓冲,但这还不够。小缓冲区将不堪重负,大缓冲区将导致较大的暂停,而文件系统消化了写入操作。在线程之间排队的10个1MB缓冲区池现在运行良好。

另一方面是关注物理介质的最终写入吞吐量。为此,我一直关注stat脏:/ proc /
meminfo报告。如果“脏”,我有一些粗糙的现成代码可以限制编码器:爬到某个阈值之上,似乎可以正常工作。以后需要更多测试和调整。幸运的是,我有很多RAM(128M)可以玩,给了我几秒钟的时间来查看积压的积压和平稳地减少油压。

如果我发现需要采取其他措施来解决此问题,我会尽量记住弹出并更新此答案。多亏了其他回答者。



 类似资料:
  • 问题内容: 我有一个蜂巢查询,我很难弄清楚。 我有一个类似的时间序列: 我需要一个查询,以便如果其中一个记录满足特定条件,则除了该记录外,它还应从第二个满足一组不同条件的 时间上及时 返回一个或多个记录。 到目前为止,我的尝试看起来像这样: 哪个应该返回上面示例数据中的第一条记录和第二条记录(它不应该返回第三条记录,因为时间要比.001秒远)。 但是查询不起作用。错误消息是 问题答案: 这将是一个

  • 问题内容: 我遵循了h2数据库网站上的快速入门指南,在表中创建了一个新数据库并插入了一些数据。该应用程序运行流畅,可以毫无问题地读写数据库。 将h2 * .jar添加到类路径(H2没有任何依赖关系) 使用JDBC驱动程序类:org.h2.Driver 数据库URL jdbc:h2:〜/ test在用户主目录中打开数据库测试 自动创建一个新的数据库 现在,我想使用Web前端h2控制台查看数据,但是每

  • 问题内容: 我正在尝试在应用程序中运行嵌入式ApacheDS。阅读http://directory.apache.org/apacheds/1.5/41-embedding- apacheds-into-an- application.html之后, 我将其构建为: 但是运行服务器后我无法连接到服务器。默认端口是什么?还是我错过了什么? 解决方法如下: 问题答案: 我无法同时使用cringe,Ke

  • 问题内容: 我的目标是让Limewire(JAVA)和Songbird(XULRunner)一起运行。 我当时想最好的方法是在JAVA摆动面板中运行XUL应用程序(songbird)。还有另一种方法吗? 将GUI完全放在XUL中,然后以某种方式访问​​我的JAVA对象会更好还是可行? 我将如何去做呢? 谢谢 问题答案: 看一看JRex,它可能会让您窥探到两个想法。 除此之外,我还将研究Rhinoh

  • 我无法在物理SD卡上写入文件。我想请求用户写入整个SD卡的权限。用户授予权限。现在我想在SD卡上的特定目录中创建文件(目录已经存在)。当我尝试打开输出流时,我得到异常: Java。Lang.SecurityException:权限拒绝:正在写入com . Android . external stage . external stage provider uri content://com . A

  • 这是pom.xml的配置: 编辑:我在日志顶部有以下stacktrace: