我有一个创建大型临时文件的脚本。
我倾向于使用 tmpfs 来实现这一点,但是我快速搜索了一下 tmpfs 的性能,发现这报告速度约为 2GiB/s。
现代 NVME SSD 的速度相当。撇开性能以外的差异(例如,通过不接触磁盘可以延长 SSD 寿命,SSD 容量更大而 RAM 有限),使用 tmpfs 相对于 SSD 是否有任何性能优势?
答案1
tmpfs
作为页面缓存的扩展,它实际上充当了一个“透明”的 ramdisk。这意味着它提供了非常快的顺序读写速度,但是尤其快速地随机的IOP(与存储设备相比)。
以下是在配备普通内存的老化 Ryzen 1700 上收集的一些示例:
dd if=/dev/zero of=test.img bs=1M count=4096
显示 2.8 GB/s覆盖刚刚分配的文件
dd if=/dev/zero of=test.img bs=1M count=4096 conv=notrunc,nocreat
显示 3.5 GB/sfio --rw=randread
(随机读取 IOPS)显示队列深度 1(单线程)工作负载为 492K iops,队列深度 8(8 线程)工作负载为 2.2M iops。这远远超过任何基于 NVMe 闪存的磁盘(例如:英特尔 P4610)甚至基于 XPoint 的磁盘(例如:英特尔傲腾 P4801X)
为了获得可比的性能,您需要一组 NVMe 磁盘,或者更好的是,需要内存连接存储作为 NVDIMM。
简而言之:如果你能忍受tmpfs
易失性存储(即如果你断电,你将失去任何由于写入的数据量很大,所以很难打败它(或者一般的 ramdisk)。
但是你问的是写作大的文件tmpfs
,这本身就是一个挑战:毕竟,写入 GB 大小的文件会很容易地耗尽你的可用内存大小(和预算)。
答案2
您找到的一个数字不能代替测试。在硬件上运行您的工作负载并检查它是否令人满意。您是在执行小型随机访问 I/O,还是执行整个文件?
是的,现代总线和互连意味着 DRAM 和 NVMe 都可以驱动 GB/s 级的顺序 I/O。DRAM 的某些读取速度比持久性固态存储快 10 倍到 100 倍,这也是事实。这对您是否重要取决于您的工作量。查看各种可视化每个程序员都应该知道的延迟数字来了解数量级。
在确定性能后,不应忽略操作方面的考虑。tmpfs 将在重启时消失。如果您的使用无法容忍耐久性,那很好,但通常这很烦人。是的,不写入 SSD 可以减少其磨损。这是否重要取决于 - 您猜对了 - 您的工作量。
答案3
就其实现方式而言,tmpfs 使用与其他 Linux 文件系统相同的文件系统缓存,但未实现将数据刷新到磁盘的操作,因此它实际上只是缓存。实际上,这可能意味着,如果您的工作负载从未刷新到磁盘,而是完全放在内存中(后者无论如何都是使用 tmpfs 的必要条件),那么即使对于由磁盘支持的文件系统,请求通常也会从缓存中处理,因此您会发现 tmpfs 和其他文件系统之间的性能差异很小。
当然,如果您的工作负载确实刷新到磁盘,那么磁盘写入时间就会很重要,因此其他答案给出的建议 - 使用尽可能真实的工作负载测试性能 - 仍然是正确的答案。