乐趣区

关于高性能:存储性能加速引擎之预读

程序预读(prefetch,在 Linux 中也称为预读,read ahead)是一种用于晋升程序读性能的技术,用于放大存储设备和应用程序之间微小的效率差距。Linux 内核在通用预读框架中执行程序文件预读,它被动拦挡 VFS 层中的文件读取申请,并将程序的申请转换为异步预读申请,为行将到来的申请引入数据块,并在大块中进行。

I/ O 预读背景

带宽和提早是 I / O 性能的两个次要衡量标准。对于这两个规范,在磁盘、内存和处理器之间存在着微小的性能差距。例如,当今的 DDR5 内存的实践带宽通常为 40GB/ s 以上,响应工夫为纳秒级,而一个希捷 (R) 7200 转 SATA 磁盘的最大继续传输速率为 200MB/s,均匀寻道工夫为 5ms。两者之间存在的性能差距, 带宽相差数百倍 提早相差 10^7 倍

I/ O 提早是影响磁盘 I / O 性能的一个次要因素,能够用一个简略的 I / O 模型来近似。典型的磁盘 I / O 有两个步骤:首先,磁头挪动到数据轨道,期待数据扇区在其下旋转;其次,开始数据读取和传输。相应的有两个操作工夫:均匀拜访工夫,典型值为 8ms;数据传输工夫,大抵等于 I / O 大小和磁盘继续传输速率的乘积,对于目前的一般磁盘(HDD),均匀传输速率为 200MB/s。

在一个残缺的 I / O 周期中,只有数据传输工夫能力真正利用磁盘数据通道。I/ O 大小越大,在数据传输上破费的工夫就越多,相对来说,在搜寻上节约的工夫就越少,因而咱们能够取得更多的磁盘利用率和 I / O 带宽。下图反映了上述磁盘 I / O 模型和代表性参数值的相关性。I/ O 预读的次要目标是将图中磁盘的工作点从左向右挪动,从而取得更好的 I / O 带宽。

应用较大的 I / O 大小能够更好地利用磁盘

随着数字信息的激增,提前读算法依然在持续施展重要作用。固态磁盘极大地缩小了耗时的寻道工夫,然而依然存在不小的拜访提早。特地是 SSD 存储器基本上是由许多并行操作的芯片组成,较大的预读 I / O 将可能利用并行芯片的劣势。从 SSD 存储取得齐全性能所需的最佳 I / O 大小与旋转介质不同,并且因设施而异。因而,即便是在 SSD 上,I/ O 预读也很要害。

总之,有程序拜访模式的中央,就有 I / O 预读的市场。无论是基于机械磁盘还是固态磁盘。

I/ O 优化和预读

从利用角度,目前业界有四种根本的 I / O 优化策略:

防止从存储设备上 IO。最好的抉择是完全避免或尽可能减少存储介质拜访频率。这能够通过文件内存缓存来实现。预读擅长于将小的读申请转换为大的读申请,这无效地缩小了存储介质拜访的数量,从而升高了昂扬的查找老本。具体的例子是家喻户晓的 Linux VFS(虚构文件系统)挂载选项 noatime 和 relatime,用于打消由 mtime 更新触发的不必要的向存储设备的写操作。

程序化。程序拜访能反对程序预读并最大化磁盘性能利用率。对于并发程序拜访,预读在将交织的小 I / O 聚合为大 I / O 方面起着至关重要的作用。对于非程序拜访,通过应用智能磁盘布局治理、告诉式预读、I/ O 排队和调度等技术,将磁盘寻址提早最小化。举几个通过程序化进行性能优化的例子:SCSI 磁盘的 TCQ(标记命令队列)和 SATA 磁盘的 NCQ(本机命令队列);ext4/xfs 的提早调配和预调配;xfs 中的回写集群等。

异步化。异步拜访通过流水线化处理器和磁盘操作,暗藏应用程序的 I / O 提早的形式来进步 I / O 效率。AIO、非阻塞 I /O、回写和预读是异步 I / O 的常用工具。

并行化。聚合多个磁盘的容量和带宽可晋升整体 IO 性能曾经是分布式存储的共识。在传统的 RAID 层之外,以 zfs 和 btrfs 为例的新兴文件系统能够本人治理大型磁盘池。另一方面,在 SSD 外部应用了设施级并发解决。例如,英特尔在其 SATA 固态硬盘中开拓了 10 个并行的 NAND 闪存通道,可提供高达 500MB/ s 的读取带宽和 50000 以上的 IOPS。并发 I / O 申请和并行数据传输是上述并行零碎的 I / O 吞吐量的要害。被动预读在这个畛域中扮演着重要的角色:它们通常须要大型的异步预读 I / O 来填充并行数据通道。

预读有助于实现 I / O 异步和并行

