为什么交换这么慢?

为什么交换这么慢?

我相信我的交换/硬件/驱动程序发生了一些奇怪的事情。

我正在尝试将交换大小增加swapoff, lvresize,然后swapon再次。

当我执行此操作时swapoff /dev/swapdev,该命令花了 8 分 19 秒将大约 3.5GB 的交换页面移入内存。

我在运行之前确保我的可用 RAM 大于交换使用量swapoff,并且在运行时保持不变。

我有一台配备 SSD HDD 的 Intel Core i5 笔记本电脑。之前处理器的利用率不到 10% swapoff,而当我签入时,swapoffCPU 使用率超过 70%。

日记里一直没有什么有趣的东西。

以下是我预计将 3.5G 从磁盘分流到内存大约需要多长时间:

$ time dd if=/dev/urandom of=/tmp/del bs=1M count=3500
3500+0 records in
3500+0 records out
3670016000 bytes (3.7 GB, 3.4 GiB) copied, 23.7288 s, 155 MB/s

real    0m24.789s
user    0m0.000s
sys     0m22.743s

我在跑Linux svelte 4.9.53-1-MANJARO #1 SMP PREEMPT Thu Oct 5 15:11:15 UTC 2017 x86_64 GNU/Linux

该命令需要这么长时间的原因是什么?这可能是一个更大问题的一部分,但这是我可以明确指出的第一件事,看起来很奇怪。

答案1

您没有了解 swapoff 的真正作用。

在正在运行的机器上退出正在交换的交换空间是极其复杂的。 8 分钟内 3.5G 可能非常快+正在按预期工作。

运行 swapoff 不仅仅是将代码从磁盘移动到内存中。

一旦你正在交换......好吧......你正在交换,这意味着你的操作系统缺乏内存+你有磁盘I/O到你的交换设备+磁盘I/O到你的其他文件系统+甚至可能是如果涉及看门狗或 systemd 自动重启,OOM(内存不足杀手)开始运行,然后 OOM 进程的进程重新启动。

如果您的系统正在交换,则意味着交换是保持系统存活的唯一方法。

如果你杀死交换空间,那么你的系统就不能再使用交换空间,所以现在你的操作系统必须加载正常文件系统的代码+当内存耗尽时驱逐代码+而不是通过优化的原始磁盘从快速交换空间拉出代码读起来,你的所有代码都必须来自正常的文件系统,并进行目录遍历。这比从交换空间中获取资源要密集得多。

当您在正在交换的系统上进行交换时...通常您会遇到这样的情况:此过程将花费数小时+有时机器会崩溃。

如果由于某种原因必须停用交换设备,最好首先创建一个辅助的、基于文件系统的交换空间+为这个新的交换空间执行 swapon,然后在旧的交换设备上执行 swapoff。

如果您采用这种方法,您的系统将永远生存。

相关内容