jjzjj

linux - 突发写入 SD/USB 使我在嵌入式 Linux 上的时间关键型应用程序停滞不前

coder 2023-06-17 原文

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

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

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

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

我在寻找两种线索:

  1. 我如何才能阻止突发写入导致我的应用程序停滞 - 也许是进程优先级、实时补丁,或者调整文件系统代码以连续写入而不是突发写入?

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

更多信息:这是一个 200MHz 的 ARM9,当前运行基于 Montavista 2.6.10 的内核。

更新:

  • 安装文件系统 SYNC 会导致吞吐量太低。
  • 可移动媒体是 FAT/FAT32 格式,并且必须是因为设计的目的是该媒体可以插入任何 Windows PC 并读取。
  • 定期调用 sync() 或 fsync() 说,每秒都会导致定期停顿和 Not Acceptable 低吞吐量
  • 我正在使用 write() 和 open(O_WRONLY | O_CREAT | O_TRUNC) 而不是 fopen() 等。
  • 我无法立即在网上找到任何关于提到的“Linux 实时文件系统”的信息。链接?

我希望这是有道理的。关于 stackoverflow 的第一个嵌入式 Linux 问题? :)

最佳答案

根据记录,除了最极端的情况外,有两个主要方面似乎已经消除了所有问题。该系统仍在开发中,尚未经过彻底的酷刑测试,但运行良好(摸木头)。

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

另一方面是关注物理介质的最终写入吞吐量。为此,我一直在关注 Dirty 统计数据:由/proc/meminfo 报告。如果 Dirty: 爬升到某个阈值以上,我有一些粗略的现成代码来限制编码器,似乎模糊地工作。稍后需要进行更多测试和调整。幸运的是,我有很多 RAM (128M) 可以玩,给我几秒钟的时间来查看我的积压工作并顺利减少。

如果我发现我需要做任何其他事情来处理这个问题,我会尽量记得弹出并更新这个答案。感谢其他回答者。

关于linux - 突发写入 SD/USB 使我在嵌入式 Linux 上的时间关键型应用程序停滞不前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/78157/

有关linux - 突发写入 SD/USB 使我在嵌入式 Linux 上的时间关键型应用程序停滞不前的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  9. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  10. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

随机推荐