我有一台微型计算机,RAM 不多(1-2GiB),磁盘空间也很少,我用它安装了 Gentoo。我在共享 NFS 上也有空间。
为了能够编译任何软件包,即使是最大的软件包,我创建了一个 NFS 上的交换文件(几乎从不使用),以防万一,并创建了一个用作临时编译目录的目录。它运行良好,但我发现tar x
在 NFS 临时目录中解压软件包()需要很长时间,即使对于相当小的软件包也是如此。
因此,我决定将交换文件增加到相当大的尺寸(20GiB),并创建了一个 16GiB 的 tmpfs 用作临时编译目录(/var/tmp/portage/dist
):
mount -t nfs nfs-server:/var/tmp/dist/$(hostname)/misc /var/tmp/misc
fallocate -l 20g /var/tmp/misc/swapfile
chmod 600 /var/tmp/misc/swapfile
mkswap /var/tmp/misc/swapfile
swapon /var/tmp/misc/swapfile
mount -t tmpfs -o size=16g tmpfs /var/tmp/portage/dist
chmod 1777 /var/tmp/portage/dist
对于小型包,所有操作都在 RAM 中本地完成,因此速度非常快。
对于中等大小的软件包,它会完全填满 RAM 并使用部分交换文件。当然,性能会下降,但不会下降太多。
但对于最大的软件包,RAM 已完全使用,交换文件的使用量不断增加,并且在特定时刻,系统似乎冻结了(我不能说它肯定冻结了,因为我唯一的访问是通过 SSH,并且我丢失了这个连接,系统不再响应任何网络请求,甚至一个ping
)。我认为编译正在停止,因为我还有另一个 NFS 安装用于缓存该目录不再被微型计算机触碰。
我的问题是:
- 您认为是什么原因造成冻结?
- 我应该设置哪些参数来防止这种情况发生(例如
noatime
,对于我的tmpfs
)? - 我选择了正确的解决方案吗?或者还有其他更好的方法来实现这一目标吗?