Skip to content
LangSmith 文档版本 跟随上游 源快照 4d8fdfe3 更新于 2026-10-18

为规模配置 LangSmith

WARNING

本页上的缩放指导与示例配置适用于 LangSmith 版本 v0.13.0 或更高。

一个自托管 LangSmith 实例能处理大量追踪和用户。自托管部署的默认配置能处理相当负载,你可以把你的部署配置成能实现更高规模。本页描述缩放考量,并提供一些示例帮你配置你的自托管实例。

有关示例配置,参阅用于规模的 LangSmith 示例配置。

总结

下表提供了一个概览,针对不同负载模式(读/写)比较不同的 LangSmith 配置:

低 / 低低 / 高高 / 低中 / 中高 / 高

并发前端用户

| 5 | 5 | 50 | 20 | 50 | |

每秒提交的追踪数

| 10 | 1000 | 10 | 100 | 1000 | | 前端副本
(500m CPU, 每副本请求 1Gi) | 1 (默认) | 4 | 2 | 2 | 4 | | 平台后端副本
(1 CPU, 每副本请求 2Gi) | 3 (默认) | 20 | 3 (默认) | 3 (默认) | 20 | | 摄取队列副本
(1 CPU, 每副本请求 2Gi) | 3 (默认) | 24 | 3 (默认) | 6 | 24 | | 后端副本
(1 CPU, 每副本请求 2Gi) | 2 (默认) | 5 | 40 | 16 | 50 | | Redis 资源 | 8 Gi (默认) | 26 Gi 外部 | 8 Gi (默认) | 13Gi 外部 | 26 Gi 外部 | | ClickHouse 资源 | 4 CPU
16 Gi (默认) | 10 CPU
32Gi memory | 8 CPU
16 Gi per replica | 16 CPU
24Gi memory | 14 CPU
24 Gi per replica | | ClickHouse 部署 | 单实例 | 单实例 | 3 节点

复制集群

| 单实例 | 3 节点

复制集群

| |

Postgres 资源

| 2 CPU
8 GB memory
10 GB storage (外部) | 2 CPU
8 GB memory
10 GB storage (外部) | 2 CPU
8 GB memory
10 GB storage (外部) | 2 CPU
8 GB memory
10 GB storage (外部) | 2 CPU
8 GB memory
10 GB storage (外部) | | Blob 存储 | 禁用 | 启用 | 启用 | 启用 | 启用 |

NOTE

上面的每副本数字是资源请求,即 Kubernetes 调度器保留的量。限制在每个情形下都更高。有关 chart 随附的默认值,见 默认资源请求与限制。

一个超过其内存限制的容器会被 OOM 杀死,一个超过其 CPU 限制的容器 会被限流。不要在对结果做负载测试之前,把任一项调低到随附默认值以下。

下面我们更详细地阐述读和写路径,并提供一个 values.yaml 片段供你为你的自托管 LangSmith 实例起步。

默认资源请求与限制

Helm chart 为 LangSmith 应用服务随附这些请求和限制。上面的 汇总表涵盖 Postgres、Redis 和 ClickHouse,以及每种负载模式要运行的 副本数。

values.yaml 键请求(CPU / 内存)限制(CPU / 内存)默认副本
frontend500m / 1Gi1000m / 2Gi1
backend1000m / 2Gi2000m / 4Gi2
platformBackend1000m / 2Gi2000m / 4Gi3
ingestQueue1000m / 2Gi2000m / 4Gi3
queue1000m / 2Gi2000m / 4Gi1
playground500m / 1Gi1000m / 8Gi1
aceBackend1000m / 2000Mi2000m / 4000Mi1
hostBackend200m / 1000Mi1000m / 2Gi1
listener1000m / 2Gi2000m / 4Gi1
operator1000m / 2Gi2000m / 4Gi1

