问题现象: 在ubuntu系统下,批量执行cp命令后,机子立马断电(arm板),开机后发现文件大小都变为了0kb。但如果是过一会儿再断电,文件大小就正常。 原因: linux这边读写文件都是优先在cache里面的,也就是cache/buffer的机制。当回写进程触发,或者脏数据超时(简单来说就是满足条件触发回写),缓存才会开始把数据写到IO。也就是说执行完cp后,如果有空闲的内存,那么就会默认写到内存里头,如果断电时候,回写没有触发,数据就全部丢失了。 解决方法: 1、执行完cp后,调用sync命令。但是sync也只是告诉系统要开始写IO而已,实际还是异步,所以还是得等。所以可以调用sync后,执行sleep,不过sleep的度不好把控,要根据实际情况自己推算。 如果是大文件的话,可以大文件拆分来写,但也只能解决燃眉之急,如果是arm这种随时断电的机子,还是没法解决。 2、linux后台有守护进程每隔一段时间执行一次sync,那么可以修改或者说缩短sync时间,通过多写来确保数据安全。或者也可以减小cache,让sync的条件更容易触发,来解决这个问题。两个本质上都是提高系统从cache到IO的频率。 3、通过fflush和fsync来实现。 补充: 1、这种很随机的断电操作其实是很致命的,你无法保证关机的时候IO已经结束,个人认为硬件方面加个断电保护才是最可靠有效的。 2、如果没做断电保护,可以每次写的时候先写一次备份,备份写完再COPY到主文件。这样就算断电数据丢失,也能保证主文件和备份至少有一个数据是完整的(只是不能保证数据一定是最新的)。在业务允许的情况下(允许数据不一定要最新),这个方法我觉得反而是最简单有效的。 |
|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )
GMT+8, 2024-11-22 11:41
Powered by Discuz! X3.4
© 2001-2013 Comsenz Inc.