> For the complete documentation index, see [llms.txt](https://documentation.alluxio.io/ee-ai-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://documentation.alluxio.io/ee-ai-cn/performance/file-reading.md).

# 读取优化

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。
