定时同步和清除缓存有什么问题?

定时同步和清除缓存有什么问题?

因为我的项目中存在文件写入后无法保存到磁盘的情况,所以后台添加了这两个脚本。它们会对系统性能产生影响吗?

我的设备可能经常遇到异常断电而不是重新启动或关闭。我希望异常断电前1秒写入文件的数据也能保存到磁盘上,但实际情况是经常无法保存到磁盘上。

我的设备有 UPS(不间断电源系统)。我正在使用C++编程。

自动同步.sh:

#!/bin/sh

while true; do
    sync
    sleep 1
done

autoCacheFree.sh:

#!/bin/sh

drop_caches() {
    echo "Drop caches."
    sync
    echo 1 > /proc/sys/vm/drop_caches &
    return 0
}

while true; do
    sleep 600
    drop_caches
done

/etc/fstab:

#device         mount-point     type    options         dump    fsck order
/dev/mmcblk3p3  /dobot          ext3    defaults                0       0
/dev/mmcblk3p6  /dobot/userdata ext3    defaults                0       0
proc            /proc           proc    defaults                0       0
tmpfs           /tmp            tmpfs   defaults                0       0
sysfs           /sys            sysfs   defaults                0       0
tmpfs           /dev            tmpfs   defaults                0       0
var             /dev            tmpfs   defaults                0       0
ramfs           /dev            ramfs   defaults                0       0

答案1

autoSync.shsync每秒运行一次;这意味着每秒所有挂起的磁盘写入都会被强制写入磁盘。这所产生的影响取决于底层存储,但在所有情况下,它都会增加写入的数据量:在一般操作中,许多写入最终是不必要的(因为它们被后来接触相同数据的写入所取代,或者它们是对临时文件的写入,这些文件很快就会被删除),并且sync定期运行可以减少避免此类不必要的写入的时间。

autoCacheFree.shsync每十分钟运行一次并清除页面缓存。效果sync与前面讨论的相同。清除pagecache意味着所有后续读取都必须从底层存储中读取,这也会影响性能。

你最好解决根本问题;目前尚不清楚“文件写入后无法保存到磁盘”是什么意思,但我从您编辑的问题中了解到您正在编写一个程序并希望确保它写入的数据尽快存储在磁盘上。正确的方法是调用fsync每次写完你的关心;这将确保这些写入和写入磁盘上的性能影响比脚本小得多。

还要注意,这while sleep ...; do ...; done比 更好while true; do ...; sleep ...; done,因为它更容易停止循环(取消sleep将退出循环)。

相关内容