# FUSE Full POSIX Workspace

{% hint style="warning" %}
此功能自 AI-3.9-16.0.0 起为实验性功能。
{% endhint %}

本指南介绍如何使用 FoundationDB（FDB）作为元数据后端，部署支持**完整 POSIX 语义的 FUSE Workspace**。与基础版 [FUSE 写入优化](/ee-ai-cn/performance/fuse-write-cache.md)（一次性写入、不支持 rename）不同，此模式通过 FUSE 挂载支持随机写入、覆盖写、截断、rename 等标准 POSIX 操作。

{% hint style="info" %}
目前，FUSE Workspace 仅支持 **TRANSIENT** 路径配置。通过 Workspace 写入的数据不会自动持久化到 UFS。如使用 Worker PageStore，请通过应用层检查点确保数据持久性；如需 UFS 原生持久性，请使用 UFS PageStore。
{% endhint %}

FDB 模式以 FoundationDB 作为分布式强一致性元数据存储，支持多节点访问同一数据集。数据可存储在 Worker NVMe（低延迟）或 UFS PageStore（高持久性）。

## 与其他模式的对比

|              | [S3-API 写入优化](/ee-ai-cn/performance/s3-write-cache.md) | [FUSE 写入优化](/ee-ai-cn/performance/fuse-write-cache.md) | FUSE Full POSIX Workspace（本指南） |
| ------------ | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------ |
| **接口**       | S3 API（`PUT`、`GET`）                                    | FUSE（POSIX）                                            | FUSE（POSIX）                    |
| **写入模型**     | 顺序（Multipart Upload）                                   | 顺序，关闭后一次性写入                                            | 随机写入、覆盖写、truncate              |
| **POSIX 支持** | N/A                                                    | 有限（不支持 `rename`，一次性写入）                                 | **完整**                         |
| **元数据后端**    | FDB                                                    | FDB                                                    | FDB（分布式）                       |
| **数据存储**     | Worker NVMe                                            | Worker NVMe                                            | Worker NVMe 或 UFS PageStore    |
| **需要 FDB**   | 是                                                      | 是                                                      | 是                              |
| **多节点访问**    | 是                                                      | 是                                                      | 是                              |

## POSIX 兼容性

| 操作                           | 支持情况 | 说明                          |
| ---------------------------- | :--: | --------------------------- |
| `open` / `close`             |   ✅  |                             |
| `read` / `write`（顺序）         |   ✅  |                             |
| `read` / `write`（随机、seek）    |   ✅  | 日志结构写入；启用 compaction 可改善读性能 |
| `rename`（文件和目录）              |   ✅  | 在同一命名空间内原子操作                |
| `truncate` / `ftruncate`     |   ✅  |                             |
| `mkdir` / `rmdir`            |   ✅  |                             |
| `unlink` / `rm`              |   ✅  | 软删除，后台清理                    |
| `chmod` / `chown` / `utimes` |   ✅  |                             |
| `stat` / `fstat`             |   ✅  | 大小和时间戳精确                    |
| `listdir`                    |   ✅  | 分页                          |
| `setxattr` / `getxattr`      |   ✅  | 扩展属性                        |
| `fsync` / `fdatasync`        |   ✅  | 刷新内存缓冲区并提交元数据               |
| `symlink` / `readlink`       |   ✅  | 符号链接                        |
| `mmap`                       |   ✅  |                             |

***

## 准备工作

* [ ] **Alluxio 集群已运行**，Worker 健康：

  ```shell
  kubectl get pods -n <NAMESPACE> -l app.kubernetes.io/component=worker
  ```

  **预期：** Worker Pod 处于 `Running` 且 `Ready` 状态。
* [ ] **FDB Operator 和 CRD 已安装**：

  ```shell
  kubectl get pods -n alluxio-operator -l app.kubernetes.io/name=fdb-operator
  ```

  **预期：** FDB Operator Pod 处于 `Running` 状态。如未安装，请参考 [S3-API 写入优化 — 安装 FDB CRDs](/ee-ai-cn/performance/s3-write-cache.md)。
