Linux机器上的SD卡吞吐量

Linux机器上的SD卡吞吐量,linux,embedded,android-sdcard,hard-drive,Linux,Embedded,Android Sdcard,Hard Drive,我正在尝试在嵌入式Linux平台(Linux 4.1)上运行一个自定义应用程序。此应用程序将1 MB的数据连续写入SD卡(Sandisk UHS I类)。应用程序使用fwrite()调用将数据写入SD卡 下面是我在监控SD卡写入吞吐量时的观察结果 平均传输速率约为每秒10兆字节 每写入50 MB数据后,瞬时吞吐量(每1 MB传输测量)就会下降。吞吐量下降到每秒200KB 我已尝试使用write()系统调用而不是fwrite(),并设置了O_SYNC标志。这样,瞬时吞吐量增加到1MBps SD卡规

我正在尝试在嵌入式Linux平台(Linux 4.1)上运行一个自定义应用程序。此应用程序将1 MB的数据连续写入SD卡(Sandisk UHS I类)。应用程序使用
fwrite()
调用将数据写入SD卡

下面是我在监控SD卡写入吞吐量时的观察结果

  • 平均传输速率约为每秒10兆字节
  • 每写入50 MB数据后,瞬时吞吐量(每1 MB传输测量)就会下降。吞吐量下降到每秒200KB
  • 我已尝试使用
    write()
    系统调用而不是
    fwrite()
    ,并设置了
    O_SYNC
    标志。这样,瞬时吞吐量增加到1MBps
  • SD卡规格说明支持的最小吞吐量为10 MBps。为什么瞬时吞吐量会下降

    这种行为是预期的吗?什么限制了瞬时吞吐量

    我的应用程序要求最小瞬时吞吐量为4MBps。我该怎么办

  • 确保将嵌入式linux设备与SD卡连接的接口和驱动程序支持吞吐量。(例如,当通过“Bitbang”连接时,吞吐量可能比您预期的要小得多)
  • 使用知名工具(dd)测试吞吐量,并在执行以下操作之前刷新缓存: 同步;echo 3 | sudo tee/proc/sys/vm/drop_缓存 dd if=/dev/zero of=bs=500K计数=2024
  • 最后,请参阅:

  • 确保您的文件系统与物理块大小完全一致,确保您写入的缓冲区正好是一个物理块长,并且确保您有足够的缓冲内存来将源代码与卡的闪存转换层想要执行的任何操作解耦。请注意,SD接口的吞吐量与给定卡的写入(提交)速度非常不同-您可能会很快获得那里的数据,但可能需要自己的时间来准备更多数据。谢谢Dan!这些都已经考虑好了,物理块大小是512,写缓冲区是1MB。我同意速度将低于供应商指定的速度,但200KB还是非常小。“物理块大小为512”不,对于任何现代卡来说,它绝对不是那么小。无论你在哪里得到这些信息,都是错误的——它可能反映的是模拟的大小而不是物理的大小,这是减速的主要原因。您希望匹配这两个块的大小,并确保文件系统块与物理块对齐,这在偶然的格式化尝试中很容易成为一个问题。您可能也能负担得起更大的缓冲区。