什么是pagecache,dentries,inodes?

时间:2015-04-25 19:59:41

标签: caching memory redis memcached aws-ec2

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

释放pagecache:

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

要释放dentries和inode:

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

释放pagecache,dentries和inode:

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

我试图了解究竟是什么页面缓存,dentries和inode。究竟是什么?

释放它们还会删除有用的 memcached 和/或 redis 缓存吗?

-

为什么我问这个问题?我的亚马逊EC2服务器RAM在这些日子里被填满 - 在7天内从6%上升到95%。我不得不运行每两周一次的cronjob来删除这些缓存。然后内存使用量再次下降到6%。

4 个答案:

答案 0 :(得分:17)

由于有些过于简单化,让我试着解释你问题的背景,因为有多个答案。

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

页面缓存 可以包含磁盘上块的任何内存映射。可以想象,这可以是缓冲的I / O,内存映射文件,可执行文件的分页区域 - 操作系统可以从文件中保存在内存中的任何内容。

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

答案 1 :(得分:6)

  

我试图了解究竟什么是pagecache,dentries和   索引节点。究竟是什么?

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

当没有更好地使用"空闲内存"时,内存将被用于那些缓存,但是当其他一些更重要的内容被自动清除和释放时#34;应用程序想要分配内存。

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

  

我的亚马逊EC2服务器RAM在这几天被填满 - 从6%   在7天内达到95%。我不得不每两周举办一次   cronjob删除这些缓存。然后内存使用量再次下降到6%。

可能你错误​​地解释了这种情况:你的系统可能正在有效地利用它的资源。

简化一点:"免费"记忆也可被视为"未使用",甚至更具戏剧性 - 浪费资源:你付出了代价,但却没有使用它。这是一个非常不经济的情况,并且Linux内核试图使一些更有用的"使用你的"免费"存储器中。

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

一旦"更重要"进程想要分配内存,Linux内核自愿释放那些缓存并使内存可供请求进程使用。所以通常不需要手动释放"那些缓存。

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

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

常见的情况是"手动冲洗"这些缓存纯粹是为了进行基准比较:你的第一个基准运行可以用"空"缓存,所以给出差的结果,而第二次运行将显示更多"更好"结果(由于预热缓存)。通过在任何基准测试运行之前刷新缓存,您可以移除"温暖的"缓存,所以你的基准运行更多"公平"相互比较。

答案 2 :(得分:2)

常见的误解是" Free Memory"很重要 记忆意味着使用。

所以,让我们明白:

  • 使用了内存,这是存储重要数据的地方,如果达到100%,那么你已经死了
  • 然后是缓存/缓冲区,只要有空间可以使用它。它的兼容性内存可以更快地访问磁盘文件。如果你的可用内存不足,这将只是自由释放,让你直接访问磁盘。

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

如果你真的没有内存,那就是你的内存"很高,你开始看到交换使用,那么你必须做点什么。

:在AWS实例上运行已知的错误,dentry缓存占用内存没有明显的原因。它已在this blog中清楚地描述和解​​决。

我对这个错误的经验是" dentry"缓存消耗"使用"和"缓存"内存并没有及时释放它,最终导致交换。错误本身无论如何都会消耗资源,所以你需要调查它。

答案 3 :(得分:0)

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

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

我的linux系统上的缓存实际上与文件系统的磁盘I / O速度相同,这意味着它们无助于提高性能,并正在将操作系统的RAM主动发送到Swap中,而不是清除缓存。归功于VMWare,这不是一个Linux,而是一个巨大的问题,但是要意识到,云基础架构经常总是愚蠢的废话。您可以在此处了解更多信息:https://www.vmware.com/content/dam/digitalmarketing/vmware/en/pdf/techpaper/perf-vsphere-memory_management.pdf,或者,如果您使用VMWare,肯定会注意到“已分配内存”与“活动内存”,并且由于这种区别和处理方式,您的VM总是显示与VMWare不同的数量的内存。