我们编写在第三方设备上运行的软件。在我们支持的设备之一上,制造商告诉我们不要写入闪存驱动器,否则我们将面临耗尽其支持的有限写入操作的风险。不幸的是,我们应用程序的要求之一是在启动过程中保留一些数据,我们没有其他选择。
我不知道设备内部的驱动器是什么,也不知道它是如何配置的,所以一个问题是我如何才能找到这些信息?我设法找到的一些信息:
bash-3.2$ df | grep mtd /dev/mtdblock5 65536 7824 57712 12% /apps
bash-3.2$ dmesg | grep -i mtd Kernel command line: root=/dev/mtdblock4 rootfstype=jffs2 rw ip=none console= mem=128M init=/sbin/init mtdparts=mtd:512k(bootloader),512k(env),2M(kernel_a),2M(kernel_b),59M(filesystem),64M(user) loglevel=3 panic=5 reboot=h 6 cmdlinepart partitions found on MTD device <NULL> Creating 6 MTD partitions on "<NULL>":
我查看了 proc 和 sysfs,没有发现任何有用的东西。设备环境没有安装任何我能找到的有用工具,例如 hdparam、lshw 等。
另一个问题是是否有任何启发式软件可以用来检测“写入限制”是否正在接近?
最后,在写入磁盘时是否可以观察到任何最佳实践以限制负面影响?例如,小突发写入是否比持续写入操作更好?是数据吞吐量的问题还是文件系统的问题?如果我打开一个文件而不关闭它并继续在那里传输数据,这是否比我为每条新数据打开、写入和关闭更好?
非常感谢您提供的任何帮助,丹。
答案1
如果我打开一个文件而不关闭它并继续在那里传输数据,这是否比我为每条新数据打开、写入和关闭更好?
否。关闭或不关闭缓冲输出的文件对于是否/何时可以从文件中读取数据产生影响,但这与是否/何时将其物理写入磁盘不同。
换句话说,当您刷新文件句柄(例如通过关闭它)时,从同一文件读取的单独进程现在将能够读取您刷新到文件的数据,但这并不一定意味着文件已经被写入由内核输出。如果它正在使用,则它可能已被缓存,并且可能只有该缓存受到影响。
sync
当在整个文件系统上调用时,系统磁盘缓存将被刷新(-> 写出到设备) 。 AFAIK 对于单个文件没有办法做到这一点。
另一个问题是是否有任何启发式软件可以用来检测“写入限制”是否正在接近?
我非常怀疑这一点,特别是因为您对该设备不太了解。这样的数字将是近似和保守的,这就是为什么我的图像设备通常不会在预定义的点发生故障:它们在发生故障时就会发生故障,并且因为它们可以如果在任何时候失败,您不妨尽您所能检查并防止因此造成的损失,而不是假设在~N次操作之前一切都很好。
只要可行就运行fsck
(在挂载文件系统之前)。如果这是一个长时间运行的设备,请确定一种在系统空闲时定期卸载和进行 fsck 的方法。