我相信我的交换/硬件/驱动程序发生了一些奇怪的事情。
我正在尝试将交换大小增加swapoff
, lvresize
,然后swapon
再次。
当我执行此操作时swapoff /dev/swapdev
,该命令花了 8 分 19 秒将大约 3.5GB 的交换页面移入内存。
我在运行之前确保我的可用 RAM 大于交换使用量swapoff
,并且在运行时保持不变。
我有一台配备 SSD HDD 的 Intel Core i5 笔记本电脑。之前处理器的利用率不到 10% swapoff
,而当我签入时,swapoff
CPU 使用率超过 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。
如果您采用这种方法,您的系统将永远生存。