【发布时间】:2016-03-17 19:57:09
【问题描述】:
我正在尝试在嵌入式 Linux 平台 (Linux 4.1) 上运行自定义应用程序。此应用程序将 1 MB 的数据连续写入 SD 卡(Sandisk UHS I 类)。应用程序使用fwrite() 调用将数据写入 SD 卡。
以下是我在监控 SD 卡写入吞吐量时的观察结果。
- 平均吞吐量约为每秒 10 MB。
- 每写入 50 MB 数据后,瞬时吞吐量(每 1 MB 传输测量)就会下降。吞吐量下降到每秒 200kbytes。
- 我尝试使用
write()系统调用而不是fwrite(),并设置了O_SYNC标志。如此一来,瞬时吞吐量已增加到 1MBps。
SD 卡规范规定支持的最小吞吐量为 10 MBps。为什么瞬时吞吐量下降?
这是预期的行为吗?什么限制了瞬时吞吐量?
我的应用程序需要 4MBps 的最小瞬时吞吐量。我该怎么办?
【问题讨论】:
-
确保您的文件系统真正与物理块大小对齐,确保您写入的缓冲区正好是一个物理块长,并确保您有足够的缓冲内存来将源与卡的闪存分离翻译层感觉像在做。请注意,SD 接口的吞吐量与给定卡的写入(提交)速度非常不同 - 您可能会很快将数据拿到那里,但它可能需要自己的甜蜜时间来准备更多。
-
谢谢丹!这些东西已经处理好了,物理块大小为 512 ,写缓冲区为 1MB 。我同意速度会低于供应商指定的速度,但 200KB 仍然非常少。
-
"物理块大小是 512" 不,对于任何现代卡来说绝对不是那么小。无论您从何处获得该信息,它都是错误的 - 它可能反映的是 模拟 大小而不是物理大小,这是放慢速度的主要嫌疑人。您希望同时匹配块大小,并确保文件系统块与物理块对齐,这很容易成为随意格式化尝试的问题。您也可以负担得起更大的缓冲区。
标签: linux embedded android-sdcard hard-drive