# 优先级规则

Alluxio 支持为不同文件分配不同的驱逐优先级。本文档介绍了基于优先级进行缓存驱逐的使用场景、设计和操作。

## **使用场景**

Alluxio 默认使用基于 LRU（最近最少使用）的驱逐器。基于LRU 的驱逐器通过观察一段时间内的数据访问模式来选择候选页面 (page），从而确定最不“需要”的页面。不过，有时管理员会事先知道，某些文件虽然从 LRU 驱逐器的角度来看访问的可能性比其他文件小，但却更为重要，因为这些文件一旦缓存未命中会比其他文件造成更大的影响。因此，管理员希望将这些缓存数据保留更长时间，而不受驱逐器的决策影响。例如，管理员将某个数据集加载到 Alluxio 中用于重要的计算任务，并希望确保这些加载的文件在计算任务使用数据期间始终保留在缓存中。在此期间，该数据集中的任何文件都不应被其他不太重要的并发作业驱逐。此类驱逐偏好可以通过为文件分配不同的驱逐优先级来实现。

## 设计概览

如果启用了优先级驱逐器，并且管理员为不同文件分配了优先级，那么优先级驱逐器会确保高优先级文件不被驱逐，直至页存储（page store) 中已无任何低优先级文件缓存为止。对于优先级相同的文件，驱逐器的工作原理与管理员配置的LRU（最近最少使用）或LFU（最少使用频率）驱逐器完全相同。当需要为新页面腾出空间时，但新页面所属文件的优先级低于当前缓存的任何其他文件，则驱逐不会发生，新页面也不会被缓存。

需要注意的是，每个 worker 节点独立评估优先级规则，而不顾集群中其他 worker 缓存使用状况。换句话说，某个worker 节点可能会因为其自身的页存储中并没有缓存低优先级页面，而开始驱逐高优先级页面，但此时其他 worker 中可能仍然存在低优先级页面。

## 优先级规则

管理员可以通过定义优先级规则来告诉 Alluxio 哪些文件被分配了哪些优先级。优先级规则由 UFS 路径前缀和优先级级别组成。目前的优先级级别有 3 个，分别是 `HIGH`（高）、`MEDIUM`（中）和 `LOW`（低）。UFS 路径前缀决定规则适用的文件。UFS 路径前缀可以是指向 UFS 中某个特定文件的路径，在这种情况下，规则仅适用于该文件。它也可以是指向 UFS 中某个目录的路径，那么规则将适用于该目录树下的任何文件。

此外，可同时定义多个规则。用户定义的规则与一个默认规则（适用于所有文件且具有低优先级）一起构成规则集。规则集中可以包含嵌套的规则，例如，可以同时存在两个路径前缀分别为 `s3://bucket/data` 和 `s3://bucket/data/dir` 的规则。在解析优先级时，最具体的规则将生效。例如，对于以下规则集：

```
/a -> HIGH
/a/b -> MEDIUM
/a/b/c -> LOW
(default) -> LOW
```

对于文件 `/a/file`，只有规则 1 匹配，因此其优先级为 HIGH。\
对于文件 `/a/b/file`，规则 `/a` 和 `/a/b` 都匹配，但 `/a/b` 更具体，因此其优先级为 MEDIUM。\
对于文件 `/d/file`，没有任何用户定义的规则与之匹配，因此默认规则生效，其优先级为 LOW。

## 启用优先级驱逐

要启用优先级驱逐功能，请添加以下配置：

```properties
alluxio.worker.page.store.evictor.priority.enabled=true
```

此配置需要应用到所有客户端和 worker 节点。 由于优先级规则保存在 etcd 中，管理员需要确保已正确配置etcd 的连接信息。

```properties
alluxio.etcd.endpoints=http://etcd-host:2379/
```

根据需要配置 etcd 的身份验证、安全连接等。

更新配置后，重启所有 worker 节点。

## 添加和更新优先级规则

使用以下命令添加新的优先级规则：

```console
$ bin/alluxio priority add --path s3://bucket/data --priority high
```

其中 `--path` 指定规则的路径前缀，`--priority` 定义优先级级别。\
使用以下命令列出现有的规则：

```console
$ bin/alluxio priority list
```

使用以下命令删除现有的规则：

```console
$ bin/alluxio priority remove --path s3://bucket/data
```

请注意，仅删除优先级规则不会导致受该规则影响的文件从缓存中驱逐。

使用以下命令更新现有规则的优先级级别：

```console
$ bin/alluxio priority update --path s3://bucket/data --priority medium
```

当管理员更新优先级规则集时，worker 节点会收到通知，根据更新后的规则集来更新其内部数据结构。由于更新内部数据结构需要一些时间，在此期间，用户可能会观察到 worker 节点上的 I/O 延迟增加。

有关命令的完整介绍，请参阅 [CLI 参考资源](/ee-da-cn/reference/user-cli.md#priority)。

## 监控优先级驱逐器的状态

Alluxio 提供了指标 `alluxio_cached_storage_by_priority_bytes` 来反映不同优先级上缓存的数据量：

```console
$ curl "http://localhost:30000/metrics/"
(snip)
# HELP alluxio_cached_storage_by_priority_bytes amount of the cached data
# TYPE alluxio_cached_storage_by_priority_bytes gauge
alluxio_cached_storage_by_priority_bytes{priority="HIGH"} 2.147483648E9
alluxio_cached_storage_by_priority_bytes{priority="LOW"} 1048576.0
alluxio_cached_storage_by_priority_bytes{priority="MEDIUM"} 7.79091968E8
# HELP alluxio_cached_storage_bytes amount of the cached data
# TYPE alluxio_cached_storage_bytes gauge
alluxio_cached_storage_bytes 2.927624192E9
(snip)
```


---

# 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-da-cn/cache/eviction/priority.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.