每个键把它的资源嵌在 deployment 之下,因此 backend 的请求在 backend.deployment.resources.requests。playground 是唯一一个内存限制 远高于其请求的服务,是 8Gi 对 1Gi,因此要按限制来确定 它所调度到的节点大小。要确认你 chart 版本的默认值, 运行 helm show values langchain/langsmith。

默认自动缩放范围

下表中的每个服务默认都禁用自动缩放。每个服务随附两个 带相同副本范围的块:autoscaling.hpa,用于 Kubernetes HorizontalPodAutoscaler(HPA),以及 autoscaling.keda,用于 KEDA(Kubernetes 事件驱动自动缩放)。启用其中一个而非 两者。

values.yaml 键最小副本最大副本
frontend15
backend26
platformBackend310
ingestQueue310
queue110
playground15
aceBackend15
hostBackend15
listener110

HPA 的键是 minReplicas 和 maxReplicas;KEDA 的等价项是 minReplicaCount 和 maxReplicaCount。operator 没有自动缩放块,始终按其配置的 副本数运行。对于队列服务,优先考虑 KEDA,它基于队列积压而非 仅 CPU 和内存来缩放。更多信息参阅 用 KEDA 为 LangSmith 队列自动缩放。

WARNING

启用自动缩放会覆盖你的副本数。当某个服务的任一块被启用时, chart 就不再在该 deployment 上设置 replicas,自动缩放器拥有它, 因此你配置的 deployment.replicas 值不再生效。

随附的最大值是通用的起点,不是与汇总表中负载模式相匹配的值。 高读、高写 需要 50 个 backend 副本、24 个 ingestQueue 和 20 个 platformBackend,而随附最大值是 6、10 和 10。一个为该负载定规格、 然后切到自动缩放的部署,会运行在你所配置容量的 一小部分。

把 maxReplicas 设在你负载模式的副本数或以上,把 minReplicas 设 为你想保持的稳态数量。 示例配置为每个服务都给了 一个固定副本数和一个带注释的自动缩放范围。

追踪摄取(写路径)

常见给写路径带来负载的用法:

  • 通过 Python 或 JavaScript LangSmith SDK 摄取追踪
  • 通过 @traceable wrapper 摄取追踪
  • 通过 /runs/multipart 端点提交追踪

在追踪摄取中扮演重要角色的服务:

  • Platform backend 服务:接收摄取追踪的初始请求,并把追踪放入一个 Redis 队列
  • Redis 缓存:用于排队需要被持久化的追踪
  • Ingest queue 服务:为查询而持久化追踪
  • ClickHouse:用于追踪的持久存储

当缩放写路径(追踪摄取)时,监控上面列出的四个服务/资源很有帮助。这里有一些典型改动能帮助提升追踪摄取的性能:

  • 如果 ClickHouse 接近资源限制,给它更多资源(CPU 和内存)。
  • 如果摄取请求响应耗时很长,增加 platform-backend pod 的数量。
  • 如果追踪从 Redis 处理得不够快,增加 ingest queue 服务 pod 副本。
  • 如果你注意到当前 Redis 实例接近资源限制,使用更大的 Redis 缓存。这也可能是摄取请求耗时很长的原因。

追踪查询(读路径)

常见给读路径带来负载的用法:

  • 在前端查看追踪项目或单条追踪的用户
  • 用于查询追踪信息的脚本
  • 访问 /runs/query 或 /runs/<run-id> api 端点

在查询追踪中扮演重要角色的服务:

  • Backend 服务:接收请求,并向 ClickHouse 提交一个查询以响应请求
  • ClickHouse:追踪的持久存储。请求追踪信息时查询的主数据库。