* [ ] **FDB 集群健康**：

  ```shell
  kubectl get pods -n <NAMESPACE> -l foundationdb.org/fdb-cluster-name
  ```

  **预期：** FDB controller、log 和 storage Pod 均处于 `Running` 状态。
* [ ] **FUSE 客户端已部署**：

  ```shell
  kubectl get pods -n <NAMESPACE> -l app.kubernetes.io/component=fuse
  ```

  **预期：** FUSE Pod 处于 `Running` 状态。

## 部署

### 1. 启用 FUSE Workspace

在 `alluxio-cluster.yaml` 中添加以下配置：

```yaml
apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
spec:
  properties:
    alluxio.write.cache.enabled: "true"
    alluxio.write.cache.dual.buffer.file.system.type: "GENERIC_FDB_BACKED_V2"
  fuse:
    properties:
      alluxio.fuse.v2.enabled: "true"
  fdb:
    enabled: true
```

应用配置：

```shell
# 幂等操作
kubectl apply -f alluxio-cluster.yaml
```

### 2. 配置路径为 TRANSIENT

配置路径规则，使目标路径使用 `TRANSIENT` 策略模式。这将告知 Alluxio 将数据保存在 Workspace 中，不持久化到 UFS。

```shell
kubectl exec -i -n <NAMESPACE> <CLUSTER_NAME>-coordinator-0 -- \
  bash -c 'EDITOR="cp /dev/stdin" alluxio pathconfig edit' << 'EOF'
{
  "apiVersion": "v1.0",
  "defaultRule": {
    "description": "Global default",
    "policyMode": "TRANSIENT"
  },
  "pathRules": [ ]
}
EOF
```

预期输出：`Update successful!`

验证：

```shell
kubectl exec -i -n <NAMESPACE> <CLUSTER_NAME>-coordinator-0 -- \
  alluxio pathconfig test --path /data/test/file.txt
```

预期输出中应包含 `policyMode: TRANSIENT`。

### 3. 选择数据存储模式

#### 选项 A：Worker PageStore（默认 — 低延迟）

无需额外配置。数据存储在 Worker NVMe 上。

| 方面   | 说明                                           |
| ---- | -------------------------------------------- |
| 写入延迟 | 亚毫秒至数毫秒（本地网络至 Worker）                        |
| 容量   | 受限于 Worker 磁盘                                |
| 持久性  | 临时性 — Worker 故障时数据丢失（当前仅支持 `TRANSIENT` 路径配置） |

#### 选项 B：UFS PageStore（高持久性）

数据直接写入 UFS：

```yaml
spec:
  properties:
    # 启用 UFS PageStore（默认：false）
    alluxio.user.write.cache.random.access.ufs.page.store.enabled: "true"
    # UFS PageStore 数据的 UFS 基础路径（启用时必填）
    alluxio.user.write.cache.random.access.ufs.page.store.path: "s3://my-bucket/alluxio/pagestore"
```

| 方面     | 说明                        |
| ------ | ------------------------- |
| 写入延迟   | 较高（取决于 UFS 类型和网络）         |
| 容量     | 无限（UFS 容量）                |
| 持久性    | 高（UFS 原生复制，例如 HDFS 3 副本）  |
| 孤立文件清理 | Coordinator 定期扫描 UFS 孤立文件 |

### 4. 调整 Compaction（可选）

Compaction 默认启用。它合并积累的写日志以减少读放大。Compaction 可由写日志数量或存储空间放大率（物理大小 vs. 逻辑大小）触发。可调整以下阈值：

```yaml
spec:
  properties:
    # Compaction 主开关（默认：true）
    alluxio.write.cache.compaction.enabled: "true"
    # 当文件积累的写日志数达到此值时触发 compaction（默认：MAX_INT）
    alluxio.user.write.cache.trigger.compaction.on.write.log.count: "102400"
    # 当物理存储超出逻辑大小此百分比时触发 compaction（默认：50）
    alluxio.user.write.cache.compaction.space.amplification.percent: "50"
    # 跳过小于此大小文件的空间放大检查（默认：64MiB）
    alluxio.user.write.cache.compaction.space.amplification.min.file.size: "64MiB"
```

