我正在寻找一种压缩磁盘上交换的方法。我并不是在寻求对替代解决方案进行更广泛的讨论。请参阅最后的讨论。
我努力了...
使用压缩的 zfs zvol 进行交换是行不通的。它的设置有效,交换有效,交换确实发生了一些,所以我想有人可能会说这是技术上一个可行的解决方案,但是如果您的工作解决方案比软盘访问慢,并导致您的系统十次中有十次完全冻结,那么您的工作解决方案究竟如何“有效”?尝试了几次——一旦系统进入内存压力条件,一切都会冻结。我也尝试使用 losetup 间接使用它,甚至尝试使用 zfs zvol 作为 zram 的支持设备。没有区别,总是相同的结果——写入/读取速度极其缓慢,系统不可避免地在压力下崩溃。
BTRFS。仅支持未压缩的交换文件。显然,也只支持未压缩的循环图像,因为我尝试了 dd-ing 一个空文件,使用常规 ext2 格式化它,压缩它,作为循环设备安装,并在其中创建一个交换文件。不起作用,即使我在启用强制压缩的情况下安装了 btrfs - compsize 显示 ext2 图像压缩比恰好为 1.00 。
Zswap——它只是内存和常规磁盘交换之间的缓冲区。常规磁盘交换仍然是常规磁盘交换,zswap 在将页面写入其中之前解压缩页面。
Zram——自从它作为compcache诞生以来就有一个支持设备选项,人们会认为它是多年来一直使用压缩磁盘交换的完美候选者。没有这样的运气。虽然您可以随意将压缩的内存页面写回磁盘,但页面在写入之前会被解压缩。与 zswap 不同的是,它不会写入相同和零填充的页面,这既节省了 i\o,又稍微提高了吞吐量,并保证使用循环安装的稀疏文件作为 backing_dev。到目前为止,这是我在低端设备上找到的交换优化的最佳选择,尽管它仍然缺乏磁盘压缩。
还有什么想法我还可以尝试吗?也许有一些我不知道的压缩块设备层,可以压缩写入其中的任何内容,不需要文件系统?也许我可以使用一些压缩的覆盖层?但在 FUSE 中没有这样做,因为 FUSE 本身就是交换的对象,除非您知道一种方法来防止它被交换。
由于我没有看到对此进行太多探索,因此欢迎您提出您喜欢的任何疯狂建议。拜托,让我们把东西扔到墙上,看看什么能粘住。
对于专家来说——如果你们中的任何人阅读过,甚至编写过与此问题相关的 Linux 源代码的任何部分,请尽可能详细地描述,为什么您认为这还没有实现,以及如何实现你认为吗可以如果您有任何想法,请实施。显然,如果可以的话,请务必实现这一点,那就太棒了。
讨论
在将其标记为重复之前——我知道围绕 stackexchange 存在一些类似的问题,但我看到没有一个有有效的答案,也很少有任何进一步的反馈。因此,我将尝试在这里描述细节,对所有内容进行汇总,希望比我聪明的人能够弄清楚这一点。我不是程序员,只是一个用户和一个脚本小子,所以这应该是一个相当低的跨越门槛。
多买点内存就可以了,便宜
买一个固态硬盘
交换不好
反正压缩很慢,何苦呢
如果你要说的只是上述任何一句话——走开。因为论证是优化。不管现在的内存多么便宜,它都不是免费的。交换总是需要的,拥有它对系统有好处,这一事实已经被证实了很多年。压缩没什么,即使是“重型”算法在过去十年制造的任何处理器上执行速度也快得愚蠢。最后,当然,如果您使用 SSD,压缩实际上可能会成为瓶颈,但并不是每个人都会优先考虑速度而不是磁盘空间使用,而 HDD 驱动器确实从磁盘压缩中受益匪浅,但仍然非常受欢迎且数量众多,不容忽视。
答案1
我没有具体的答案给你:你可能会探索的是左心室容量。
LVM 主要是一种替代形式的分区。然而从技术上讲,LVM 的物理卷可以是任何块设备。它提供最终由物理块设备支持的逻辑块设备。
由于 LVM 逻辑卷是块设备,因此它们通常可用于交换。
LVM 有一个功能叫做电压源它提供压缩:
虚拟数据优化器 (VDO) 功能提供内联块级重复数据删除、压缩和存储精简配置。您可以将 VDO 作为一种逻辑卷管理器 (LVM) 逻辑卷 (LV) 进行管理,类似于 LVM 精简配置卷。
你可能会遇到的麻烦
任何形式的压缩都需要一些内存。我对任何并非设计用于交换的解决方案的主要担忧是它可能会动态地从内核请求内存来压缩页面。因为它会被压缩因为内核需要释放RAM,请求RAM很容易导致失败。
当然,驱动程序编写时可能会意识到这一点,并原始地请求它们可能需要的所有 RAM。关键是,如果驱动程序在编写时没有考虑到交换,这可能会成为一个问题。