当缩放读路径(追踪查询)时,监控上面列出的两个服务/资源很有帮助。这里有一些典型改动能帮助提升追踪查询的性能:

  • 增加 backend 服务 pod 的数量。如果 backend 服务 pod 接近 1 核心 CPU 使用,这最有效。
  • 给 ClickHouse 更多资源(CPU 或内存)。ClickHouse 可能非常耗资源,但它应当能带来更好的性能。
  • 迁移到一个复制 ClickHouse 集群。增加 ClickHouse 副本有助于读性能,但我们建议保持在 5 副本以下(从 3 开始)。

有关这如何翻译为 helm chart values 的更精确指导,参阅下面节中的示例。如果你不确定为什么你的 LangSmith 实例无法处理某个负载模式,联系 LangChain 团队。

用 KEDA 为 LangSmith 队列自动缩放

NOTE

在 LangSmith v0.13.0 及更高版本中可用。

我们强烈建议在你的集群上安装 KEDA。KEDA 使 queue 和 ingest-queue 服务能根据其队列积压大小,以及 CPU 和内存自动缩放。这会带来更高效的资源利用和更好的流量峰值处理。

安装 KEDA

bash
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda --namespace keda --create-namespace

配置 KEDA 自动缩放

KEDA 安装后,你可以在 values.yaml 中为 queue 和 ingest-queue 服务启用基于 KEDA 的自动缩放:

yaml
queue:
  autoscaling:
    keda:
      enabled: true

ingestQueue:
  autoscaling:
    keda:
      enabled: true

启用 KEDA 后,队列服务会在其积压增长时自动缩放上去,在其积压被处理完时缩放下来。这对于处理可变的追踪摄取负载而不过度预配资源尤为有用。

NOTE

你也可以为其他服务(backend、platformBackend 等)启用 KEDA,但它们仍只会随 CPU 和内存缩放。

用于规模的 LangSmith 示例配置

下面我们基于预期的读和写负载提供一些 LangSmith 示例配置。

对于读负载(追踪查询):

  • 低大致意味着同时约 5 个用户查看追踪(约每秒 10 个请求)
  • 中大致意味着同时约 20 个用户查看追踪(约每秒 40 个请求)
  • 高大致意味着同时约 50 个用户查看追踪(约每秒 100 个请求)

对于写负载(追踪摄取):

  • 低意味着最多每秒提交 10 条追踪
  • 中意味着最多每秒提交 100 条追踪
  • 高意味着最多每秒提交 1000 条追踪

NOTE

确切的最优配置取决于你的用法和追踪载荷。将下面的示例与上面的信息以及你的具体用法结合使用,按你看到的合适方式更新你的 LangSmith 配置。如有任何疑问,请联系 LangChain 团队。

低读、低写

默认的 LangSmith 配置能处理这种负载。这里无需自定义资源配置。

低读、高写

你有非常高规模的追踪摄取,但在任一时点前端上查询追踪的用户只有个位数。

为此,我们推荐如下配置:

yaml
config:
  blobStorage:
    # Please also set the other keys to connect to your blob storage. See configuration section.
    enabled: true
  settings:
    redisRunsExpirySeconds: "3600"
# ttl:
#   enabled: true
#   ttl_period_seconds:
#     longlived: "7776000"  # 90 days (default is 400 days)
#     shortlived: "604800"  # 7 days (default is 14 days)

frontend:
  deployment:
    replicas: 4 # OR enable autoscaling below
# autoscaling:
#   hpa:
#     enabled: true
#     minReplicas: 2
#     maxReplicas: 4

platformBackend:
  deployment:
    replicas: 20 # OR enable autoscaling below
# autoscaling:
#   hpa:
#     enabled: true
#     minReplicas: 8
#     maxReplicas: 20

ingestQueue:
  deployment:
    replicas: 24 # OR enable KEDA autoscaling below
# autoscaling:
#   keda:
#     enabled: true
#     minReplicaCount: 8
#     maxReplicaCount: 24

backend:
  deployment:
    replicas: 5 # OR enable autoscaling below
# autoscaling:
#   hpa:
#     enabled: true
#     minReplicas: 3
#     maxReplicas: 5

