当我执行大型 IO 操作(例如从外部驱动程序或内部磁盘上复制大文件/向其复制大文件)时,我的 Debian 10 桌面系统上遇到了一个奇怪的问题。
我可以将其归结为以下简单情况:
sudo dd if=/dev/sdb of=/dev/null
当我发出此命令来读取驱动器 /dev/sdb 的所有内容(例如插入的 USB 驱动器,但也可以 /dev/sda 内部驱动器)时,我可以在例如 htop 中看到系统积极地交换大量内容的记忆。因此,系统完全没有响应,直到操作完成并且(再次经过一段时间)系统将我的桌面应用程序交换回来。
为了确定这一点,我使用 swapoff / swapon 来清除整个交换区,导致大约 5GB 的已用内存:
...
执行上述命令后系统显示如下:
我测试了几个系统参数来减少交换和写回大小,例如设置
/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
和文件系统来说,这种情况不会发生。或者确实如此?