Contents

清空Linux中的缓冲区和缓存

1. 简介

Linux 文件系统缓冲区和缓存的使用使 I/O 操作更快。很明显,当我们谈论如何清除缓冲区和缓存时,我们将毫无疑问地检查缓存是如何工作的。

因此,首先,我们将讨论 Linux 文件系统缓存的工作原理。然后,我们将演示如何监控缓存使用情况,最后,我们将演示如何清空缓冲区和缓存。我们还将进行一些基本的展示分析,以检查缓存是否按格式工作,以及缓存刷新和清空方法是否也按格式进行填充。

2. Linux 文件系统缓存是如何工作的

**Linux 中的缓存称为Page Cache。**它是内核为缓存文件系统磁盘访问而保留的一定数量的系统内存。这是为了使整体性能更快。在 Linux 读取系统调用期间,内核检查缓存是否包含请求的数据块。如果是这样,那么这将是一次成功的缓存命中。缓存返回此数据而不对磁盘系统执行任何 I/O。

Linux 缓存方法称为回写缓存。这意味着首先,数据被写入缓存并标记为脏,直到同步到磁盘。然后,内核维护内部数据结构,以优化当缓存需要任何额外空间时从缓存中驱逐哪些数据。例如,当内存使用量达到某个阈值时,后台任务开始将脏数据写入磁盘,从而清空内存缓存。

2.1. 缓冲区和缓存中有什么

术语缓存和缓冲有时可以互换使用*。*但是,仍然必须知道将缓冲区与高速缓存区分开来的内在事实。

在广义的分类下,缓冲区是用于在从一个地方移动到另一个地方时临时存储数据的内存区域。缓冲区是存储在页面缓存下的数据的磁盘块表示。此外,缓冲区包含位于页面缓存下的文件或数据的元数据。

另一方面,缓存是一个临时存储区域,用于存储经常访问的数据以供快速访问。

2.2. 使用free 命令查看缓冲区和缓存使用情况

Linux free命令有助于分析系统内存量以及分配给缓冲区和缓存的内存:

# free -m
             total        used        free      shared  buff/cache   available
Mem:          7457         209         6580          0         667        7004
Swap:           0           0           0

我们从free命令中看到的是有 7.5 GB 的总 RAM。其中,只有 209 MB 正在使用,6.5 GB 是免费的。缓冲区和高速缓存正在使用这 667 MB。现在,让我们尝试通过运行命令来生成和读取 1 GB 的文件来增加该数字:

# dd if=/dev/random of=/root/data_file count=1400000
# for i in `seq 1 10`; do echo $i; cat data_file >> large_file; done

现在,我们将确保读取这个 1 GB 的文件并再次使用free命令检查使用情况:

# cat large_file > /dev/null; free -m
             total        used        free      shared  buff/cache   available
Mem:          7457         206         5515          0        1735        6992
Swap:           0           0           0

我们可以看到缓冲区和缓存的使用量从 667 MB 增加到 1735 MB,大约增加了 1 GB。

2.3. 缓存工作原理的实验验证

让我们做一些性能验证,看看内核是如何使用缓存读取文件的?让我们读取一个文件并将其写回*/dev/null*以测试从磁盘读取文件需要多长时间。我们将使用time 命令对其进行计时:

# ls -l
total 525448
-rw-r--r-- 1 root root  49032472 Nov 20 09:13 data_file
-rw-r--r-- 1 root root 490324720 Nov 20 09:15 large_file
# time cat large_file >> /dev/null
real    0m4.478s
user    0m0.004s
sys     0m0.388s

读取文件需要 4.478 秒。让我们再读一遍。由于该文件位于文件系统缓存中,因此看看现在需要多长时间会很有趣:

# time cat large_file >> /dev/null
real    0m0.602s
user    0m0.002s
sys     0m0.393s

缓存文件时读取文件只用了 0.602 秒。 不言而喻,缓冲区和缓存的使用使 I/O 操作更快。

3. 如何清空缓冲区、缓存和交换

磁盘缓存使系统更快,响应更快!但众所周知,磁盘缓存会导致某些性能瓶颈。真正的问题出现在 Linux 积极开始缓存到其内存中时。在这种情况下,可以观察到可用于分配给正在运行的应用程序的可用内存较少。

这种内存压力会导致系统开始进行交换。当页面缓存变得非常大(比当前的交换使用量大很多)时,会轮流进行换入和换出。这是需要放置缓存的时候。

3.1. Proc Sys VM 删除缓存命令

如果我们想清空缓冲区和缓存,我们可以使用这个命令链:

free && sync && echo 3 > /proc/sys/vm/drop_caches && free

我们刚刚看到的是一种丢弃缓存的方法。Linux 内核可以通过三种方式删除缓存项。每一种都是删除不同缓存项的方法。而且,只需将数字参数更改为echo命令即可。

我们可以使用echo 1来释放page cache

echo 1 > /proc/sys/vm/drop_caches

我们可以使用echo 2来释放dentriesinode

echo 2 > /proc/sys/vm/drop_caches

而且,我们可以使用echo 3来释放page cache、dentriesinode

echo 3 > /proc/sys/vm/drop_caches

3.2. 清除交换的命令

在某些情况下,我们可能会遇到必须清除掉期的情况。在讨论禁用或启用交换的命令之前,我们必须知道文件系统内存的哪一部分称为交换。交换空间临时保存从系统 RAM 移出的数据。

在 Linux 中,当物理内存 (RAM) 已满时,数据将成为交换的一部分。如果系统需要更多内存资源并且 RAM 已满,则内存中的非活动页面将移至交换空间。现在,让我们看一下禁用或启用交换的命令:

swapoff -a && swapon -a