## Ensure your Redis cache is at least 26 GB for high write scale
redis:
  external:
    enabled: true
    existingSecretName: langsmith-redis-secret # Set the connection url for your external Redis instance (26+ GB)

clickhouse:
  statefulSet:
    persistence:
      # This may depend on your configured TTL (see config section).
      # We recommend 600Gi for every shortlived TTL day if operating at this scale constantly.
      size: 4200Gi # This assumes 7 days TTL and operating a this scale constantly.
    resources:
      requests:
        cpu: "10"
        memory: "32Gi"
      limits:
        cpu: "16"
        memory: "48Gi"

commonEnv:
  - name: "CLICKHOUSE_ASYNC_INSERT_WAIT_PCT_FLOAT"
    value: "0"

高读、低写

你有相对较低规模的追踪摄取,但有许多前端用户查询追踪,和/或有频繁访问 /runs/query 或 /runs/<run-id> 端点的脚本。

对此,我们强烈建议设置一个复制 ClickHouse 集群,以在低延迟下实现高读规模。 有关如何设置一个复制 ClickHouse 集群的更多指导,参阅我们的外部 ClickHouse 文档。对于这种负载模式,我们建议使用一个 3 节点复制设置,其中集群里每个副本的资源请求为 8+ 核心、16+ GB 内存,资源限制为 12 核心、32 GB 内存。

为此,我们推荐如下配置:

yaml
config:
  blobStorage:
    # Please also set the other keys to connect to your blob storage. See configuration section.
    enabled: true

frontend:
  deployment:
    replicas: 2

ingestQueue:
  deployment:
    replicas: 3 # OR enable KEDA autoscaling below
# autoscaling:
#   keda:
#     enabled: true
#     minReplicaCount: 2
#     maxReplicaCount: 3

backend:
  deployment:
    replicas: 40 # OR enable autoscaling below
# autoscaling:
#   hpa:
#     enabled: true
#     minReplicas: 16
#     maxReplicas: 40

# We strongly recommend setting up a replicated clickhouse cluster for this load.
# Update these values as needed to connect to your replicated clickhouse cluster.
clickhouse:
  external:
    # If using a 3 node replicated setup, each replica in the cluster should have resource requests of 8+ cores and 16+ GB memory, and resource limit of 12 cores and 32 GB memory.
    enabled: true
    host: langsmith-ch-clickhouse-replicated.default.svc.cluster.local
    port: "8123"
    nativePort: "9000"
    user: "default"
    password: "password"
    database: "default"
    cluster: "replicated"

中读、中写

这是一个良好的全方位配置,应能处理 LangSmith 大多数使用模式。在内部测试中,这个配置让我们能缩放到每秒 100 条追踪摄取和每秒 40 个读请求。

为此,我们推荐如下配置:

yaml
config:
  blobStorage:
    # Please also set the other keys to connect to your blob storage. See configuration section.
    enabled: true
  settings:
    redisRunsExpirySeconds: "3600"

frontend:
  deployment:
    replicas: 2

ingestQueue:
  deployment:
    replicas: 6 # OR enable KEDA autoscaling below
# autoscaling:
#   keda:
#     enabled: true
#     minReplicaCount: 3
#     maxReplicaCount: 6

backend:
  deployment:
    replicas: 16 # OR enable autoscaling below
# autoscaling:
#   hpa:
#     enabled: true
#     minReplicas: 8
#     maxReplicas: 16

redis:
  statefulSet:
    resources:
      requests:
        memory: 13Gi
      limits:
        memory: 13Gi

  # -- For external redis instead use something like below --
  # external:
  #   enabled: true
  #   connectionUrl: "<URL>" OR existingSecretName: "<SECRET-NAME>"

