使用 tmpfs + 一个非常大的交换分区作为 /tmp,而不是常规文件系统?

使用 tmpfs + 一个非常大的交换分区作为 /tmp,而不是常规文件系统?

我有一台 Linux 服务器,还有一个 500GB 的闲置磁盘分区。我想将其格式化并用作 /tmp。服务器偶尔会运行一些大型数据处理任务,因此 /tmp 可能会保存数 GB 的临时数据。

然后我想到了一个主意,我可以将其添加为交换分区,并将 /tmp 挂载到 tmpfs。这个想法合理吗?

服务器有 6GB 的 RAM,因此在大多数情况下 /tmp 上的数据只存在于 RAM 中,速度优势明显。问题是,如果 /tmp 上有 10-20GB 的数据,系统性能如何?与将 /tmp 简单地挂载到 ext4 分区相比,性能如何?谢谢帮助。

编辑:很明显,当 tmpfs 的使用量达到 RAM 限制时,系统将开始交换内存。但是 Linux 是否足够聪明,可以交换出 tmpfs 数据并将“常规”数据保留在 RAM 中?如果是,那么我认为它可以表现得合理。如果不是,那么整个系统将受到严重影响。

答案1

这不是一个好主意

有了这么大的分区,你就可以安心地/tmp安装它了(从你的/etc/fstab

tmpfs  /dev/tmp  tmpfs  defaults,nosuid,nodev,noexec,noatime,nodiratime,size=6000M 0 0

您可以将外部驱动器添加为巨型交换分区

/dev/sdb1  swap  swap  defaults  0 0

当达到极限时,您的机器将开始将页面从 RAM 交换到磁盘 - 此时,平均负载将急剧上升并且机器将停止运行。

无论如何,依赖 SWAP 都是一个坏主意,你最好卖掉你的 500GB 硬盘,然后买更多的 RAM -它很便宜。

总之

如果你真的想使用你的 500GB 磁盘,你可以将 500GB 磁盘挂载到/tmp非日志文件系统上,并禁用 atime 和 diratime(例如)。这比处理正在运行ext2的机器要快得多SWAP

答案2

这可能是一个合理的想法。

在 /tmp 上放置实际文件系统确实会产生开销,因为文件系统会竭尽全力确保系统发生故障时磁盘上的数据不会损坏。对于在启动时清理的 /tmp,这显然只是开销。使用 tmpfs 可以避免这种开销。

另一方面,文件系统还确保文件在磁盘上的组织方式可以优化访问时间 - 即它们将避免碎片。典型的顺序文件访问(大多数)将导致顺序磁盘访问,这比随机访问更有效率。这种效果在旋转硬盘上比在 SSD 上更明显。swap+tmpfs 组合无法轻松做到这一点,因为 swap 不知道哪一块内存属于哪个文件,而 tmpfs 不知道页面如何映射到物理内存或磁盘。但是,对于大文件,它应该可以很好地工作,因为在这种情况下,tmpfs 和 swap 都试图保持连续。至少,只要 swap 上有大量可用空间(否则会出现碎片),并且写入速度足够慢,它们就有机会被换出。

所以底线是:这取决于情况,您应该尝试两种选择,看看哪种效果最好。

当你挂载 tmpfs 时,一定要记得明确设置大小。默认值是物理 RAM 的一半,所以只有 3GB。

答案3

当您通常没有太多数据/tmp,但偶尔会在有限的时间内消耗无尽的 GB 时,这实际上是一个好主意。问题是 Linux 交换系统对您的用例了解不够,无法正确执行此操作。它通常会优先转储或交换缓存而不是程序页面,但这并没有真正的帮助。当临时数据保存在程序内存中时,可能可以使用 cgroups 来实现您的目标,但我不确定在这种情况下如何配置 cgroups(我想您可以使用 FUSE tmpfs......)。幸运的是,这不是必需的。您可以使用 zram 和支持设备获得所需的行为。

zram-init是自动设置 zram(一种压缩的 RAM 块设备)的程序。配置中通常会有一个作为 zramzram-init安装的示例/tmp。它将类似于以下内容

type0=/tmp
flag0= 
size0=524288 # 500G of logical space
mlim0=2G # 2G of memory
back0=/dev/loop0 # (or /dev/sdxN, your large slow drive)
notr0= 
maxs0=4 # maximum number of parallel processes for this device
algo0=zstd 
labl0=tmp # the label name
uuid0= 
args0= 

这将压缩并存储写入 /tmp 的任何内容到内存中。通常压缩率约为 50%。它将最多消耗 2G 的物理内存。如果物理内存不足,它将获取最旧的文件并将其推送到备份设备中,仍处于压缩状态。请注意,压缩和解压缩文件确实会产生一些 CPU 开销,但这通常会通过减少 IO 来抵消。

类似的设置可以与 cgroups 结合使用,以允许某些进程交换,而不会对整体系统性能产生不利影响。

相关内容