# 读取优化

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。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.alluxio.io/ee-ai-cn/performance/file-reading.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
