【问题标题】:what are pagecache, dentries, inodes?什么是pagecache、dentries、inode?
【发布时间】:2015-07-04 09:22:35
【问题描述】:

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

释放dentries和inode:

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

释放页面缓存、dentries 和 inode:

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

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

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

--

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

【问题讨论】:

  • 这些方法应该与 memcached 或 redis 没有任何关系。这两个应用程序将维护自己的内部缓存机制以向最终用户提供它们的功能,而您的 3 个系统操作是否会影响它们是 Memcached 或 redis 的实现细节。
  • 我对这个线程有点晚了,但很高兴知道您如何确定 95% 的 RAM 已在您的虚拟机中使用。通常有一种误解,即所有物理内存都在我们在这里讨论的缓冲区+缓存中使用。请参阅 link 以获得对这些列的详细说明。
  • Amazon EC2 详细监控报告内存 (RAM) 使用情况,它曾经显示 95% 的使用情况。有时甚至 98-99%
  • @syedrakib 你解决了内存问题吗?
  • @kassav 是的。就像我在问题末尾提到的那样。每隔 1 小时通过 cron 作业运行第三个命令

标签: caching memory redis memcached aws-ec2


【解决方案1】:

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

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

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

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

【讨论】:

  • 所以我明白了,清除这些不会影响 redis 和/或 memcache 的有用内存缓存?
  • 可能不会。在大多数情况下,您确实不需要清除缓存。
  • 我确实这样做了...我的 AWS ec2 RAM 在大约一周内从 5% 增加到 95% 并且从未下降(仍然不知道为什么)...我必须清理这些使用 cronjob 每两周缓存一次
  • 听起来其他东西坏了。在这种情况下,您必须使用这些技巧。
【解决方案2】:

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

所以让我们澄清一下:

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

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

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

但是:在 AWS 实例上运行一个已知的错误,dentry 缓存无缘无故地占用内存。在this blog 中有明确的描述和解决。

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

【讨论】:

  • 你的链接指向一个杀死我浏览器的页面:小心恶意软件。
  • 那个链接失效了
【解决方案3】:

我试图了解 pagecache、dentries 和 索引节点。它们到底是什么?

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案4】:

    不想让旧线程起死回生,但我最近一直在处理我的 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 不同的数量,因为这种区别和处理记忆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2015-02-15
      • 2019-04-09
      • 2010-10-23
      • 2016-03-08
      • 1970-01-01
      • 2012-08-21
      相关资源
      最近更新 更多