我有 Linux 服务器,并且有一个备用的 500GB 磁盘分区。我想对其进行格式化并将其用于 /tmp。服务器偶尔会运行一些大型数据处理任务,因此 /tmp 可能会保存 GB 的临时数据。
然后我想到我可以将它添加为交换分区并将 /tmp 挂载到 tmpfs。这个想法合理吗?
服务器有 6GB RAM,所以在大多数情况下 /tmp 上的数据只会在 RAM 中,具有明显的速度优势。问题是,假设 /tmp 上有 10-20GB 的数据,系统将如何运行?与简单地将 /tmp 挂载到 ext4 分区相比,性能如何?感谢帮助。
编辑:很明显,当 tmpfs 的使用达到 RAM 限制时,系统将开始换出内存。但是 Linux 是否足够智能以换出 tmpfs 数据并将“常规”数据保留在 RAM 中?如果是,那么我想它的行为是合理的。否则,整个系统将受到严重影响。
这不是一个好主意TM。
你会喜欢一个大
/tmp
分区,像这样安装(来自你的/etc/fstab
)您可以将外部驱动器添加为一个巨大的交换分区
当达到极限时,您的机器将开始将页面从 RAM 交换到磁盘——此时,平均负载将达到顶峰,机器将逐渐停止。
以任何方式依赖 SWAP 都是一个坏主意,你最好卖掉你的 500GB 驱动器并简单地购买更多 RAM -它便宜。
总之
如果你真的想使用你的 500GB 磁盘,你可以将你的 500GB 磁盘挂载
/tmp
到一个非日志文件系统上,并禁用 atime 和 diratime(例如。ext2
)。SWAP
这比处理正在运行的机器要快得多这可能是一个合理的想法。
将实际的文件系统放在 /tmp 上确实会产生开销,因为文件系统会竭尽全力确保磁盘上的数据在系统故障的情况下不会损坏。对于在启动时清理的 /tmp,这显然只是开销。使用 tmpfs 可以避免这种开销。
另一方面,文件系统还确保以优化访问时间的方式在磁盘上组织文件——即,它们将避免碎片化。典型的顺序文件访问将(大部分)导致顺序磁盘访问,这比随机访问更有效。这种效果在旋转硬盘上比在 SSD 上更明显。swap+tmpfs 组合不能轻易做到这一点,因为 swap 不知道哪块内存属于哪个文件,而 tmpfs 不知道页面是如何映射到物理内存或磁盘的。然而,对于大文件,它应该工作得很好,因为在这种情况下 tmpfs 和 swap 都试图保持事情的连续性。至少,只要交换上有大量可用空间(否则碎片就会开始),并且写入发生得足够慢以至于它们有机会被换出。
所以底线是:视情况而定,您应该尝试两种选择,看看哪一种效果最好。
挂载 tmpfs 时,请记住明确设置大小。默认是物理 RAM 的一半,所以只有 3GB。
当您通常没有太多数据
/tmp
,但偶尔会在有限的时间内消耗无穷无尽的 GB 数据时,这实际上是一个好主意。问题是 linux 交换系统对您的用例了解不够,无法正确执行。它通常会优先于程序页面转储或交换缓存,但这并没有真正帮助。可以使用 cgroups 来实现您的目标,这是当临时数据保存在程序内存中时,但我不确定在这种情况下如何配置 cgroups(我想您可以使用 FUSE tmpfs ...) . 幸运的是,这不是必需的。您可以使用 zram 和支持设备获得所需的行为。zram-init
是自动设置 zram 的程序,zram 是一种压缩的 ram 块设备。配置中通常有一个zram-init
安装/tmp
为 zram 的示例。它会像下面这样这将压缩任何写入 /tmp 的内容并将其存储在内存中。通常的压缩率在 50% 左右。它最多会消耗 2G 的物理内存。如果物理内存不足,它将获取最旧的文件并将它们推入支持设备,仍然是压缩的。请注意,压缩和解压缩文件确实会产生一些 CPU 开销,但这通常会被减少的 IO 所抵消。
类似的设置可以与 cgroups 结合使用,让某些进程交换而不会对整体系统性能产生不利影响。