我正在阅读本文从我的新 Linux 虚拟机中清除缓冲区/缓存,因为它们占用了我 RAM 的 1/3,所以我运行了以下命令:
sync; echo 1 > /proc/sys/vm/drop_caches
这立即解决了问题,所以我将其添加到我的 cronjob 中。该文章说创建一个clearcache.sh
包含以下内容的文件:
#!/bin/bash
# Note, we are using "echo 3", but it is not recommended in production instead use "echo 1"
echo "echo 3 > /proc/sys/vm/drop_caches"
发生什么事了sync
?不需要运行它才能工作吗?为什么会在 cronjob 中回显 echo 来运行该命令?我在命令行上尝试了这个,正如预测的那样,它只是回显了该命令。
# echo "echo 3 > /proc/sys/vm/drop_caches"
echo 3 > /proc/sys/vm/drop_caches
这是我不知道的某种神奇的 cron 功能吗?
答案1
你完全没有理解 Linux 如何使用 RAM 的要点/哲学。
如果 RAM 完全空闲,那么 RAM 就是一种浪费的资源,并且操作系统必须访问 HDD 来获取文件,因此在 Linux 中,它会维护缓冲区和缓存,这些缓冲区和缓存会大量消耗 RAM 以提高性能。
该 RAM 可以随时被进程使用(它实际上是缓存)。
与访问(实际)内存相比,从磁盘读取数据非常慢。此外,在相对较短的时间内多次读取磁盘的同一部分是很常见的。例如,人们可能首先阅读一封电子邮件,然后在回复时将这封信读入编辑器,然后在将其复制到文件夹时让邮件程序再次读取它。或者,考虑命令 ls 在具有许多用户的系统上运行的频率。通过仅从磁盘读取信息一次,然后将其保留在内存中直到不再需要,可以加快除第一次读取之外的所有读取速度。这称为磁盘缓冲,用于此目的的内存称为缓冲区高速缓存。
例子
$ free -hw
total used free shared buffers cache available
Mem: 992M 76M 202M 12M 68M 645M 739M
Swap: 2.0G 0B 2.0G
在此输出中,我的 VM 有约 992MB,其中似乎只有 202MB 可用。但这就是许多人感到困惑/误导的地方。
这个Linux系统实际上有739MB空闲空间(可用栏)。
这怎么可能?
简单的。 Linux 通过将文件、库等保存在 RAM(缓冲区和高速缓存)中来使用 RAM 来提高性能,而不必每次都使用慢速 HDD 来检索这些文件。
Linux 内核以这种方式使用缓冲区和缓存,并且在任何时候,如果内存管理器(内核的一部分)感知到进程需要越来越多 RAM 的压力,内核实际上可以删除正在处理的任何数据。缓存在这里以立即给自己更多的 RAM。
你的问题
至于你的问题与剧本有关clearcache.sh
。答案很简单。这是写这篇文章的人的错字。应该是这样的:
$ echo "echo 3 > /proc/sys/vm/drop_caches" | sudo sh
他们可能从我对这个问题的 U&L Q&A 答案中错误地复制/粘贴了:如何清空 Linux 系统上的缓冲区和缓存?