我正在使用运行 Linux 2.6 的 ARM 机器(不幸的是我一直使用这个内核版本)。这些盒子从 SD 卡启动,并使用辅助 SD 卡进行存储。这些盒子有大约 256MB 的内存。
两张SD卡都用dm-crypt加密,但我不认为这对读/写性能有重大影响,因为在我实现磁盘加密之前,性能非常糟糕。我没有确切的数字来支持这一说法,但仅举个例子,在不使用 dm-crypt 的情况下,将 1GB 写入 SD 卡将需要一个多小时。
正常使用情况下,读写速度足够好。然而,某些任务(例如从源代码构建软件)往往会锁定 I/O 操作,一次锁定几分钟。具体来说,我认为写入操作是长时间阻塞的操作。我终于找到了iostat这个工具,它提供了一些有用的信息。
当程序(例如:配置脚本)被阻止时,我可以运行watch iostat
.观察 Blk_wrtn 字段似乎可以确认导致锁定的瓶颈是写操作。具体来说,在阻塞写入操作期间,dm-1 设备(第二个 SD 卡的未锁定分区)写入了 N 个块,而 mmcblk1(第二个 SD 卡)写入了 M 个块,其中 M < N。M 的增加如下:时间流逝,直到最终等于N,此时写操作完成,程序继续执行。截至撰写本文时,mmcblk1 和 dm-1 的 Blks_wrtn/s 约为 10。
我从这个观察中得出结论,块立即写入 dm-1 伪设备,然后刷新到物理磁盘;此冲洗操作花费的时间比应有的时间要长。
这些是我尝试过/考虑过的尝试提高 SD 卡写入性能的选项:
- 升级到具有更好驱动程序/性能的更新内核:我很想拥有更新内核,但我们坚持使用制造商提供的内容。我仍在尝试弄清楚是否可以使用更新的内核。
- 对SD卡使用不同的IO调度程序:我尝试在deadline、CFQ和noop之间切换,性能上没有明显差异。
- 使用更高级别的SD卡:我实际上不确定制造商提供的SD卡是什么级别,但我尝试过改用4级SD卡,具有相同的性能。我不认为SD卡本身是瓶颈;有可能读者本身就是瓶颈,但我不知道如何检查这一点。
- 在 SD 卡上使用不同的文件系统:我目前使用的是 Ext4。不同的文件系统会产生重大差异吗?
有什么办法可以提高写入 SD 卡的速度吗?
答案1
如果您有足够的可用 RAM,则可以从 RAM 运行 /tmp。
它会在编译时或使用 /tmp 中使用临时套接字的守护进程时为您带来性能提升。
另一种策略是指示 syslog 根本不记录(这不是最好的想法),或者更好的是,将日志发送到远程服务器。对于可能的基于磁盘的数据库也是如此。
还要注意日志文件,根据 syslog 守护进程和配置,在几个 syslog 文件中写入一行可能会触发/强制该文件的 fsync。
另请参阅是否存在不必要的守护进程,或者 RAM 较低,例如,在不需要时停止 Web 服务器可能会有所回报。
关于卡,价格已经下降到足以使用 Class 10 卡。