# 性能优化

本文档介绍了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 的数据。 |