### 5. 启用元数据缓存（推荐）

对于读密集型工作负载（频繁执行 `stat`、`getattr`、`ls`），启用元数据缓存层可减少 FDB 负载：

```yaml
spec:
  properties:
    # 启用内存元数据缓存，TTL 为 3s（默认：false）
    alluxio.write.cache.metastore.cache.enabled: "true"
    # 将属性更新批量延迟到下次数据刷新，减少 FDB 写入（默认：false）
    alluxio.user.fuse.write.cache.defer.open.file.attr.update.enabled: "true"
```

> 元数据缓存使用 3 秒 TTL。在此窗口内，其他节点上的并发写入方可能看到略微过时的元数据。

### 6. 验证

```shell
# Worker 就绪
kubectl wait --for=condition=Ready pod \
  -l app.kubernetes.io/component=worker \
  -n <NAMESPACE> --timeout=120s

# FDB 健康
kubectl get pods -n <NAMESPACE> -l foundationdb.org/fdb-cluster-name

# 确认配置
kubectl exec -n <NAMESPACE> <CLUSTER_NAME>-coordinator-0 -- \
  alluxio conf get alluxio.write.cache.dual.buffer.file.system.type
```

**✅ 成功：** Worker 和 FDB Pod 均处于 `Running` 状态；配置返回 `GENERIC_FDB_BACKED_V2`。

## 关键配置

### 核心配置

启用 FUSE Workspace 所需的设置。这些属性用于激活 Workspace 子系统、选择 FDB 元数据后端并配置 FDB 连接。

| 属性                                                     | 默认值                               | 说明                             |
| ------------------------------------------------------ | --------------------------------- | ------------------------------ |
| `alluxio.write.cache.enabled`                          | `false`                           | Workspace 主开关。                 |
| `alluxio.write.cache.dual.buffer.file.system.type`     | —                                 | 设置为 `GENERIC_FDB_BACKED_V2`。   |
| `alluxio.fuse.v2.enabled`                              | `false`                           | 启用 FUSE V2 接口（必填）。             |
| `alluxio.foundationdb.cluster.file.path`               | `${alluxio.conf.dir}/fdb.cluster` | FDB 集群文件路径。由 Operator 自动注入。    |
| `alluxio.user.write.cache.in.memory.write.buffer.size` | `16MiB`                           | 每个文件的内存写缓冲区大小。满后刷新到 PageStore。 |

### Coordinator 后台任务

Coordinator 运行定期后台任务以维护系统健康，包括清理过期 FDB 锁和扫描 UFS 孤立文件。这些任务在启用后自动运行，无需手动干预。

| 属性                                                                       | 默认值    | 说明                         |
| ------------------------------------------------------------------------ | ------ | -------------------------- |
| `alluxio.coordinator.write.cache.background.tasks.enabled`               | `true` | Coordinator 后台任务主开关。       |
| `alluxio.coordinator.write.cache.cleanup.invalid.locks.grace.duration`   | `24h`  | 清理过期 FDB 锁的宽限期。            |
| `alluxio.coordinator.write.cache.check.ufs.orphan.file.period`           | `6h`   | UFS 孤立文件扫描间隔（仅 UFS 模式）。    |
| `alluxio.coordinator.write.cache.cleanup.ufs.orphan.file.grace.duration` | `24h`  | 删除 UFS 孤立文件的宽限期（仅 UFS 模式）。 |

### Compaction

写操作使用日志结构格式 — 每次写入追加一条新的写日志记录，而非原地修改数据。随着时间推移，这会导致读放大，因为读取必须合并所有重叠的日志记录。Compaction 将这些日志合并为连续数据，回收存储空间并提升读性能。Compaction 可由两个条件触发（满足其一即触发）：每文件**写日志数量**，或**空间放大率**（物理存储与逻辑文件大小之比）。

