在 Debian 系统中,如何在同一运行会话中将所有 ZRAM 交换设备内容移动到交换文件中以释放 RAM,而不需要:
- 首先禁用 ZRAM(例如,使用
swapoff
),因为它有将 ZRAM 数据溢出回 RAM 的风险。 swapoff
使用和序列降低 ZRAM 交换设备的优先级swapon
。- 使用
dd
或类似的方法复制内容但不保留交换文件中数据的正确上下文,从而使数据变得无用。
该解决方案应确保来自 ZRAM 交换设备的数据正确传输到交换文件并被系统识别为有效的交换数据,从而有效释放 RAM 空间,而不会出现数据丢失或将数据移回 RAM 的风险。
考虑到上述限制,是否有一种可靠的方法可以实现这一目标,而不需要重新启动或对系统性能造成重大影响?
答案1
zram 是 RAM 中的通用压缩块设备。
和swap完全没有关系。 (几乎)没有交换特定的代码。它只是在适当的情况下对交换有用。
这意味着没有 zram 特定的到另一个交换分区或交换文件的迁移路径。交换系统本身也不提供 1:1 交换设备迁移。
你是应该使用swapoff
.然后,如果需要,内核将使用其他交换设备,从而间接迁移它。或者,您可以添加另一个具有较高优先级的交换设备,并等待较低优先级的交换设备随着时间的推移而被关闭。
也就是说,zram 有一个可选的写回功能,请参阅zram:可选功能——写回。您可以使用它来(暂时)释放 RAM。然而,所有请求仍将通过 zram 设备,并且新写入的页面也可能首先进入 RAM。
对此功能的支持尚未广泛(可能未在内核中启用、zramctl
不支持等)。您可能必须通过 sysfs 界面手动激活它。您可以尝试一下,看看它是否适合您的需求。
由于 zram 是通用块设备,因此您可以对其应用通用块设备迁移方法。这将允许您完全删除 zram 设备,而无需swapoff
.
例如,您可以创建 RAID 1 并用于mdadm --replace
将其从 zram 移动到物理分区。 (mdadm --force
允许创建单磁盘 RAID 1,因此在不迁移时不会发生镜像。)
例如,您可以在其上放置 LVM 并用于pvmove
将其从 zram 移动到物理卷。
然而,很难说这是否比仅仅使用swapoff
.也许暂时将 swappiness 设置为更高的值也会影响swapoff
行为。
(只是乱扔想法——我从未测试过任何一个。)