进一步阅读

进一步阅读

内存不足是一个常见问题,官方的 OOM 效率不高。为了更快地完成查杀工作,还引入了其他几个程序。

我想知道为什么没有办法创建交换而不是杀死。考虑一个没有交换的系统,OOM 程序可以触发sudo swapon /swapfile(假设swapfile存在)而不是杀死进程。

实施这个想法有技术限制吗?

答案1

确实存在执行此操作的程序。 动态交换守护进程例如。

他们必须尽早采取行动 - 在需要交换之前不久 - 因为创建、启用和禁用交换文件都是使用内存的操作(与其他操作一样),并且当您已经使用内存时,您真的不想这样做在低内存情况下。

任何监视 RAM 使用情况以根据需要执行此操作的程序也将使用内存(并且应该使用类似的方法锁定到 RAM 中)内存锁这样它们就不会在需要时被替换掉)。

IMO,与仅仅创建和激活交换文件或分区然后忘记它相比,使用这样的东西并没有真正的好处。理论上听起来不错,但在实践中却毫无用处。

答案2

实施这个想法有技术限制吗?

不,您可以继续编写类似的程序。交换的问题是它非常慢,非常不可预测,它会增加延迟,它会妨碍正常的 IO 操作,并且在某些情况下它弊大于利,例如,如果您有一个应用程序,其 RSS 正在不受控制地增长:您尝试为了创建交换来满足其需求,内核会交换您实际使用的所有内容,然后系统就会停止运行。

我的建议始终是:添加 RAM 并且不要使用交换区。仅当您无法在物理(没有可用插槽的笔记本电脑)或财务(共享主机)限制之外添加 RAM 时,才必须使用交换。

在 Linux 中,交换区可用于休眠,但仅此而已。我什至不再相信休眠,因为该技术是为随机 IO 速度非常慢的 HDD 磁盘创建的。对于当今的 SSD,几乎没有理由使用休眠功能。

答案3

只需使用使用zram这是页面的压缩存储。各种 Linux 发行版(例如卢本图,软呢帽)以及 ChromeOS 和 Android 多年来默认启用 zram。 Android 上甚至没有默认的传统交换功能。甚至视窗苹果系统现在使用压缩虚拟内存在诉诸交换之前

默认情况下,zram 几乎不消耗内存,并且仅在数据分页后才采用压缩大小,因此,如果您不缺乏内存,那么 zram 就免费放在那里,就像您使用普通交换时一样。但是,当内存变得有限时,zram 将投入使用,并且它比交换快得多,因为 CPU 解压缩数据的速度比从 HDD 甚至 SSD 读取数据快得多。您可以检查基准测试结果在这里看看使用默认 lzo 算法的 zram 仍然比旧 SSD 更快。您可以轻松更改为lz4算法这是比 lzo 快近 5 倍压缩比稍低。如今只是切换到 Zstd速度会让你大吃一惊

还有zswap它使用不同的机制,但仍然将压缩数据存储在 RAM 上

进一步阅读

相关内容