| 属性                                                                      | 默认值       | 说明                                                                   |
| ----------------------------------------------------------------------- | --------- | -------------------------------------------------------------------- |
| `alluxio.write.cache.compaction.enabled`                                | `true`    | 启用写日志 compaction。                                                    |
| `alluxio.user.write.cache.trigger.compaction.on.write.log.count`        | `MAX_INT` | 每文件触发 compaction 的写日志数量阈值。                                           |
| `alluxio.user.write.cache.compaction.space.amplification.percent`       | `50`      | 空间放大百分比阈值。当物理存储超出逻辑文件大小此百分比时触发 compaction。例如，`50` 表示在逻辑大小的 150% 时触发。 |
| `alluxio.user.write.cache.compaction.space.amplification.min.file.size` | `64MiB`   | 评估空间放大的最小逻辑文件大小。小于此阈值的文件跳过空间放大检查，避免不必要的 I/O。                         |

### UFS PageStore（仅 UFS 模式）

启用 UFS PageStore 后，文件数据直接写入 UFS（如 HDFS、S3、NAS），而非缓存在 Worker NVMe 上。这以较高写延迟换取 UFS 原生持久性。

| 属性                                                              | 默认值     | 说明                            |
| --------------------------------------------------------------- | ------- | ----------------------------- |
| `alluxio.user.write.cache.random.access.ufs.page.store.enabled` | `false` | 使用 UFS 作为数据存储，替代 Worker NVMe。 |
| `alluxio.user.write.cache.random.access.ufs.page.store.path`    | —       | UFS PageStore 数据的 UFS 基础路径。   |

### 元数据缓存与优化

FDB 模式将所有元数据存储在 FoundationDB 中。对于频繁执行 `stat`、`getattr` 或 `ls` 操作的读密集型工作负载，启用内存元数据缓存可通过短 TTL 本地缓存元数据来减少 FDB 读取负载。延迟属性更新选项通过将文件属性更新批量合并到下次数据刷新中，进一步减少 FDB 写入。

| 属性                                                                  | 默认值     | 说明                          |
| ------------------------------------------------------------------- | ------- | --------------------------- |
| `alluxio.write.cache.metastore.cache.enabled`                       | `false` | 启用内存元数据缓存（TTL 3s）。          |
| `alluxio.user.fuse.write.cache.defer.open.file.attr.update.enabled` | `false` | 将属性更新批量延迟到下次数据刷新，减少 FDB 写入。 |

## 监控

### Coordinator 指标

| 指标                                          | 说明                                             |
| ------------------------------------------- | ---------------------------------------------- |
| `alluxio_pfs_background_tasks{type, state}` | 后台任务状态。State：`RUNNING` / `SUCCESS` / `FAILED`。 |
| `alluxio_pfs_clean_invalid_lock_count`      | 已清理的无效 FDB 锁数量。                                |

### 客户端 — 流 I/O 指标

| 指标                                              | 说明                                                       |
| ----------------------------------------------- | -------------------------------------------------------- |
| `alluxio_pfs_stream_open_streams`               | 当前打开的流实例数量。                                              |
| `alluxio_pfs_stream_bytes_read{type}`           | 总读取字节数。标签 `type`：`positioned` / `internal`。              |
| `alluxio_pfs_stream_read_latency_ms{type}`      | 读取延迟直方图（ms）。标签 `type`：`positioned` / `internal`。         |
| `alluxio_pfs_stream_bytes_written{type}`        | 总写入字节数。标签 `type`：`position_write` / `append_write`。      |
| `alluxio_pfs_stream_write_latency_ms{type}`     | 写入延迟直方图（ms）。标签 `type`：`position_write` / `append_write`。 |
| `alluxio_pfs_stream_truncate_count{type}`       | Truncate 操作次数。标签 `type`：`shrink` / `grow` / `noop`。      |
| `alluxio_pfs_stream_flush_count{committed}`     | Flush 操作次数。标签 `committed`：`true`（数据已持久化）/ `false`。       |
| `alluxio_pfs_stream_flush_latency_ms`           | Flush 延迟直方图（ms）。                                         |
| `alluxio_pfs_stream_persist_count{type}`        | 数据从内存持久化到 PageStore 的次数。标签 `type`：`sync` / `async`。      |
| `alluxio_pfs_stream_read_ahead_triggered`       | 触发异步预读的次数。                                               |
| `alluxio_pfs_stream_inode_not_found{recovered}` | Flush 时 inode 未找到（文件已删除）。标签 `recovered`：`true` 表示恢复成功。   |

