在填满所有内存并交换我的经验时,最近几年是:
Windows 和 macOS 会“哦,让我们为你解决这个问题”,然后可能会增加交换大小。打开例如 30 个 YouTube 标签会使事情变慢一段时间,但如果我想中止该过程,我通常仍然可以使用光标,之后系统的其余部分(不一定是有问题的应用程序)就像往常一样响应迅速.
Ubuntu (21.04) 出现“抱歉,在接下来的十到三十分钟内您无法与计算机交互”。在相同的硬件和相同的浏览器上,我可以打开 30 个 YouTube 标签并观看整个系统锁定。所有的内存和交换都用完了,游标不仅慢而且被锁定在原地。我无法与系统的其余部分进行有意义的交互。
不同之处似乎在于 Ubuntu 永远不会解决这种情况,保持其交换大小不变,因此永远每五秒锁定一次。直到发生灾难性故障,Firefox 消失得无影无踪——这在其他操作系统中几乎从未发生过。最关键的方面是我无法与系统的其余部分进行交互。
我不知道,但我的印象是,如果根据需求增加交换大小,这将不是问题。这是如何实现的?是否有更好的内存管理?
测试更新
在(不是那么快)进行评论中建议的快速测试之后,我将交换文件的大小翻了一番,我可以得出结论,它使世界变得与众不同。在相同的负载期间,系统始终保持响应。我只能得出结论,自适应交换大小将缓解所描述的问题。
$ free -h
total used free shared buff/cache available
Mem: 3.7Gi 3.1Gi 129Mi 374Mi 566Mi 105Mi
Swap: 4.0Gi 3.0Gi 988Mi
$ sysctl vm.swappiness
vm.swappiness = 60
$ swapon -s
Filename Type Size Used Priority
/swapfile_4G.img file 4194300 3180664 20
硬件注意事项
Ubuntu(以及其他)的卖点之一是获得持续支持并延长旧硬件的使用寿命,其中包括总内存低于平均水平的机器。内存不足的荒谬,正如其他操作系统可以做得很好的事实所证明的那样,只是低于平均水平。其中许多机器是不可升级的。
4 GB RAM 适用于大多数用例。在 Ubuntu 中,在 Windows 中,在 macOS 中。然而,似乎只有在 Windows 和 macOS 中才能正常工作的是,当您用完所有已分配的交换空间时。
简而言之,在使 Ubuntu 正常运行的解决方案变成“购买新硬件”的同一时刻,运行它的全部意义对所有这些机器来说都没有实际意义。升级硬件超出了这个问题的范围。
Linux 内核在交换支持方面......不确定。从许多开发人员的角度来看,Swap 是二等公民。我的意思是用于弹出和获取页面的算法相当简单,并且当有很多常用页面时可能会崩溃。
一个不错的解决方案可能是使用 zswap。这样做是将一块内存设置为压缩内存,然后将页面弹出到该内存中。为此,请编辑内核引导参数以添加
zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.zpool=z3fold
. 在 Ubuntu 系统上执行此操作的最简单方法是将其添加到/etc/default/grub
文件中,作为GRUB_CMDLINE_LINUX_DEFAULT
密钥的一部分。这将有效地增加可存储在 RAM 中的数据量,减少磁盘 IO 并防止锁定。最后,您询问是否要动态创建更多交换空间。Linux 完全能够随意添加和删除交换文件,这意味着脚本可以检查交换可用性,然后在需要时添加交换文件。但是,如果您经常使用完整的交换空间,这并没有多大意义。
要增加交换空间(无需重新分区磁盘),您可以使用交换文件。为此,请运行
sudo dd if=/dev/zero of=/swapfile count=1M bs=1024 status=progress
,它将 100 万个 1024 字节(即 1 GB)的块复制到一个文件中。然后,运行sudo chmod 0600 /swapfile
并sudo mkswap /swapfile
准备文件以用作交换。通过将以下行附加到该文件,将其添加到 /etc/fstab 以使其始终可用:/swapfile swap swap defaults 0 0
. 要完成该过程,请调用sudo swapon -a
激活交换文件。资料来源:我自己使用交换文件和 zswap,并参考了我的 bash_histroy 和 Arch wiki 的命令。
正如@Terrance Swapspace在评论中提到的那样,这是解决此问题的方法。
现在,您只需要一些免费存储来控制您的系统。测试和工作。