优化读取
Alluxio 提供了多种高级功能来加速文件读取性能。无论您是处理顺序访问模式、非常大的文件还是专门的 AI/ML 工作负载,您都可以调整 Alluxio 以满足您的需求。本指南涵盖了优化读取操作的关键机制。
为顺序读取调整客户端预取
对于顺序文件读取,Alluxio 客户端会自动预取接下来可能要读取的数据。这些数据被缓存在客户端的本地内存中,使得后续的读取请求可以直接从客户端提供服务,而无需向工作节点发送网络请求。
预取窗口是自适应的:在连续的顺序读取期间它会增加,在非连续或随机读取期间它会减少。对于完全随机的访问模式,预取窗口最终将缩小到零。
标准预取配置
客户端预取默认启用。您可以使用 conf/alluxio-site.properties
中的以下属性来调整其行为:
alluxio.user.position.reader.streaming.async.prefetch.thread
64
异步预取线程池的总体并发度。
alluxio.user.position.reader.streaming.async.prefetch.part.length
4MB
每个预取单元的大小。
alluxio.user.position.reader.streaming.async.prefetch.max.part.number
8
单个打开文件可以拥有的最大单元数。例如,使用 4MB 的单元大小和最多 8 个单元,Alluxio 将为单个文件预取最多 32MB 的数据。
alluxio.user.position.reader.streaming.async.prefetch.file.length.threshold
4MB
如果文件大小低于此阈值,Alluxio 将立即最大化预取窗口,而不是从小窗口开始。这对于提高小文件的读取性能很有用。
为混合工作负载使用慢速预取池
某些工作负载(如冷读取)可能比其他工作负载更受益于不同的预取参数(例如,更高的并发度)。Alluxio 提供了一个次要的“慢速”预取池,可以为这些场景独立配置。
要启用和配置慢速预取池,请设置以下属性:
alluxio.user.position.reader.streaming.async.prefetch.use.slow.thread.pool
true
设置为 true
以启用慢速预取池。
alluxio.user.position.reader.streaming.async.prefetch.use.slow.thread.pool.for.cold.read
true
如果为 true
,慢速池将用于冷读取。否则,它将仅用于缓存过滤器读取。
alluxio.user.position.reader.streaming.slow.async.prefetch.thread
256
慢速池的总体异步预取并发度。
alluxio.user.position.reader.streaming.slow.async.prefetch.part.length
1MB
慢速池使用的预取单元的大小。
alluxio.user.position.reader.streaming.slow.async.prefetch.max.part.number
64
单个打开文件可以为慢速池拥有的最大单元数。
加速大文件读取
读取非常大的文件会带来独特的挑战,例如初始冷读取延迟和单工作节点瓶颈。Alluxio 提供了两个功能来解决这些问题。
为更快的冷读取预加载整个文件
对于从头到尾读取整个大文件的工作负载,您可以启用全文件预加载。当客户端首次开始读取大文件时,此功能会触发 Alluxio 工作节点并发地将整个文件从 UFS 加载到缓存中。这可以使冷读取性能几乎与完全缓存的热读取一样快。
注意:如果您的应用程序只读取文件的一小部分,此功能会导致读取放大,因为无论如何整个文件都会被加载到 Alluxio 中。
要启用此功能,请设置以下属性:
alluxio.user.position.reader.preload.data.enabled
true
设置为 true
以启用大文件预加载。
alluxio.user.position.reader.preload.data.file.size.threshold.min
1GB
触发异步预加载的最小文件大小。
alluxio.user.position.reader.preload.data.file.size.threshold.max
200GB
触发异步预加载的最大文件大小。这可以防止非常大的文件填满整个缓存并导致过多的驱逐。
alluxio.worker.preload.data.thread.pool.size
64
每个工作节点上并发作业的数量,用于并行从 UFS 加载文件的各个部分。例如,使用 4MB 的页面大小和 64 个线程,一个工作节点每次迭代可以加载高达 256MB。
将大文件分段到多个工作节点
默认情况下,整个文件缓存在单个 Alluxio 工作节点上。对于非常大的文件,如果多个客户端请求同一个文件,这可能会造成瓶颈。文件分段通过将大文件分解为更小的、独立的段来解决这个问题,每个段都可以缓存在不同的工作节点上。当客户端读取文件时,它可以并行地从多个工作节点获取不同的段,从而显著提高读取吞吐量。
工作原理
文件被视为一个有序的段列表。每个段由一个唯一的段 ID 标识,该 ID 是原始文件 ID 和段在文件中的索引的组合。
段 ID := (文件 ID, 段索引)
当客户端需要读取文件的一部分时,Alluxio 使用此段 ID(而不是文件 ID)作为其工作节点选择算法的键。这确保了不同的段被映射到不同的工作节点。
当客户端读取跨越多个段的区域时,请求被分解,每个段都从其相应的工作节点读取。这可以并行化 I/O 并将负载分布到整个集群。
限制
客户端直接创建并写入 Alluxio 的文件无法分段。
段大小是集群范围的设置,无法按文件进行配置。
启用文件分段
要在所有 Alluxio 节点(主节点、工作节点和客户端)上启用此功能,请设置以下属性:
alluxio.dora.file.segment.read.enabled
true
设置为 true
以启用文件分段。
alluxio.dora.file.segment.size
(取决于用例)
段的大小。默认为 1 GiB。
选择合适的段大小是一种权衡。如果段太小,客户端可能会过于频繁地在工作节点之间切换,从而未充分利用网络带宽。如果段太大,则会增加工作节点之间缓存分布不均的风险。一个常见的范围是几 GB 到几十 GB。
优化 AI 模型文件加载
Alluxio 在加速 AI 模型文件加载方面非常有效,这是生产机器学习系统中的常见瓶颈。在典型的工作流程中,训练好的模型存储在中央 UFS 中,在线推理服务需要快速加载它们以提供预测。这些模型文件通常很大,传统的文件系统可能难以应对来自许多服务副本的高频、并发读取请求,从而导致流量高峰和启动时间缓慢。
通过使用 Alluxio 作为缓存层(通常通过 Alluxio FUSE 将模型呈现为本地文件系统),您可以显著提高模型加载速度并减少 UFS 的负载。
虽然标准的客户端预取通常足够,但您可以为模型服务中常见的高并发读取启用增强的预取逻辑。当多个服务通过单个 Alluxio FUSE 实例读取同一个模型文件时,此功能可以提供高达 3 倍的性能提升。
要启用此优化,请设置以下属性:
alluxio.user.position.reader.streaming.async.prefetch.by.file.enabled=true
alluxio.user.position.reader.streaming.async.prefetch.shared.cache.enabled=true
Last updated