### 客户端 — 内存管理指标

| 指标                                         | 说明                 |
| ------------------------------------------ | ------------------ |
| `alluxio_pfs_memory_total_allocated_bytes` | 所有流实例当前占用的直接内存总量。  |
| `alluxio_pfs_memory_alloc_count`           | 缓冲区分配总次数。          |
| `alluxio_pfs_memory_alloc_bytes`           | 已分配直接内存总字节数。       |
| `alluxio_pfs_memory_release_count`         | 缓冲区释放总次数。          |
| `alluxio_pfs_memory_alloc_timeout_count`   | 缓冲区分配超时次数（等待配额）。   |
| `alluxio_pfs_memory_force_release_count`   | 流关闭时强制释放的未释放缓冲区次数。 |

### 客户端 — Page Store 指标

| 指标                                                 | 说明                                              |
| -------------------------------------------------- | ----------------------------------------------- |
| `alluxio_pfs_page_store_write_count{backend}`      | PageStore 写入操作次数。标签 `backend`：`worker` / `ufs`。 |
| `alluxio_pfs_page_store_write_bytes{backend}`      | 写入 PageStore 的字节数。                              |
| `alluxio_pfs_page_store_write_latency_ms{backend}` | PageStore 写入延迟直方图（ms）。                          |
| `alluxio_pfs_page_store_read_count{backend}`       | PageStore 读取操作次数。                               |
| `alluxio_pfs_page_store_read_bytes{backend}`       | 从 PageStore 读取的字节数。                             |
| `alluxio_pfs_page_store_read_latency_ms{backend}`  | PageStore 读取延迟直方图（ms）。                          |
| `alluxio_pfs_page_store_unpin_count`               | PageStore 文件 unpin（清理）操作次数。                     |

### 客户端 — Compaction 指标

| 指标                                                         | 说明                                                                             |
| ---------------------------------------------------------- | ------------------------------------------------------------------------------ |
| `alluxio_pfs_compaction_triggered_count{source}`           | Compaction 触发次数。                                                               |
| `alluxio_pfs_compaction_latency_ms`                        | Compaction 延迟直方图（ms）。在 Coordinator 上也有上报。                                      |
| `alluxio_pfs_compaction_throughput`                        | Compaction 写入吞吐量（字节）。在 Worker 上也有上报。                                           |
| `alluxio_pfs_compaction_reload_count`                      | Compaction 后额外重新加载的迭代次数。                                                       |
| `alluxio_pfs_compaction_block_outcome_count{outcome}`      | 每块 compaction 结果。标签 `outcome`：`worker_finished` / `worker_fallback` / `local`。 |
| `alluxio_pfs_compaction_worker_submit_count{result}`       | 向 Worker 提交 compaction 任务次数。标签 `result`：`success` / `failure`。                 |
| `alluxio_pfs_compaction_worker_status_check_count{result}` | Compaction 状态检查探测次数。                                                           |
| `alluxio_pfs_compaction_range_result_count{result}`        | 每范围 compaction 结果。标签 `result`：`compacted` / `skipped`。                         |
| `alluxio_pfs_write_log_load_count`                         | 写日志加载操作次数。                                                                     |
| `alluxio_pfs_write_log_load_latency_ms`                    | 写日志加载延迟直方图（ms）。                                                                |

### 客户端 — 预读指标

| 指标                                                       | 说明                                                  |
| -------------------------------------------------------- | --------------------------------------------------- |
| `alluxio_pfs_read_pattern_sequential_count`              | 被归类为顺序读的次数。                                         |
| `alluxio_pfs_read_pattern_total_count`                   | 预读跟踪器记录的总读取次数。                                      |
| `alluxio_pfs_read_ahead_decision_count{should_prefetch}` | 预读决策次数。标签 `should_prefetch`：`true` / `false`。       |
| `alluxio_pfs_read_ahead_memory_used_bytes`               | 预取缓冲区消耗的内存。                                         |
| `alluxio_pfs_read_ahead_submitted_count`                 | 已提交的预读任务数。                                          |
| `alluxio_pfs_read_ahead_skipped_count{reason}`           | 被跳过的预读任务数。标签 `reason`：`memory_limit` / `duplicate`。 |
| `alluxio_pfs_read_ahead_bytes_fetched`                   | 预取的总字节数。                                            |
| `alluxio_pfs_read_ahead_failed_count`                    | 预读任务因 I/O 错误失败的次数。                                  |
| `alluxio_pfs_read_ahead_eviction_count{type}`            | 缓冲区驱逐次数。标签 `type`：`stale` / `lru`。                  |
| `alluxio_pfs_read_ahead_evicted_bytes`                   | 从预取缓冲区驱逐的字节数。                                       |