clickhouse:
  statefulSet:
    persistence:
      # This may depend on your configured TTL.
      # We recommend 60Gi for every shortlived TTL day if operating at this scale constantly.
      size: 420Gi # This assumes 7 days TTL and operating a this scale constantly.
    resources:
      requests:
        cpu: "16"
        memory: "24Gi"
      limits:
        cpu: "28"
        memory: "40Gi"

commonEnv:
  - name: "CLICKHOUSE_ASYNC_INSERT_WAIT_PCT_FLOAT"
    value: "0"

WARNING

如果你在使用上述配置后仍注意到读得慢,我们建议迁移到一个复制 Clickhouse 集群设置

高读、高写

你有非常高的追踪摄取速率(接近每秒 1000 条提交),也有许多用户在前端查询追踪(超过 50 用户),和/或持续向 /runs/query 或 /runs/<run-id> 端点发请求的脚本。

对此,我们非常强烈地建议设置一个复制 ClickHouse 集群,以防止在高写规模下降级的读性能。 有关如何设置一个复制 ClickHouse 集群的更多指导,参阅我们的外部 ClickHouse 文档。对于这种负载模式,我们建议使用一个 3 节点复制设置,其中集群里每个副本的资源请求为 14+ 核心、24+ GB 内存,资源限制为 20 核心、48 GB 内存。我们还建议每个 ClickHouse 节点/实例按你所启用的每天 TTL(如下方配置)具备 600 Gi 的卷存储。

总体上,我们推荐这样一个配置:

yaml
config:
  blobStorage:
    # Please also set the other keys to connect to your blob storage. See configuration section.
    enabled: true
  settings:
    redisRunsExpirySeconds: "3600"
# ttl:
#   enabled: true
#   ttl_period_seconds:
#     longlived: "7776000"  # 90 days (default is 400 days)
#     shortlived: "604800"  # 7 days (default is 14 days)

frontend:
  deployment:
    replicas: 4 # OR enable autoscaling below
# autoscaling:
#   hpa:
#     enabled: true
#     minReplicas: 2
#     maxReplicas: 4

platformBackend:
  deployment:
    replicas: 20 # OR enable autoscaling below
# autoscaling:
#   hpa:
#     enabled: true
#     minReplicas: 8
#     maxReplicas: 20

ingestQueue:
  deployment:
    replicas: 24 # OR enable KEDA autoscaling below
# autoscaling:
#   keda:
#     enabled: true
#     minReplicaCount: 8
#     maxReplicaCount: 24

backend:
  deployment:
    replicas: 50 # OR enable autoscaling below
# autoscaling:
#   hpa:
#     enabled: true
#     minReplicas: 20
#     maxReplicas: 50

## Ensure your Redis cache is at least 26 GB for high write scale
redis:
  external:
    enabled: true
    existingSecretName: langsmith-redis-secret # Set the connection url for your external Redis instance (26+ GB)

# We strongly recommend setting up a replicated clickhouse cluster for this load.
# Update these values as needed to connect to your replicated clickhouse cluster.
clickhouse:
  external:
    # If using a 3 node replicated setup, each replica in the cluster should have resource requests of 14+ cores and 24+ GB memory, and resource limit of 20 cores and 48 GB memory.
    enabled: true
    host: langsmith-ch-clickhouse-replicated.default.svc.cluster.local
    port: "8123"
    nativePort: "9000"
    user: "default"
    password: "password"
    database: "default"
    cluster: "replicated"

commonEnv:
  - name: "CLICKHOUSE_ASYNC_INSERT_WAIT_PCT_FLOAT"
    value: "0"

NOTE

确保 Kubernetes 集群配置了足够资源以缩放到推荐大小。部署后,Kubernetes 集群中所有 pod 都应处于 Running 状态。卡在 Pending 的 pod 可能表明你接近节点池上限或需要更大的节点。

另外,确保部署在集群上的任何 ingress 控制器能处理期望的负载以避免瓶颈。


BytesRouter 是社区翻译站点,所有译文仅供参考,一切以官方英文原文为准。