什么是页面缓存、dentry、inode?

what are pagecache, dentries, inodes?

刚刚从 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

释放页面缓存、dentry 和 inode:

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

我想了解什么是页面缓存、目录和索引节点。它们到底是什么?

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

--

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

由于有多个答案,所以让我尝试在您的问题的上下文中进行一些过于简单化的解释。

您似乎正在使用目录结构的内存缓存。您上下文中的 inode 是表示文件的数据结构。 dentries是一个代表目录的数据结构。这些结构可用于构建表示磁盘上文件结构的内存缓存。要获得直接列表,OS 可以转到目录——如果目录在那里——列出其内容(一系列 inode)。如果没有,就到磁盘上读入内存,这样就可以再次使用了。

页面缓存 可以包含任何到磁盘块的内存映射。可以想象,这可以被缓冲 I/O、内存映射文件、可执行文件的分页区域——任何 OS 可以从文件保存在内存中的东西。

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

常见的误解是 "Free Memory" 很重要。 内存是用来用的。

所以让我们把它弄清楚:

  • 已用内存,这是存储重要数据的地方,如果达到 100%,你就死定了
  • 然后是cache/buffer,只要有space就可以使用。它主要是兼性记忆,可以更快地访问磁盘文件。如果您 运行 没有可用内存,这将自行释放并让您直接访问磁盘。

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

如果你真的 运行 内存不足,也就是说,如果你的 "used memory" 很高,并且你开始看到交换空间的使用,那么你必须做点什么。

HOWEVER:AWS 实例上存在一个已知错误 运行ning,dentry 缓存无缘无故地占用内存。在 this blog.

中有清楚的描述和解决

我自己对这个bug的体验是,"dentry"缓存同时消耗了"used"和"cached"内存,似乎没有及时释放,最终导致swap。无论如何,该错误本身都会消耗资源,因此您需要对其进行调查。

I am trying to understand what exactly are pagecache, dentries and inodes. What exactly are they?

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

当 "free memory" 没有更好的用途时,内存将用于这些缓存,但当其他 "more important" 应用程序想要分配内存时会自动清除和释放。

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

My Amazon EC2 server RAM was getting filled up over the days - from 6% to up to 95% in a matter of 7 days. I am having to run a bi-weekly cronjob to remove these cache. Then memory usage drops to 6% again.

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

稍微简化一下:"free" 内存也可以看作是 "unused",甚至更戏剧化 - 资源浪费:你为此付出了代价,却没有使用它的。这是一个非常不经济的情况,linux 内核试图 "more useful" 使用你的 "free" 内存。

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

只要 "more important" 进程想要分配内存,Linux 内核就会自动释放这些缓存,并使内存可供请求进程使用。所以通常不需要 "manually free" 那些缓存。

Linux 内核甚至可能决定将空闲进程的内存换出到磁盘(交换 space),释放 RAM 以用于 "more important" 任务,也可能包括用作一些缓存。

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

"manually flush" 这些缓存的常见情况纯粹是为了基准比较:您的第一个基准 运行 可能 运行 带有 "empty" 缓存,因此结果不佳,而第二个 运行 将显示很多 "better" 结果(由于预热缓存)。通过在任何基准测试 运行 之前刷新缓存,您将删除 "warmed" 缓存,因此您的基准测试 运行 更 "fair" 可以相互比较。

不想让旧线程起死回生,但我最近一直在处理 Linux 虚拟机上的内存问题。不幸的是,即使计算机的虚拟化非常好并且 Linux 内存和资源分配的进步非常好,当虚拟机管理程序执行它所谓的 "performance features" 时也会发生冲突。

VMWare 会主动将最近 "written or modified" 没有的 RAM 发送到磁盘。当你的磁盘在 SAN 上时,这意味着如果你有一个真正高性能的 RAID 和稳定的网络访问,从 RAM 读取现在最多是 1Gbps 到 10Gbps(忽略现在说 100 个虚拟机的 RAM 都使用相同的事实存储区)。 DDR3 RAM 在现代系统上以 25Gbps+ 的速度运行,因此我假设您可以看到系统 运行 在 1/25 到低于预期速度的 1/2 时出现问题。

我的 linux 系统上的缓存实际上与文件系统的磁盘 I/O 的速度相同,这意味着它们对我们的性能没有帮助,并且正在主动发送 OS 的RAM 进入交换而不是清除缓存。多亏了 VMWare,这是一个大问题,不是因为 Linux,而是要注意,不幸的是,云基础设施经常做这样愚蠢的事情。您可以在此处阅读更多内容:https://www.vmware.com/content/dam/digitalmarketing/vmware/en/pdf/techpaper/perf-vsphere-memory_management.pdf 或者如果您使用 VMWare,您肯定会注意到 "allocated memory" 与 "active memory" 并且由于这种区别,您的 VM 将始终显示与 VMWare 不同的数量和治疗记忆。