性能优化

Slack Docker Pulls

本文档介绍了Alluxio的部分功能,可提高部分场景下的Alluxio性能。

Client 异步预取

如果当前文件正在进行顺序读,Alluxio client 会在当前读取位置后预取一定范围的数据,并开始在client 上缓存这些数据。 如果当前读取位置的数据已经被预取缓存,Alluxio client 将返回缓存数据,而不是向 Worker 发送 RPC 请求。

预取窗口是自调节的。 如果读取总是从上次读取位置的末尾开始(即读取连续),预取窗口将增大。 如果读取不连续,预取窗口会缩小。 如果读取完全是随机读取,预取窗口最终会缩小为 0。

异步预取将数据缓存到 client 的直接内存中。 通过增加分配给 JVM 进程的直接内存,可提高性能。

Client 异步预取始终处于启用状态。 用户可通过以下参数来调整此功能。

配置项 推荐值 描述
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 单个已打开文件在慢速池中可以拥有的最大单元数

Client 大文件预加载

大文件预加载是对大文件冷读的优化。

如果启用该功能,Alluxio 将在 client 最初读取文件时将整个文件同时加载到 Alluxio Worker 中。 在对存储在 S3 上的单个 100GB 文件运行 FIO 基准测试时,在开启该功能后,Alluxio的冷读性能可以接近全缓存的热读性能。

数据去重是在 client 和 worker 端处理的,以避免产生过多的 RPC 调用和向 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 在 worker 上并行加载文件数据到 UFS 的并发作业数。每个作业会将一页数据加载到 Alluxio 中。 例如,如果页面大小为 4MB, 且该配置设置为 64,则 worker 每次迭代将并发加载 256MB 的数据。