4. Knative 容量参数之并发度(Concurrency):软限制与硬限制、target 与 limit 的区别及配置示例

在 Knative Serverless 架构中,并发度(Concurrency)是控制每个 Pod(Revision 实例)能够同时处理的最大请求数量的核心容量参数。正确配置并发度直接影响服务的响应延迟、资源利用率以及自动扩缩容的灵敏度。Knative 提供了两对关键概念:软限制(Soft Limit)与硬限制(Hard Limit),以及target 与 limit。理解它们的区别是精细化调优的基础。

4.1 核心概念:软限制 vs 硬限制

Knative 通过两个层级的参数来管理并发:

  • 软限制(Soft Limit / Target):由 Autoscaler 读取,用于计算期望的 Pod 副本数。它不是一个强制性的上限,而是扩缩容的“目标值”。Autoscaler 会尽力让每个 Pod 的并发量接近这个值。
  • 硬限制(Hard Limit):由 Activator / Queue-Proxy 强制执行。当并发请求数达到此上限时,新的请求会被排队(或返回错误,取决于配置),确保 Pod 不会过载。
关键区别:软限制是“计划”指标,用于扩缩容决策;硬限制是“保护”指标,用于防止 Pod 被压垮。两者可以相同,也可以不同,但通常建议硬限制 ≥ 软限制。

4.2 target 与 limit 的区别

在 Knative 的配置模型中,target 和 limit 分别对应上述的软限制和硬限制:

参数 配置位置 类型 作用 默认值
containerConcurrency Revision Template (spec) 硬限制 (Hard Limit) Queue-Proxy 强制限制并发请求数,超过则排队 0(无限制)
autoscaling.knative.dev/target Annotation (Revision) 软限制 (Soft Limit / Target) Autoscaler 期望的并发目标值,用于计算副本数 100
autoscaling.knative.dev/targetUtilizationPercentage Annotation (Revision) 目标利用率百分比 Autoscaler 实际使用的目标 = target × 百分比 70%
注意:当 containerConcurrency 设置为 0 时,表示无硬限制。此时 Autoscaler 仍然会基于 target 进行扩缩容,但 Pod 可能承载远超 target 的并发请求,导致延迟飙升。生产环境建议始终设置合理的硬限制。

4.3 并发度参数的工作流程

下图展示了请求从 Ingress 到 Pod 的过程中,软限制与硬限制如何协同工作:

Knative 并发度软限制与硬限制工作流程 Knative 并发度:软限制与硬限制工作流程 请求入口 硬限制检查 Pod 实例 Autoscaler 并发 Metrics 采集 软限制 (target) 用于扩缩容决策 硬限制 (limit) 强制保护 Pod 不超载

4.4 配置示例

以下 YAML 示例展示了如何通过 Annotation 和 Spec 字段配置并发度参数:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: concurrency-demo
  namespace: default
spec:
  template:
    metadata:
      annotations:
        # 软限制:Autoscaler 期望每个 Pod 的并发目标为 10
        autoscaling.knative.dev/target: "10"
        # 目标利用率百分比:实际目标 = 10 * 0.7 = 7
        autoscaling.knative.dev/targetUtilizationPercentage: "70"
    spec:
      containerConcurrency: 20   # 硬限制:Queue-Proxy 最多允许 20 个并发请求
      containers:
        - image: gcr.io/knative-samples/helloworld-go
          ports:
            - containerPort: 8080

4.5 参数组合场景分析

不同的 target 与 limit 组合会产生不同的行为模式:

场景 target containerConcurrency 行为描述
默认模式 100 0(无限制) Autoscaler 以 100 为目标扩缩容,但 Pod 可能承载数百并发,延迟不可控
严格保护 5 5 软硬一致,每个 Pod 最多 5 并发,超过排队,扩缩容目标明确
弹性缓冲 10 20 Autoscaler 以 10 为目标扩容,允许突发流量达到 20,兼顾资源效率与稳定性
高吞吐优先 50 100 允许较高并发,适合批处理或延迟不敏感的任务,减少 Pod 数量

4.6 最佳实践与诊断要点

  • 设置合理的硬限制:始终设置 containerConcurrency,避免无限制导致 Pod 资源耗尽。建议值基于应用的单请求资源消耗和 Pod 资源上限计算。
  • target 与 limit 的比值:通常 target 设置为 limit 的 50%~80%,为突发流量预留缓冲空间。
  • 监控实际并发:通过 Queue-Proxy 暴露的 metrics 端点(如 queue_requests_per_concurrency)观察实际并发是否接近 target,判断是否需要调整。
  • 避免 target 过低:target 设置过低(如 1)会导致频繁扩缩容,增加冷启动开销。对于短请求服务,建议 target 在 5~20 之间。
核心结论:并发度配置的核心是平衡“资源效率”与“稳定性”。软限制(target)驱动扩缩容,硬限制(containerConcurrency)保护 Pod。生产环境推荐使用“弹性缓冲”模式(target < limit),并配合 targetUtilizationPercentage 进行微调。