【发布时间】:2017-08-15 12:39:55
【问题描述】:
我一直在开发一些程序,这些程序需要将数据写入/存储到 SDHC 卡上,大小只有几 MB,特别是 Sandisk 4 级 SDHC * Sandisk 10 级 SDHC 16 GB 卡。
我观察到的结果似乎更奇怪。 4 类卡与 10 类卡的写入速度。
使用的命令:
我使用dd命令写入数据;类似:
dd if=file_10mb.img of=/dev/sdc conv=fsync bs=4096 count=2560
通过以下方式测量写入速度:
iostat /dev/sdc 1 -m -t
几个数字:
编写一个 100MB 的文件:
在 10 级卡上:53 秒 -> 平均。写入速度 = 2.03 MB_wrtn/sec
在第 4 类卡上:31 秒 -> 平均。写入速度 = 2.62 MB_wrtn/sec
编写一个 10MB 的文件:
在 10 级卡上:5.7 秒 -> 最长。 & 分钟。写入速度 = 1.85 & 1.15 MB_wrtn/秒
在 4 级卡上:4 秒 -> 最长。 & 分钟。写入速度 = 2.56 & 1.15 MB_wrtn/秒
我预计这些结果会完全相反,因为 10 级卡的性能应该优于 4 级卡。
我已经在两张不同的卡片上进行了测试,以消除由于卡片老化而导致错误读数的可能性。此外,这些卡片相当新。
请让我知道奇怪的行为。提前致谢。
【问题讨论】:
-
你是怎么写数据的?在带有
cp的命令行中,还是来自您编写的程序?贴一些代码(这个网站是关于编程的)。 -
我已经使用dd命令写入数据;类似于:dd if=file_10mb.img of=/dev/sdc conv=fsync bs=4096 count=2560
-
bs=4096 通常太小,与 conv=fsync 一起使用几乎是犯罪行为。使用更大的块(例如 4 MB)并在最后使用单个同步。
-
关键是它在每次写入时强制同步,并且鉴于您的写入非常小(4 KB),您的瓶颈很可能不是实际的设备持续吞吐量,而是所有这些的延迟强制同步。最后进行一次同步可确保操作系统和驱动程序缓冲区做自己的事情,并在您写入时尽可能快地为设备提供数据,但仍确保您正在测量实际写入所有文件所需的时间数据。
-
我能够调查这个问题,并且能够看到“mmcqd”在使用 4 类和 10 类卡时表现不同。当我使用 4 类卡时,kthread 几乎经常占用 CPU 时间。但是在第 10 班的情况下,同样需要比平时更多的时间。因此磁盘 IO 写入速度较慢。还没有弄清楚真正的原因。感谢@Matteo Italia 的投入