例如,当我存档几组文件(使用tar)时,Linux使用相当多的磁盘缓存(和一些交换),但在操作完成后就不会清理它。因此,由于没有空闲内存,Linux将尝试从内存中交换一些东西,从而在CPU上产生额外的负载。
当然,我可以通过运行echo 1 > /proc/sys/vm/drop_caches来清理缓存,但我必须这么做难道不是很愚蠢吗?
更糟糕的是,交换没有清理未使用的交换的命令,我必须完全禁用/启用它,我认为这样做是不安全的。
我做了几次测试,发现了一些事情:
swapoff -a实际上是安全的,这意味着交换的页面将移回内存。我的当前解决方案是通过cgroup限制归档命令内存的使用(我运行带有-m标志的docker容器)。如果您不使用docker,那么有一个项目https://github.com/Feh/nocache可能会有所帮助。
剩下的问题是Linux什么时候会清理磁盘缓存,它会不会呢?如果不是,手动清理磁盘缓存(echo 1 > /proc/sys/vm/drop_caches)是否是一个好做法?
发布于 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,特别是在大量使用的情况下。因此,不建议在测试或调试环境之外使用。
发布于 2018-06-22 11:37:14
这是预期的行为。您可以使用vm.swappiness sysctl调整交换使用,并根据需要对其进行优化。
https://unix.stackexchange.com/questions/451263
复制相似问题