显然,预读在四种 I / O 优化策略中都扮演着重要的角色。预读能够为应用程序、存储设备和存储池,甚至处理器资源带来性能改善。通过屏蔽较高的 I / O 提早,应用程序能够运行得更快更晦涩。大块 I / O 能够更好地利用磁盘,能够更好地并行化,也有助于摊薄整个 I / O 门路的解决开销。

预读的根本办法

预读算法能够是预测式的,也能够是利用被动告诉式的。预测式算法试图基于过来的 I / O 预测将来将被拜访的 I / O 块,自动自发地执行预读决策,对下层利用是通明的,这种形式对算法的要求较高,存在命中率的问题。最胜利的一种做法是程序预读,这始终是操作系统的规范实际。新型的预测式预读能够基于灵便的 AI 算法或统计,晋升预读数据的命中率。

利用被动告诉式预读,应用来自各个应用程序对于其将来 I / O 操作的提醒,提醒能够由应用程序显式地管制。

缓存是另一种普遍存在的性能优化技术。共享预读内存和缓存内存是一种常见的做法,这为预读和缓存之间的交互关上了大门。

预读的设计衡量

预读大小对 I / O 性能有很大影响,被认为是次要的预读参数。在确定预读大小值时,必须在吞吐量和提早之间进行衡量。个别的领导准则是:预读的大小应该足够大,以提供良好的 I / O 吞吐量,但同时也要避免预读块过大,从而防止不必要的过长的 I / O 提早。

不同的存储设备、磁盘阵列配置和工作负载具备不同的最佳预读 IO 大小。某些应用程序(如对 I / O 提早不敏感),能够平安地应用较大的预读大小;其余利用可能对 I / O 提早敏感,这时应该应用更激进的预读 I / O 大小。

除了吞吐量和提早之间的衡量之外,预读命中率是另一个常见的设计思考因素。为了放弃较高的预读命中率,须要应用自适应预读大小。这是因为,即便咱们确信应用程序正在进行程序读取,咱们也无奈预知程序读操作还会继续多久。例如,应用程序可能从头到尾读取一整个文件,而另一个应用程序只拜访这个文件中的前两个 page。

侥幸的是,常见的 I / O 行为大多是能够推断的。首先,行将要读取的 page 数(不思考文件完结的状况)和已拜访的 page 数通常是正相干的。其次,读取的大小越大,反复的可能性就越大。因为较大的预读大小意味着研发人员要对预期的长时间预读进行优化。依据以上两条教训规定,能够预计以后拜访模式反复的可能性,并据此计算自适应预读大小。

进步预读命中率是预读算法设计的一个次要指标。低命中率意味着内存和磁盘 I / O 资源的节约,这样节约是昂扬和不可承受的。传统的预读算法偏向于只对严格的程序读取进行预读。它们对预读大小采纳激进策略,并采纳程序检测,以寻求较高的预读命中率。

然而,随着计算机硬件的疾速倒退,咱们也面临着新的束缚和要求。内存和磁盘的带宽和容量都有了很大的进步,但磁盘拜访工夫依然很慢,并且越来越成为 I / O 瓶颈。因而,预读命中的益处就减少了,它减少了预读的重要性,意味着底层存储应该更被动地进行预读。

因而,即便就义肯定的预读命中率,它也能够进步总体 I / O 性能。工作负载的预读命中率取决于 IO 模式识别和这种特定模式运行时长评估的准确性。

YRCloudFile Linux 客户端预读

YRCloudFile Linux 客户端预读,对接了 Linux 内核预读机制,专门针对程序读的性能进行优化。

下图为用 FIO 测试工具,对小文件程序读、大文件程序读场景进行测试,在 Linux 客户端预读开启和敞开状况下,不同内核版本的不同性能体现。

预读对 4K/1M 程序读性能的影响

从理论测试数据看,YRCloudFile Linux 客户端预读性能开启与否,在不同内核版本的下,程序读性能晋升 2.5-20 倍不等。

YRCloudFile Linux 客户端预读机制很好地解决了文件程序读速度慢、拜访提早高的问题,帮忙 AI 利用,影视内容制作等利用轻松应答海量文件程序读拜访的性能挑战。

不可能有一种技术满足所有的需要,业务软件是单线程还是多线程、IO 特点是一次写屡次读还是一直追加写、是程序读还是随机读等等。焱融技术团队通过一直的与客户的交换、碰撞,对不同场景,不同类型的利用进行剖析,一直推出新的性能,让 YRCloudFile 更趋于成熟,帮忙用户成就大数据与人工智能时代的企业外围竞争力。

参考资料
1.https://bootlin.com/pub/readahead/doc/ols2007-readahead-paper.pdf\
2.https://engineering.purdue.edu/~ychu/publications/tc07_pref.pdf\
3.https://pdfs.semanticscholar.org

退出移动版