### FDB 指标

| 指标                                                              | 说明                                                                    |
| --------------------------------------------------------------- | --------------------------------------------------------------------- |
| `alluxio_pfs_foundationdb_call_latency_ms{method, success}`     | FDB 调用延迟直方图（ms）。                                                      |
| `alluxio_pfs_fdb_iterator_batch_read_count{iterator_type}`      | FDB 迭代器批量读取次数。                                                        |
| `alluxio_pfs_fdb_iterator_entries_scanned{iterator_type}`       | FDB 迭代器扫描的键值条目数。                                                      |
| `alluxio_pfs_fdb_iterator_batch_read_latency_ms{iterator_type}` | FDB 迭代器批量读取延迟直方图（ms）。                                                 |
| `alluxio_pfs_fdb_iterator_errors{iterator_type, error_type}`    | FDB 迭代器错误次数。标签 `error_type`：`transaction_too_old` / `pb_parse_error`。 |

## 故障排除

### 写入延迟周期性飙升

**现象：** 写操作每隔几秒出现周期性延迟飙升。

**原因：** 内存写缓冲区已满，必须刷新到数据存储（Worker 或 UFS），导致写调用阻塞。

**处理方法：**

1. Worker 模式：确保 Worker NVMe 有足够的 IOPS。
2. UFS 模式：使用低延迟 UFS（本地 NAS 或配备快速磁盘的 HDFS）。
3. 检查 compaction 是否并发运行 — compaction 的读写操作会与前端 I/O 竞争资源。

***

### 读取延迟随时间增加

**现象：** 频繁被覆盖的文件读取速度变慢。

**原因：** 日志结构写入为每个块积累了大量写日志记录。每次读取必须合并所有重叠日志（读放大）。

**处理方法：**

1. 确认 `alluxio.write.cache.compaction.enabled` 为 `true`。
2. 降低 `alluxio.user.write.cache.trigger.compaction.on.write.log.count`（例如对写密集文件设为 `1024`）。
3. 监控 `alluxio_pfs_compaction_throughput` 以确认 compaction 跟得上写入速度。

***

### FDB 事务冲突

**现象：** 写操作间歇性失败，报 `FDB transaction conflict` 错误。

**原因：** 多个客户端并发写同一文件。FDB 使用 MVCC 检测冲突事务。

**处理方法：**

1. 通常是瞬时错误 — 客户端会自动重试。
2. 如频繁出现，避免多个进程同时写同一文件。
3. 监控 FDB 集群健康状态：

   ```shell
   kubectl exec -n <NAMESPACE> <FDB_POD> -- fdbcli --exec "status"
   ```

***

### 孤立文件积累（UFS 模式）

**现象：** 即使文件已删除，UFS 存储用量仍持续增长。

**处理方法：**

1. 如可接受更快的清理速度，缩短 `alluxio.coordinator.write.cache.check.ufs.orphan.file.period` 和 `alluxio.coordinator.write.cache.cleanup.ufs.orphan.file.grace.duration`。
2. 宽限期内的文件会被保留，以避免删除正在活跃写入的数据。

***

### Worker 磁盘空间不足（Worker 模式）

**现象：** 即使 UFS 有容量，写操作仍报空间错误。

**处理方法：**

1. 提高 `alluxio.worker.page.store.pinned.file.capacity.limit.ratio`（默认 `0.3`，提升至 `0.5`）。
2. 增加 Worker NVMe 容量或增加 Worker 数量。

***

