当前位置: 首页 > Linux

预读存储性能加速引擎

时间:2023-04-06 22:20:27 Linux

Sequentialreadahead(预取,在Linux中也称为预读,readahead)是一种用于提高顺序读性能的技术,用于缩小存储设备与应用程序之间的差距巨大的效率差距。Linux内核在通用预读框架中进行顺序文件预读,在VFS层主动拦截文件读请求,将顺序请求转换为异步预读请求,为即将到来的请求引入数据块,在块中。I/O预读背景带宽和延迟是I/O性能的两个主要衡量指标。对于这两种标准,磁盘、内存和处理器之间存在巨大的性能差距。例如,今天的DDR5内存的理论带宽通常超过40GB/s,响应时间为纳秒级,而Seagate(R)7200rpmSATA磁盘的最大持续传输速率为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。最好的选择是尽可能完全避免或减少访问存储介质的频率。这可以通过文件内存缓存来实现。Read-ahead擅长将小的读请求转化为大的读请求,有效减少存储介质的访问次数,从而降低查找的高成本。具体示例是众所周知的LinuxVFS(虚拟文件系统)挂载选项noatime和relatime,用于消除由mtime更新触发的对存储设备的不必要写入。序列化。顺序访问支持顺序预读并最大化磁盘性能利用率。对于并发顺序访问,预读在将交错的小型I/O聚合为大型I/O方面起着至关重要的作用。对于非顺序访问,通过使用智能磁盘布局管理、基于通知的预读、I/O排队和调度等技术将磁盘寻道延迟降至最低。举几个通过序列化优化性能的例子:SCSI磁盘的TCQ(markedcommandqueue)和SATA磁盘的NCQ(nativecommandqueues);ext4/xfs的延迟分配和预分配;xfs等中的回写簇。异步。异步访问通过流水线处理处理器和磁盘操作提高I/O效率,隐藏应用程序的I/O延迟。AIO、非阻塞I/O、回写和预读是异步I/O的常用工具。并行化。将多个磁盘的容量和带宽聚合起来,可以提高整体的IO性能,这是分布式存储的共识。除了传统的RAID层,新兴的文件系统如zfs、btrfs也可以自行管理大型磁盘池。另一方面,SSD内部使用了设备级并发。例如,英特尔在其SATA固态硬盘中开辟了10个并行NAND闪存通道,可提供高达500MB/s的读取带宽和超过50,000IOPS。并发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大小。除了吞吐量和延迟之间的权衡之外,预读命中率是另一个常见的设计考虑因素。为了保持较高的预读命中率,需要自适应的预读大小。这是因为,即使我们确定应用程序正在进行顺序读取,我们也无法预测顺序读取将持续多长时间。例如,一个应用程序可能从头到尾读取整个文件,而另一个应用程序只访问文件的前两页。幸运的是,可以推断出最常见的I/O行为。首先,要读取的页数(不管文件末尾)和访问的页数通常呈正相关。其次,readsize越大,越有可能被复制。因为更大的预读大小意味着开发人员需要针对预期的长预读进行优化。基于以上两个经验法则,可以估计当前访问模式重复的概率,并相应地计算自适应预读大小。提高预读的命中率是预读算法设计的一个主要目标。低命中率意味着内存和磁盘I/O资源的浪费,这是代价高昂且不可接受的。传统的预读算法往往只对严格顺序的读取进行预读。他们在预读大小上采用保守策略,并采用顺序检测以寻求高预读命中率。然而,随着计算机硬件的飞速发展,我们也面临着新的约束和要求。内存和磁盘的带宽和容量都有了很大的提升,但是磁盘访问时间仍然很慢,越来越成为I/O瓶颈。因此,预读命中的好处增加,这增加了预读的重要性,这意味着底层存储应该更积极地进行预读。因此,即使以一些预读命中率为代价,它也可以提高整体I/O性能。工作负载的预读命中率取决于IO模式识别的准确性和对该特定模式运行时间的估计。YRCloudFileLinux客户端预读YRCloudFileLinux客户端预读接入了Linux内核预读机制,专门针对顺序读的性能进行了优化。下图是Linux客户端预读开启和关闭时不同内核版本的性能表现,使用FIO测试工具分别测试小文件顺序读取和大文件顺序读取的场景。预读对4K/1M顺序读性能的影响从实际测试数据来看,无论是否开启YRCloudFileLinux客户端预读功能,在不同内核版本下,顺序读性能提升2.5-20倍。YRCloudFileLinux客户端预读机制解决了文件顺序读取速度慢、访问延迟高的问题,帮助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