Linux 在进行大型 IO 操作时会积极交换

Linux 在进行大型 IO 操作时会积极交换

当我执行大型 IO 操作(例如从外部驱动程序或内部磁盘上复制大文件/向其复制大文件)时,我的 Debian 10 桌面系统上遇到了一个奇怪的问题。

我可以将其归结为以下简单情况:

sudo dd if=/dev/sdb of=/dev/null

当我发出此命令来读取驱动器 /dev/sdb 的所有内容(例如插入的 USB 驱动器,但也可以 /dev/sda 内部驱动器)时,我可以在例如 htop 中看到系统积极地交换大量内容的记忆。因此,系统完全没有响应,直到操作完成并且(再次经过一段时间)系统将我的桌面应用程序交换回来。

为了确定这一点,我使用 swapoff / swapon 来清除整个交换区,导致大约 5GB 的已用内存:

在此输入图像描述

在操作过程中,io 缓冲区(蓝色)的数量不断增加。 在此输入图像描述

...

在此输入图像描述

执行上述命令后系统显示如下:

在此输入图像描述

我测试了几个系统参数来减少交换和写回大小,例如设置

/proc/sys/vm/swapiness = 1
/proc/sys/vm/dirty_ratio = 10

但这并没有真正改变这个问题。

有趣的是,如果我完全禁用交换,那么我看不到任何性能问题或内存压力。内核仅使用可用内存并允许应用程序分配更多内存(通过减少缓冲区大小)。

有没有人遇到类似问题并知道解决方案?我的两台电脑都出现这个问题,不知道如何解决。

答案1

dd if=/dev/sda1 of=/dev/null iflag=nocache &

之后我可以看到在后台free期间“空闲”如何恢复而“buff/缓存”如何下降(“可用”仍然存在)。dd

如果没有,iflag=nocache我看到了与您描述的相同的效果:“免费”mem 被大量使用——我没有激活交换,并且fg在它变得“关键”之前我激活了 Ctrl-C)。

对 SO 的评论认为,缓冲比交换更“糟糕”。我认为这是真的,但我无法给出一个很好的解释......除了操作系统本身无法知道是否值得在内存中保留一个大对象。即使用户也不总是知道他是否会重复该命令。

旗帜的戏剧性效果nocache表明它确实很重要。


我想对于cp和文件系统来说,这种情况不会发生。或者确实如此?

相关内容