考虑以下场景。您有一个安装了 Linux的慢速只读媒体(例如写保护的拇指驱动器、CD/DVD 等)(不是 Live CD 本身,而是正常版本),并且在没有字面意义的计算机上使用它其他形式的存储。它很慢,因为它是 USB 2。根文件系统作为overlayfs 挂载,因此它对于日志和您所做的许多其他临时工作是“可写的”,但所有写入都转到 RAM (tmpfs upperdir)。为Live发行情况非常典型的场景。
由于没有其他形式的存储,swap 挂载在 zram 上。因此,当 Linux 决定交换时,它会压缩这些页面并将它们仍然存储在 RAM 中,但至少它们是被压缩的。这实际上很不错,因为大多数应用程序的 RAM 很容易压缩(RAM 通常在数据中非常冗余,因为它意味着“快速”)。这适用于应用程序内存,但不适用于 tmpfs。
事情是这样的:zram很快,令人难以置信。另一方面,拇指驱动器很慢。假设它是 20 MiB/s,相比之下这真的很慢。您可以在这里看到问题以及为什么内核不会做正确的事情。
请注意,此问题不是重复如何使 TMPFS 内的文件更可能交换。问题几乎相同,但我对那个问题的答案并不满意,抱歉。内核绝对不会不自行做“正确的事”,不管如何聪明的人设计它是。我不喜欢人们不了解情况并认为他们更了解情况。他们迎合一般情况。这就是 Linux 具有如此可调整性的原因,因为无论它多么智能,它都无法预测它的用途。
例如,我可以(并且确实)将vm.swappiness (/proc/sys/vm/swappiness) 设置为 100,这告诉它积极交换应用程序内存并保留文件缓存。这个选项很好,但不幸的是,它不是全部。
我希望它在处理交换时将文件缓存优先于任何其他 RAM 使用。这是因为丢弃文件缓存导致它不得不从慢20 MIB /秒的驱动器,这是多读回多比交换zram慢。对于应用程序,vm.swappiness 有效,但不适用于 tmpfs。
tmpfs 挂载为页缓存,因此它与文件缓存具有相同的优先级。如果您从 tmpfs 读取文件,它将优先于较旧的文件缓存条目(最近使用)。但是,这是不好的,内核显然没有做正确的事情在这里。应该考虑将 tmpfs 交换为 zram 比文件缓存“最近使用”要好得多,因为从驱动器读取非常慢。
所以我需要明确地告诉它与文件缓存相比更频繁地从 tmpfs 交换:它应该比 tmpfs 保留更多的文件缓存。/proc/sys/vm 中有很多选项,但我找不到。真让人失望。
如果做不到这一点,有没有办法告诉内核某些设备/驱动器比其他设备/驱动器慢得多,并且它应该比其他人更愿意为它们保留缓存?tmpfs 和 zram 很快。拇指驱动器不是。我可以告诉内核这个信息吗? …