首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Linux不自动清理磁盘缓存和交换?

为什么Linux不自动清理磁盘缓存和交换?
EN

Unix & Linux用户
提问于 2018-06-22 10:17:50
回答 2查看 6.5K关注 0票数 4

例如,当我存档几组文件(使用tar)时,Linux使用相当多的磁盘缓存(和一些交换),但在操作完成后就不会清理它。因此,由于没有空闲内存,Linux将尝试从内存中交换一些东西,从而在CPU上产生额外的负载。

当然,我可以通过运行echo 1 > /proc/sys/vm/drop_caches来清理缓存,但我必须这么做难道不是很愚蠢吗?

更糟糕的是,交换没有清理未使用的交换的命令,我必须完全禁用/启用它,我认为这样做是不安全的。

UPD:

我做了几次测试,发现了一些事情:

  1. 在归档命令中交换出的内存页与归档文件无关,根据swappiness,这似乎只是由于空闲内存减少(因为磁盘缓存吃掉了所有内存)而导致的通常交换过程。
  2. 运行swapoff -a实际上是安全的,这意味着交换的页面将移回内存。

我的当前解决方案是通过cgroup限制归档命令内存的使用(我运行带有-m标志的docker容器)。如果您不使用docker,那么有一个项目https://github.com/Feh/nocache可能会有所帮助。

剩下的问题是Linux什么时候会清理磁盘缓存,它会不会呢?如果不是,手动清理磁盘缓存(echo 1 > /proc/sys/vm/drop_caches)是否是一个好做法?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-06-22 12:12:05

吹毛求疵:交换使用的CPU时间通常不是很大。当系统在交换过程中响应缓慢时,通常的问题是磁盘时间。

(1)更糟糕的是,交换没有命令来清理未使用的交换

如果要触发并等待交换内存被读入,禁用然后启用交换是一种有效和安全的技术。我只想说“清理未使用的交换”不是正确的描述--这不是你需要做的事情。

交换区的使用率可能比您预期的要高,但这并不意味着它没有被使用。内存页可以同时存储在RAM中和交换区中。这是有充分理由的。

当交换页被读入时,它不会被具体地擦除,它仍然会被跟踪。这意味着,如果需要再次交换页面,并且它自编写为交换后没有更改,则不需要再次写入页面。

这在linux-tutorial.info:内存管理-交换缓存中也有解释。

如果更改或释放内存中的页,则会自动释放交换空间中页的副本。

如果您的系统有相对有限的交换空间和大量的RAM,它可能需要在某个时候从交换空间中删除页面。这是自动发生的。(内核代码:Linux5.0/mm/swap.c:800)

(2)剩下的问题是,Linux什么时候会清理磁盘缓存?如果不是,手动清除磁盘缓存(echo 1>/proc/sys/vm/drop_ cache )是否是一个好做法?

Linux根据需要清理磁盘缓存。当需要内存时,非活动磁盘缓存页将被逐出。

如果您更改了/proc/sys/vm/swappiness的值,您可以改变回收非活动文件缓存和恢复非活动“匿名”(交换支持的)程序内存之间的偏差。默认情况已经对交换产生了偏见。如果您愿意,可以尝试进一步调优系统上的swappiness值。如果您想更多地考虑swappiness所做的事情,下面是一个可能希望将其打开的示例:在文件缓存之前创建或强制tmpfs交换

由于Linux按需清理磁盘缓存,因此通常不建议使用drop_caches。它主要用于测试目的。根据正式文件

此文件不是控制各种内核缓存(inodes、dentries、pagecache等)增长的方法。当系统其他地方需要内存时,内核会自动回收这些对象。使用此文件可能会导致性能问题。由于它丢弃了缓存的对象,因此重新创建被丢弃的对象可能需要花费大量的I/O和CPU,特别是在大量使用的情况下。因此,不建议在测试或调试环境之外使用。

票数 7
EN

Unix & Linux用户

发布于 2018-06-22 11:37:14

这是预期的行为。您可以使用vm.swappiness sysctl调整交换使用,并根据需要对其进行优化。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/451263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档