> ## Documentation Index
> Fetch the complete documentation index at: https://enterprise-docs.dify.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 性能调优

## 显示 Helm Chart 值

```bash theme={null}
helm show values dify/dify
```

## 1. 调整基础资源

你可以通过调整 Helm Chart 中各服务的副本数和资源配置提升 Dify 的整体吞吐。实际配置应结合业务负载、集群资源、数据库连接上限和队列积压情况逐步调整。

| 分类     | 组件                   | Replicas | Request CPU | Request Mem | Limit CPU | Limit Mem | 备注                                              |
| ------ | -------------------- | -------- | ----------- | ----------- | --------- | --------- | ----------------------------------------------- |
| 核心应用组件 | API                  | 2        | 1           | 1 GB        | 1         | 2 GB      | 根据 API QPS 和响应时间横向扩容                            |
|        | Worker               | 4        | 4           | 4 GB        | 4         | 8 GB      | 默认兜底 worker，3.9.x 推荐优先参考 additionalWorkers 拆分策略 |
|        | Worker Beat          | 1        | 1           | 2 GB        | 2         | 4 GB      | 固定 1 副本，不建议扩容                                   |
|        | Web                  | 1        | 0.5         | 1 GB        | 1         | 2 GB      | 根据前端访问量横向扩容                                     |
|        | Sandbox              | 1        | 2           | 2 GB        | 2         | 4 GB      | 根据代码执行任务量调整                                     |
| 企业版组件  | Enterprise           | 1        | 2           | 2 GB        | 2         | 2 GB      | 按需扩容                                            |
|        | Enterprise\_Audit    | 1        | 1           | 2 GB        | 2         | 4 GB      | 按需扩容                                            |
|        | Enterprise\_Frontend | 1        | 1           | 2 GB        | 1         | 2 GB      | 按需扩容                                            |
| 插件组件   | Plugin Daemon        | 1        | 1           | 2 GB        | 2         | 4 GB      | 插件调用和安装量较大时调整                                   |
|        | Plugin Controller    | 1        | 0.5         | 1 GB        | 1         | 2 GB      | 按需扩容                                            |
|        | Plugin Connector     | 1        | 1           | 2 GB        | 1         | 2 GB      | 按需扩容                                            |
|        | Plugin Manager       | 1        | 1           | 2 GB        | 2         | 4 GB      | 按需扩容                                            |
| 基础组件   | SSRF Proxy           | 1        | 0.5         | 0.5 GB      | 1         | 1 GB      | 按需扩容                                            |
|        | Gateway              | 1        | 1           | 2 GB        | 2         | 4 GB      | 插件流量较大时调整                                       |
|        | Unstructured         | -        | -           | -           | -         | -         | 按文档解析任务量调整                                      |
|        | MinIO                | -        | -           | -           | -         | -         | 按存储吞吐和容量调整                                      |

基础配置示例：

```yaml theme={null}
api:
  replicas: 2
  serverWorkerAmount: 1
  resources:
    requests:
      cpu: 1
      memory: 1Gi
    limits:
      cpu: 1
      memory: 2Gi

worker:
  replicas: 4
  celeryWorkerAmount: 1
  resources:
    requests:
      cpu: 4
      memory: 4Gi
    limits:
      cpu: 4
      memory: 8Gi

workerBeat:
  resources:
    requests:
      cpu: 1
      memory: 2Gi
    limits:
      cpu: 2
      memory: 4Gi
```

## 2. 按队列拆分 Worker

3.9.x 的 Helm Chart 支持通过 `additionalWorkers` 将原本由默认 `worker` 处理的 Celery 队列拆分到独立 Deployment。这样可以对不同类型任务独立设置副本数、CPU、内存和调度策略。

默认 `worker` 是兜底 worker，会消费所有队列。启用 `additionalWorkers` 后有两种常见方式：

* **保守模式**：保留 `worker.enabled: true`，只额外启用热点队列的专用 worker。适合初次调优，默认 worker 继续兜底消费未拆分队列。
* **完全拆分模式**：设置 `worker.enabled: false`，并确保所有实际使用的队列都有对应的 `additionalWorkers` 消费。否则相关后台任务会积压。

常见拆分如下：

| Worker            | 队列                                                                                         | 适用场景                   |
| ----------------- | ------------------------------------------------------------------------------------------ | ---------------------- |
| `dataset-worker`  | `dataset,priority_dataset,pipeline,priority_pipeline`                                      | 知识库导入、文档解析、索引构建压力较大    |
| `workflow-worker` | `workflow,workflow_storage,workflow_based_app_execution`                                   | 工作流执行量或工作流存储任务较多       |
| `general-worker`  | `mail,ops_trace,app_deletion,conversation,api_token,plugin,retention,enterprise_telemetry` | 邮件、会话、插件、清理、审计和遥测等后台任务 |
| `trigger-worker`  | `schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor` | 定时任务、触发器相关任务           |

