- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在开发一个嵌入式 Linux 项目,该项目将 ARM9 连接到硬件视频编码器芯片,并将视频写入 SD 卡或 USB 内存棒。软件架构包括一个将数据读入缓冲区池的内核驱动程序,以及一个将数据写入已安装可移动设备上的文件的用户态应用程序。
我发现在超过一定的数据速率(大约 750kbyte/sec)时,我开始看到用户空间视频编写应用程序可能会停顿半秒,大约每 5 秒停顿一次。这足以导致内核驱动程序用完缓冲区 - 即使我可以增加缓冲区的数量,视频数据也必须与其他实时发生的事情同步(最好在 40 毫秒内)。在这 5 秒的“滞后尖峰”之间,写入在 40 毫秒内完成(就应用程序而言 - 我感谢它们被操作系统缓冲)
我认为这种滞后峰值与 Linux 将数据刷新到磁盘的方式有关 - 我注意到 pdflush 设计为每 5 秒唤醒一次,我的理解是这将是写入的内容。一旦停顿结束,用户空间应用程序就能够快速服务并写入缓冲区积压(没有溢出)。
我认为我正在写入的设备具有合理的最终吞吐量:从内存 fs 复制一个 15MB 的文件并等待同步完成(并且 USB 棒的灯停止闪烁)给了我大约 2.7MBytes 的写入速度/秒。
我在寻找两种线索:
我如何才能阻止突发写入导致我的应用程序停滞 - 也许是进程优先级、实时补丁,或者调整文件系统代码以连续写入而不是突发写入?
如何让我的应用程序了解文件系统在写入积压和卡/棒吞吐量方面的情况?我可以在硬件编解码器中即时更改视频比特率,这比丢帧或人为限制最大允许比特率要好得多。
更多信息:这是一个 200MHz 的 ARM9,当前运行基于 Montavista 2.6.10 的内核。
更新:
我希望这是有道理的。关于 stackoverflow 的第一个嵌入式 Linux 问题? :)
最佳答案
根据记录,除了最极端的情况外,有两个主要方面似乎已经消除了所有问题。该系统仍在开发中,尚未经过彻底的酷刑测试,但运行良好(摸木头)。
最大的胜利来自于使 userland writer 应用程序成为多线程的。有时会阻塞的是对 write() 的调用:其他进程和线程仍在运行。只要我有一个线程为设备驱动程序提供服务并更新帧数和其他数据以与正在运行的其他应用程序同步,数据就可以被缓冲并在几秒钟后写出,而不会破坏任何截止日期。我首先尝试了一个简单的乒乓双缓冲区,但这还不够;小缓冲区会被淹没,而大缓冲区只会在文件系统消化写入时造成更大的暂停。在线程之间排队的 10 个 1MB 缓冲区池现在运行良好。
另一方面是关注物理介质的最终写入吞吐量。为此,我一直在关注 Dirty 统计数据:由/proc/meminfo 报告。如果 Dirty: 爬升到某个阈值以上,我有一些粗略的现成代码来限制编码器,似乎模糊地工作。稍后需要进行更多测试和调整。幸运的是,我有很多 RAM (128M) 可以玩,给我几秒钟的时间来查看我的积压工作并顺利减少。
如果我发现我需要做任何其他事情来处理这个问题,我会尽量记得弹出并更新这个答案。感谢其他回答者。
关于linux - 突发写入 SD/USB 使我在嵌入式 Linux 上的时间关键型应用程序停滞不前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/78157/
我是 C 语言新手,我编写了这个 C 程序,让用户输入一年中的某一天,作为返回,程序将输出月份以及该月的哪一天。该程序运行良好,但我现在想简化该程序。我知道我需要一个循环,但我不知道如何去做。这是程序
我一直在努力找出我的代码有什么问题。这个想法是创建一个小的画图程序,并有红色、绿色、蓝色和清除按钮。我有我能想到的一切让它工作,但无法弄清楚代码有什么问题。程序打开,然后立即关闭。 import ja
我想安装screen,但是接下来我应该做什么? $ brew search screen imgur-screenshot screen
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将
我有一个 shell 脚本,它运行一个 Python 程序来预处理一些数据,然后运行一个 R 程序来执行一些长时间运行的任务。我正在学习使用 Docker 并且我一直在运行 FROM r-base:l
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将
对于一个类,我被要求编写一个 VHDL 程序,该程序接受两个整数输入 A 和 B,并用 A+B 替换 A,用 A-B 替换 B。我编写了以下程序和测试平台。它完成了实现和行为语法检查,但它不会模拟。尽
module Algorithm where import System.Random import Data.Maybe import Data.List type Atom = String ty
我想找到两个以上数字的最小公倍数 求给定N个数的最小公倍数的C++程序 最佳答案 int lcm(int a, int b) { return (a/gcd(a,b))*b; } 对于gcd,请查看
这个程序有错误。谁能解决这个问题? Error is :TempRecord already defines a member called 'this' with the same paramete
当我运行下面的程序时,我在 str1 和 str2 中得到了垃圾值。所以 #include #include #include using namespace std; int main() {
这是我的作业: 一对刚出生的兔子(一公一母)被放在田里。兔子在一个月大时可以交配,因此在第二个月的月底,每对兔子都会生出两对新兔子,然后死去。 注:在第0个月,有0对兔子。第 1 个月,有 1 对兔子
我编写了一个程序,通过对字母使用 switch 命令将十进制字符串转换为十六进制,但是如果我使用 char,该程序无法正常工作!没有 switch 我无法处理 9 以上的数字。我希望你能理解我,因为我
我是 C++ 新手(虽然我有一些 C 语言经验)和 MySQL,我正在尝试制作一个从 MySQL 读取数据库的程序,我一直在关注这个 tutorial但当我尝试“构建”解决方案时出现错误。 (我正在使
仍然是一个初学者,只是尝试使用 swift 中的一些基本函数。 有人能告诉我这段代码有什么问题吗? import UIKit var guessInt: Int var randomNum = arc
我正在用 C++11 编写一个函数,它采用 constant1 + constant2 形式的表达式并将它们折叠起来。 constant1 和 constant2 存储在 std::string 中,
我用 C++ 编写了这段代码,使用运算符重载对 2 个矩阵进行加法和乘法运算。当我执行代码时,它会在第 57 行和第 59 行产生错误,非法结构操作(两行都出现相同的错误)。请解释我的错误。提前致谢:
我是 C++ 的初学者,我想编写一个简单的程序来交换字符串中的两个字符。 例如;我们输入这个字符串:“EXAMPLE”,我们给它交换这两个字符:“E”和“A”,输出应该类似于“AXEMPLA”。 我在
我需要以下代码的帮助: 声明 3 个 double 类型变量,每个代表三角形的三个边中的一个。 提示用户为第一面输入一个值,然后 将用户的输入设置为您创建的代表三角形第一条边的变量。 将最后 2 个步
我是新来的,如果问题不好请见谅 任务:将给定矩阵旋转180度 输入: 1 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出: 16 15 14 13 12 11
我是一名优秀的程序员,十分优秀!