### 启动时 FDB 连接失败

**现象：** FUSE Pod 或 Worker 启动时报 FDB 连接错误。

**处理方法：**

1. 验证 FDB Pod 是否运行：

   ```shell
   kubectl get pods -n <NAMESPACE> -l foundationdb.org/fdb-cluster-name
   ```
2. 如使用 Operator 管理的 FDB，集群文件会自动注入。如使用外部 FDB，请显式设置 `alluxio.foundationdb.cluster.file.path`。

## 性能调优

| 场景                   | 建议                                                                                                                        |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| **FDB 负载过高**         | 启用 `alluxio.write.cache.metastore.cache.enabled`，降低元数据读取频率。                                                               |
| **读取延迟增长**           | 启用 compaction，降低 `alluxio.user.write.cache.trigger.compaction.on.write.log.count`。                                        |
| **Worker 磁盘压力**      | 增加 Worker 数量或扩展 Worker NVMe 容量。                                                                                           |
| **stat / getattr 慢** | 同时启用 `alluxio.write.cache.metastore.cache.enabled` 和 `alluxio.user.fuse.write.cache.defer.open.file.attr.update.enabled`。 |
| **随机写入密集**           | 确保 compaction 已启用并设置合理的触发阈值。                                                                                              |

***

## 验证完整 POSIX 操作

### 写入与读后写

```shell
kubectl exec -i -n <NAMESPACE> <APP_POD> -- \
  bash -c 'echo "hello posix write cache" > /data/test/posix-test.txt'

kubectl exec -i -n <NAMESPACE> <APP_POD> -- \
  cat /data/test/posix-test.txt
```

**✅ 成功：** 输出显示 `hello posix write cache`。

### 随机写入与覆盖写

```shell
kubectl exec -i -n <NAMESPACE> <APP_POD> -- bash -c '
  dd if=/dev/zero of=/data/test/random.bin bs=1M count=10
  echo "overwritten" | dd of=/data/test/random.bin bs=1 seek=4194304 conv=notrunc
  dd if=/data/test/random.bin bs=1 skip=4194304 count=11
'
```

**✅ 成功：** 输出显示 `overwritten`。

### Rename（原子操作）

```shell
kubectl exec -i -n <NAMESPACE> <APP_POD> -- bash -c '
  echo "atomic save" > /data/test/file.tmp
  mv /data/test/file.tmp /data/test/file.txt
  cat /data/test/file.txt
'
```

**✅ 成功：** 输出显示 `atomic save`。

### Truncate

```shell
kubectl exec -i -n <NAMESPACE> <APP_POD> -- bash -c '
  echo "long content here" > /data/test/trunc.txt
  truncate -s 4 /data/test/trunc.txt
  wc -c /data/test/trunc.txt
'
```

**✅ 成功：** 输出显示 `4`。

### 目录 Rename

```shell
kubectl exec -i -n <NAMESPACE> <APP_POD> -- bash -c '
  mkdir -p /data/test/dir-a/sub
  touch /data/test/dir-a/sub/file.txt
  mv /data/test/dir-a /data/test/dir-b
  ls /data/test/dir-b/sub/
'
```

**✅ 成功：** 输出显示 `file.txt`。

### 符号链接

```shell
kubectl exec -i -n <NAMESPACE> <APP_POD> -- bash -c '
  echo "link target" > /data/test/original.txt
  ln -s /data/test/original.txt /data/test/link.txt
  cat /data/test/link.txt
  readlink /data/test/link.txt
'
```

**✅ 成功：** 输出显示 `link target` 和 `/data/test/original.txt`。

## 参考资料

* [S3-API 写入优化](/ee-ai-cn/performance/s3-write-cache.md) — 通过 S3 API 使用写缓存（顺序写入，无 POSIX）
* [FUSE 写入优化](/ee-ai-cn/performance/fuse-write-cache.md) — 通过 FUSE 访问基础写缓存（一次性写入，有限 POSIX）
* [POSIX API](/ee-ai-cn/data-access/fuse-based-posix-api.md) — FUSE 部署详情、挂载选项和读缓存模式


---

# 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/fuse-workspace.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.