<Warning>
  如果关闭默认 `worker`，请确认数据集、工作流、通用后台任务和触发器队列都已有对应 worker 消费。只开启部分 `additionalWorkers` 后直接关闭默认 `worker`，可能导致未覆盖队列无人消费。
</Warning>

保守模式示例：

```yaml theme={null}
worker:
  enabled: true
  replicas: 1

additionalWorkers:
  - name: workflow-worker
    enabled: true
    replicas: 2
    celeryQueues: "workflow,workflow_storage,workflow_based_app_execution"
    celeryWorkerAmount: 2
    resources:
      requests:
        cpu: 2
        memory: 4Gi
      limits:
        cpu: 4
        memory: 8Gi
```

完全拆分模式示例：

```yaml theme={null}
worker:
  enabled: false

additionalWorkers:
  - name: dataset-worker
    enabled: true
    replicas: 1
    celeryQueues: "dataset,priority_dataset,pipeline,priority_pipeline"
    celeryWorkerAmount: 4

  - name: workflow-worker
    enabled: true
    replicas: 2
    celeryQueues: "workflow,workflow_storage,workflow_based_app_execution"
    celeryWorkerAmount: 2

  - name: general-worker
    enabled: true
    replicas: 1
    celeryQueues: "mail,ops_trace,app_deletion,conversation,api_token,plugin,retention,enterprise_telemetry"
    celeryWorkerAmount: 1

  - name: trigger-worker
    enabled: true
    replicas: 1
    celeryQueues: "schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor"
    celeryWorkerAmount: 1
```

调优建议：

* 并发任务多、队列积压明显时，优先增加对应 worker 的 `replicas`。
* 单个任务本身很重、Pod 内存持续接近 limit 或出现 OOMKilled 时，提高对应 worker 的 memory limit。
* 不建议盲目增大 `celeryWorkerAmount`。它会增加单 Pod 并发，也会增加数据库连接、Redis 连接和内存压力。
* `workerBeat` 只负责定时任务调度，应保持 1 副本。

## 3. 优化外部 Postgres 数据库性能

### 3.1 计算数据库最大连接数

在配置数据库时，需要根据 API 和所有 worker 的连接池上限估算所需的最大连接数：

```
数据库最大连接数 =
  (SQLALCHEMY_POOL_SIZE + SQLALCHEMY_MAX_OVERFLOW) × API serverWorkerAmount × API replicas
+ (SQLALCHEMY_POOL_SIZE + SQLALCHEMY_MAX_OVERFLOW) × 默认 worker celeryWorkerAmount × 默认 worker replicas
+ Σ[(SQLALCHEMY_POOL_SIZE + SQLALCHEMY_MAX_OVERFLOW) × additionalWorker celeryWorkerAmount × additionalWorker replicas]
```

示例：

* API: replicas=2, serverWorkerAmount=1
* 默认 Worker: replicas=4, celeryWorkerAmount=1
* `SQLALCHEMY_POOL_SIZE=100`
* `SQLALCHEMY_MAX_OVERFLOW=150`

则最大连接数为：

```
(100 + 150) × 1 × 2 + (100 + 150) × 1 × 4 = 500 + 1000 = 1500
```

<Warning>
  建议在计算结果基础上预留 20-30% 的余量，以应对突发流量。上述示例中，建议将 `max_connections` 设置为 1800-2000 或更高，并结合数据库实例规格确认可承载。
</Warning>

## 4. 性能监控建议

| 症状            | 可能原因                                          | 解决方案                                          |
| ------------- | --------------------------------------------- | --------------------------------------------- |
| API 响应慢       | API replicas 或 `serverWorkerAmount` 不足；数据库慢查询 | 增加 API replicas，排查数据库慢查询                      |
| Workflow 队列积压 | `workflow-worker` 处理能力不足                      | 增加 `workflow-worker.replicas`，必要时提高资源限制       |
| 知识库导入慢        | `dataset-worker` 资源不足；文档解析或向量库写入慢             | 启用或扩容 `dataset-worker`，检查 Unstructured 和向量数据库 |
| 邮件、插件、清理任务延迟  | `general-worker` 队列积压                         | 启用或扩容 `general-worker`                        |
| 定时任务或触发器延迟    | `trigger-worker` 队列积压                         | 启用或扩容 `trigger-worker`，保持 `workerBeat` 为 1 副本 |
| 数据库连接耗尽       | API/worker 并发和连接池配置过高                         | 增加 `max_connections` 或降低连接池/并发配置              |
| 内存溢出          | 单任务内存占用高或 memory limit 过低                     | 增加对应组件 memory limit，定位高内存任务                   |
| CPU 节流        | CPU limit 过低                                  | 增加对应组件 CPU limit 或 replicas                   |
