美文网首页
Linux下清除文件系统缓存

Linux下清除文件系统缓存

作者: 孤远 | 来源:发表于2019-02-07 18:39 被阅读0次

2018年的最后一段时间,遇到了一个非常棘手的问题,我们的文件系统要定时备份,但这份备份中的数据还原时,文件系统(ext4)中的journal里面有脏数据,理论上非延迟umount可以搞定这个事情(即clean umount,不仅可以将缓存其他干净,还可以将journal刷干净),谁知实际上"不是"(后来才解开这个疑惑,否则我们做文件系统的就要开始怀疑人生了),后来,经历了很多的尝试,基本上都是我在黑暗中摸索,每一条路走投无路的时候找人讨论一下,继续尝试下一条思路。

下面举一个例子,这只是其中一条路,我们的文件系统是用户态的,并且,不仅仅是用户态的,而且还是运行在docker容器里面的。

我们经历了很多,走到这里,是基于这样的现象了,把容器stop掉之后,发现journal能够刷干净,但是走文件系统的poweroff之后(实际的动作是umount容器里的ext4的挂载点),journal就有脏数据。

因此,我把现象概括描述了一下,post到了攻关小组里,有一位17j专家,提供了一条尝试思路,就是在容器里面在poweroff之后,先执行sync,再执行drop_caches,就是下面要说的了,请看:

1、sync

2、echo 3 > /proc/sys/vm/drop_caches

关于drop_caches文件:系统默认为0

drop_caches

Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.

To free pagecache:仅清除页面缓存(PageCache)

echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:清除目录项和inode

echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:清除页面缓存,目录项和inode

echo 3 > /proc/sys/vm/drop_caches

As this is a non-destructive operation and dirty objects are not freeable, the user should run `sync' first.

后记:  实际上问题并不在这里,因为,它不能解释一个简单的问题——既然容器里poweroff的时候ext4分区已经被umount了,唯一的引用点都被解藕了,sync和drop_caches又把缓存刷到哪里去了呢?!除非,umount并没有真正的把ext4分区umount掉,不对呀,进入到容器里查看,挂载点没有了啊。

那就是umount掉了,为了证明上面的那个简单的问题,如何才能证明呢??

一条命令,iostat -xdm 1。

开多个命令行窗口,在每一个动作(三个动作poweroff、sync、drop_caches)执行的同时,监控落盘的io。

iostat是最粗粒度的监控落盘io,如果想进一步监控,比如哪个进程或者哪个文件的io,可以到网上搜一下,有方法,我也看到了,这里只提供一个思路,原来还可以这样,只不过对于我要证明的问题,iostat就够了。

iostat的监控结果:

poweroff有io落盘;

sync没有io落盘;

echo 3 > /proc/sys/vm/drop_caches没有io落盘;

到处,这一条路也就走到头了,又走投无路了。

那么,特么的journal里面的数据到底是哪里的呢????????

山重水复疑无路,柳暗花明又一村。

真真的是"车到山前必有路",黑夜给了我黑色眼睛,我再一次进入到黑暗中摸索。

后来,事情的真相竟然有点让我喜极而泣,我们为了最小影响用户文件系统的卡io的时间(也就是poweroff到poweron的时间),poweroff之后sleep 1秒之后就poweron了,殊不知这个时候底层备份的接口,快照还没有ok,就poweron了,journal里的脏数据就是这样来的。

跟备份的同事沟通,同样认为快照一般是很快的,但是1秒的时间不能保证,最好的方法是底层有个接口check,check快照ok之后再poweron。

长叹一口气,花费了我那么多的时间,不过也是有经验积累,算是工作经历中的一个难得的经历。

问题的答案往往在问题的相邻层面(德国某战略家),但是只有你经历过千帆侧畔,你才能有这样的战略眼光,一下子看到问题的要害,一击必中。

相关文章

  • Linux下清除文件系统缓存

    2018年的最后一段时间,遇到了一个非常棘手的问题,我们的文件系统要定时备份,但这份备份中的数据还原时,文件系统(...

  • Linux命令学习

    1、Linux查看日志命令 2、Linux系统清除缓存命令 3、securityCRT For Mac破解版下载 ...

  • I/O访问方式

    缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/...

  • 清除linux系统缓存

    echo 2 > /proc/sys/vm/drop_caches echo 1 > /proc/sys/vm/...

  • linux定时清除缓存

    引言 如果你的服务器出现cache过多的情况或者服务器内存不足的情况,请参考这篇。 1、创建清除缓存shell执行...

  • 清理缓存

    //清除缓存 - (void)removeCache { //===============清除缓存=======...

  • Linux使用yum命令安装jdk1.8

    Linux使用yum命令安装jdk1.8 使用yum clean all 清除YUM缓存 yum makecach...

  • Linux系统IO模型

    1、linux文件系统和缓存 文件系统接口 文件系统—一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接...

  • linux下的IO模型---学习笔记

    1、linux文件系统和缓存 文件系统接口 文件系统—一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接...

  • 【Linux】3. Linux文件目录介绍

    Windows 和 Linux 文件系统区别 -- 结构 Windows 下的文件系统 - 在 Windows 下...

网友评论

      本文标题:Linux下清除文件系统缓存

      本文链接:https://www.haomeiwen.com/subject/oedgsqtx.html