29

刚刚从https://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system学到了这 3 种新技术:


释放页面缓存:

# echo 1 > /proc/sys/vm/drop_caches

要释放 dentry 和 inode:

# echo 2 > /proc/sys/vm/drop_caches

要释放 pagecache、dentries 和 inode:

# echo 3 > /proc/sys/vm/drop_caches

我试图了解什么是 pagecache、dentries 和 inode。它们到底是什么?

释放它们是否也会删除有用的memcached和/或redis缓存?

--

为什么我要问这个问题?我的 Amazon EC2 服务器内存在几天内被填满 - 在 7 天内从 6% 增加到 95%。我必须每两周运行一次 cronjob 来删除这些缓存。然后内存使用率再次下降到 6%。

4

4 回答 4

27

通过一些过度简化,让我尝试在您的问题的上下文中进行解释,因为有多个答案。

看来您正在处理目录结构的内存缓存。上下文中的inode是表示文件的数据结构。dentries是一种表示目录的数据结构。这些结构可用于构建表示磁盘上文件结构的内存缓存。为了得到一个直接的列表,操作系统可以去dentries——如果目录在那里——列出它的内容(一系列的inode)。如果不存在,请转到磁盘并将其读入内存,以便再次使用。

页面缓存可以包含到磁盘上块的任何内存映射。这可能是缓冲的 I/O、内存映射文件、可执行文件的分页区域——操作系统可以从文件中保存在内存中的任何东西。

您的命令会刷新这些缓冲区。

于 2015-04-25T23:38:32.707 回答
7

我试图了解什么是 pagecache、dentries 和 inode。它们到底是什么?

user3344003 已经对这个特定问题给出了准确的答案,但仍然重要的是要注意这些内存结构是动态分配的。

当“空闲内存”没有更好的用途时,内存将用于这些缓存,但当其他一些“更重要”的应用程序想要分配内存时会自动清除和释放。

不,这些缓存不会影响任何应用程序(包括 redis 和 memcached)维护的任何缓存。

我的 Amazon EC2 服务器内存在几天内被填满 - 在 7 天内从 6% 增加到 95%。我必须每两周运行一次 cronjob 来删除这些缓存。然后内存使用率再次下降到 6%。

您可能误解了这种情况:您的系统可能只是在有效利用其资源。

稍微简化一下:“空闲”内存也可以被视为“未使用”,甚至更戏剧化 - 浪费资源:您为它付费,但不使用它。这是一个非常不经济的情况,Linux 内核试图对你的“空闲”内存进行一些“更有用”的使用。

它的部分策略涉及使用它通过使用各种动态大小的内存缓存来保存各种磁盘 I/O。快速访问高速缓存可以节省“缓慢”的磁盘访问,因此这通常是一个有用的想法。

一旦“更重要”的进程想要分配内存,Linux 内核就会自动释放这些缓存,并将内存提供给请求进程。所以通常不需要“手动释放”这些缓存。

Linux 内核甚至可能决定将空闲进程的内存换出到磁盘(交换空间),释放 RAM 以用于“更重要”的任务,可能还包括用作一些缓存。

因此,只要您的系统没有主动换入/换出,就没有理由手动刷新缓存。

“手动刷新”这些缓存的常见情况纯粹是为了进行基准比较:您的第一次基准运行可能会使用“空”缓存运行,因此结果很差,而第二次运行将显示“更好”的结果(由于预热缓存)。通过在任何基准测试运行之前刷新缓存,您正在删除“预热”缓存,因此您的基准测试运行更加“公平”,可以相互比较。

于 2016-05-03T14:52:59.900 回答
2

常见的误解是“空闲内存”很重要。内存是用来使用的。

所以让我们澄清一下:

  • 有已用的内存,这是存储重要数据的地方,如果达到 100%,你就死定了
  • 然后是缓存/缓冲区,只要有空间就可以使用。大多数情况下,更快地访问磁盘文件是兼性内存。如果您用完了可用内存,这将自行释放并让您直接访问磁盘。

按照您的建议清除缓存内存在大多数情况下是无用的,这意味着您正在停用优化,因此您会减慢速度。

如果你真的用完了内存,也就是说,如果你的“已用内存”很高,并且你开始看到交换使用情况,那么你必须做点什么。

但是:在 AWS 实例上运行有一个已知的错误,dentry 缓存在没有明显原因的情况下占用内存。在这个博客中清楚地描述和解​​决了它。

我自己对这个错误的经验是,“dentry”缓存同时消耗“已使用”和“缓存”内存,并且似乎没有及时释放它,最终导致交换。无论如何,错误本身都会消耗资源,因此您需要对其进行调查。

于 2015-11-20T14:13:14.173 回答
0

讨厌让旧线程起死回生,但我最近一直在处理我的 Linux 虚拟机上的内存问题。不幸的是,即使计算机的虚拟化非常好,Linux 内存和资源分配的进步也非常出色,当虚拟机管理程序执行它所谓的“性能特性”时,就会发生冲突。

VMWare 会主动将最近未“写入或修改”的 RAM 发送到磁盘。当您的磁盘位于 SAN 上时,这意味着如果您拥有真正高性能的 RAID 和稳定的网络访问,那么从 RAM 读取的速度现在最多为 1Gbps 到 10Gbps(忽略现在说 100 个 VM 的 RAM 都使用相同的事实)圣)。DDR3 RAM 在现代系统上的运行速度为 25Gbps+,因此我假设您可以看到系统运行速度为预期速度的 1/25 到不到 1/2 的问题。

我的 linux 系统上的缓存实际上与文件系统的磁盘 I/O 速度相同,这意味着它们对我们的性能没有帮助,并且会主动将操作系统的 RAM 发送到交换而不是清除缓存。多亏了 VMWare,这是一个巨大的问题,而不是因为 Linux,但请注意,不幸的是,云基础设施经常像这样愚蠢的废话。您可以在此处阅读更多信息:https ://www.vmware.com/content/dam/digitalmarketing/vmware/en/pdf/techpaper/perf-vsphere-memory_management.pdf或者如果您使用 VMWare,您肯定会注意到“分配的内存”与“活动内存”以及由于内存的这种区别和处理,您的 VM 将始终显示与 VMWare 不同的数量。

于 2019-08-01T18:08:12.750 回答