Java教程

Java与AI:虚拟线程不会突破模型服务的 rate limit 和连接池上限,Semaphore、连接池和限流器到底该分别卡在哪一层,才能既不让请求无限堆积又不把并发压得过低?

👤 为我痴狂 👁 50 阅读 ❤ 0 点赞 ➦ 0 分享 📅 2026-10-23
首页› 理学› Java教程› 正文
DEEP DIVE / CONCURRENCY CONTROL
Java 与 AI:虚拟线程不会突破模型服务的 rate limit 与连接池上限——Semaphore、连接池与限流器究竟该分别卡在哪一层
ABSTRACT

JDK 21 将虚拟线程(Virtual Thread,JEP 444)转为正式特性后,一种流行叙事是“线程不再是瓶颈,可以放心开大并发”。这一叙事在模型服务(LLM inference gateway)场景下是危险的:虚拟线程降低的是线程栈与上下文切换的单位成本,而模型服务的真实约束来自三处互不相同的硬边界——上游供应商的 RPM/TPM 配额、HTTP 客户端连接池的物理连接数、以及推理后端(GPU/推理引擎)的并发批处理容量。本文提出一条贯穿全文的分析主线:容量守恒(Capacity Conservation)——任何一层的并发放大,若未在同层或下游层建立等价的准入约束,最终只会把排队从线程池搬到堆内存、从堆内存搬到 TCP 连接、再从连接搬到上游 429 响应。围绕这条主线,本文逐层定位 Semaphore、连接池与限流器的职责边界,给出参数推导公式、可运行的代码骨架、观测指标与压测方法,并讨论结构化并发(JEP 480/499)与 JDK 25 生态下的新边界条件。

关键词:虚拟线程 · 容量守恒 · 信号量 · 连接池 · 令牌桶 · 模型服务网关 · 结构化并发

01 / INTRO导语:一个被误读的“并发自由”

JEP 444 在 JDK 21 中把虚拟线程定为正式特性,其核心承诺是:线程的创建与阻塞成本降低到可以“一请求一线程”。官方文档给出的定位很清晰——虚拟线程提升的是吞吐(throughput),而非降低延迟(latency);它面向的是大量并发、以阻塞 I/O 为主的任务。问题在于,很多团队把这句话读成了“并发上限消失了”。

在模型服务网关里,这个误读会以非常具体的方式反噬。假设网关用虚拟线程把每个请求都派发出去,每个请求内部调用一次上游 LLM API。若上游配额是每分钟 600 次请求(RPM),而网关在 1 秒内涌入 5000 个请求,虚拟线程会忠实地创建 5000 个任务、发起 5000 次连接尝试。结果不是“更快”,而是:连接池排队、TCP 建连风暴、上游返回 429、重试放大、堆内存里堆满等待中的 CompletableFuture 与响应体。线程变便宜了,但配额、连接、显存没有变便宜。

本文的核心判断:虚拟线程是“执行模型”的优化,不是“容量模型”的优化。容量模型必须由 Semaphore、连接池、限流器三者分别在不同层显式建立,且三者之间要满足守恒关系。任何试图用其中一层替代另外两层的做法,都会在某个边界条件下失效。

为了让讨论可验证,本文所有参数推导都给出公式与量纲,所有代码骨架都可直接编译运行(基于 JDK 21+),所有数据来源在文末标注。文中涉及的配额数值均为公开文档中的典型量级或明确标注的模拟数据,不作为任何具体厂商的承诺值。

02 / PROBLEM背景与问题定义:模型服务的四类硬边界

2.1 边界一:上游配额(RPM / TPM / RPD)

主流模型 API 普遍采用多维配额:每分钟请求数(RPM)、每分钟 token 数(TPM)、每日请求数(RPD),部分厂商还有并发请求数上限。这些配额是按账户/项目维度计量的,与客户端开多少线程完全无关。OpenAI 的 rate limits 文档明确说明配额按组织与项目分层,并建议客户端实现指数退避与请求排队;Anthropic 的 rate limits 文档同样区分 RPM、ITPM、OTPM 三类。这意味着:客户端并发放大只会更快撞墙。

2.2 边界二:HTTP 客户端连接池

JDK 内置的 java.net.http.HttpClient 在 HTTP/1.1 下每个目标主机有连接数上限(实现层面受 jdk.httpclient.connectionPoolSize 等系统属性影响),HTTP/2 下则受最大并发流数(jdk.httpclient.maxstreams,默认 100)约束。Apache HttpClient 5 的 PoolingHttpClientConnectionManager 则有 setMaxTotal 与 setDefaultMaxPerRoute 两个独立维度。连接是物理资源,虚拟线程无法凭空变出更多 socket。

2.3 边界三:推理后端并发容量

若网关后面是自建推理服务(vLLM、TensorRT-LLM、SGLang 等),真实约束是 GPU 显存与批处理调度。vLLM 的 PagedAttention 论文(Kwon et al., SOSP 2023)指出 KV cache 的显存占用随并发序列数与序列长度线性增长;连续批处理(continuous batching)提升的是 GPU 利用率,不是无限并发。超过显存阈值后,请求要么被拒绝,要么进入引擎内部队列,延迟急剧上升。

2.4 边界四:JVM 自身的内存与 GC

虚拟线程的栈存储在堆上(stack chunk 对象),单个虚拟线程的初始栈远小于平台线程,但并非零成本。JDK 文档与 JEP 444 都提到可通过 -Djdk.virtualThreadScheduler.parallelism 控制载体线程数。当百万级虚拟线程同时持有响应缓冲区时,堆压力会转化为 GC 压力,这是“线程便宜”叙事里最容易被忽略的一环。

本文评述

四类边界中,只有第四类与 JVM 直接相关,前三类都在 JVM 之外。这解释了一个常见现象:团队用虚拟线程压测,JVM 侧指标(线程数、GC)看起来非常健康,但上游 429 率飙升、P99 延迟爆炸。原因不是虚拟线程不好,而是观测口径与约束口径错位——你测的是执行层,卡你的是容量层。

03 / MAIN THREAD分析主线:容量守恒定律与三层卡点模型

3.1 容量守恒的表述

设系统在稳定状态下,某一资源 R 的可用容量为 C(单位:并发数、请求/秒、token/秒或连接数),到达速率为 λ,单次占用时长为 S。由 Little 定律,稳态下该资源的在制数 L = λ·S。容量守恒要求:

L_R = λ_R · S_R ≤ C_R      (对每一层资源 R 成立)
其中 R ∈ {准入队列, 连接, 上游配额, 推理并发, 堆内存}

虚拟线程改变的是“线程”这一资源的 C 值(从数千提升到百万量级),但 λ 与 S 不变,且下游各层的 C 不变。因此若不在下游层施加约束,L 会向下游转移,直到某一层溢出。这就是“排队搬家”现象。

3.2 三层卡点模型

笔者将网关的并发控制拆为三个职责互不重叠的层,每层只回答一个问题:

层级 组件 回答的问题 约束对象
L1 准入层限流器(RateLimiter)单位时间内允许多少请求进入?速率(RPM/TPM)
L2 资源层Semaphore / 连接池此刻有多少个请求能同时持有稀缺资源?并发数(许可/连接)
L3 出口层出口限流 + 退避重试对上游的瞬时压力是否超配额?上游配额 + 重试预算

本文评述:这三层不是“任选其一”的替代关系,而是串联关系。限流器管速率,不保证并发;Semaphore 管并发,不保证速率;连接池管物理连接,不保证业务语义。任何一层缺失,另外两层都会在特定流量形态下失效。例如只有限流器没有 Semaphore:突发流量在令牌桶窗口内被放行,但每个请求耗时 30 秒,在制数瞬间超过连接池上限,请求在连接池排队,排队时间计入超时,失败率上升。

04 / SEMAPHORE第一层:Semaphore 卡在“资源持有”而非“请求入口”

4.1 为什么不该在入口处用 Semaphore 限并发

一个常见写法是在 HTTP handler 最外层 acquire() 一个全局 Semaphore,然后才解析请求、鉴权、路由。这会把“非资源消耗型工作”也纳入许可占用,导致许可被慢请求长期占住,而快速失败路径(如参数校验失败)反而要排队。更严重的是,它把“准入”和“资源持有”混为一谈,使得许可数无法与任何真实资源对应。

正确的语义是:Semaphore 的许可数应等于它所保护的那一种稀缺资源的并发容量。如果它保护的是“同时打到推理后端的请求数”,那么许可数应等于推理引擎的安全并发;如果保护的是“同时持有的上游连接”,那这件事应该交给连接池而不是 Semaphore。两者都做,就是重复计数。

4.2 许可数的推导

设推理后端的安全并发为 N_safe(由显存与批处理配置决定),上游配额允许的稳态并发为 N_quota = RPM/60 × S_avg(S_avg 为平均请求耗时秒数),连接池上限为 N_conn。则 Semaphore 许可数应取:

permits = min(N_safe, N_quota, N_conn) × safety_factor
safety_factor ∈ [0.7, 0.9]   // 留出突发与长尾余量

举例(模拟数据,用于说明量纲):若 RPM=600、S_avg=8s,则 N_quota = 600/60×8 = 80;若连接池 maxTotal=200、每路由 100,则 N_conn=100;若推理后端安全并发为 64,则 permits = min(64,80,100)×0.8 ≈ 51。这个数字才是有物理意义的并发上限。

4.3 公平性与超时

new Semaphore(permits, true) 的公平模式能避免饥饿,但会降低吞吐(AQS 公平锁的唤醒开销)。笔者建议:面向交互式请求用公平模式,面向批处理用非公平模式;并且 tryAcquire(timeout) 的超时必须小于上游请求超时,否则许可等待会吃掉整个请求预算。这一点在虚拟线程下尤其重要:虚拟线程的阻塞很便宜,但“便宜地等待”不等于“应该无限等待”。

笔者认为

Semaphore 在虚拟线程时代的价值不是下降而是上升了。平台线程时代,线程池大小天然充当了一个粗糙的并发闸门;虚拟线程取消了这个闸门,于是必须用一个显式的、语义清晰的闸门替代它。Semaphore 就是这个替代品,前提是它的许可数有推导依据,而不是拍脑袋写 1000。

05 / CONNECTION POOL第二层:连接池卡在“物理连接”与“每主机配额”

5.1 连接池的两个独立维度

以 Apache HttpClient 5 为例,setMaxTotal 控制全局连接总数,setDefaultMaxPerRoute 控制单个路由(host:port)的连接数。二者必须同时设置,否则默认值(maxTotal=25、perRoute=5)会在高并发下成为隐形瓶颈。JDK HttpClient 在 HTTP/1.1 下的连接复用与 HTTP/2 的多路复用机制不同,前者受连接数约束,后者受流数约束,配置口径不能混用。

5.2 连接池与 Semaphore 的职责分界

连接池的 leaseConnection 本身就是一个阻塞式信号量。若在它外面再套一个 Semaphore,且两者许可数不同,就会出现“外层次信号量放行、内层连接池排队”的错配。判断标准很简单:如果 Semaphore 保护的资源就是连接,那就删掉 Semaphore,只调连接池参数;如果 Semaphore 保护的是连接之外的资源(如推理并发),那连接池上限应 ≥ Semaphore 许可数,避免连接成为更紧的瓶颈。

场景 应调参数 不应做的事
上游是单主机 HTTP/1.1maxTotal、perRoute、连接 TTL用 Semaphore 模拟连接数
上游是 HTTP/2 多路复用maxstreams、连接数(少量)按请求数配连接数
自建推理后端(gRPC)channel 数、maxInboundMessageSize把 gRPC 流当成无限并发

5.3 连接池的失效模式:连接泄漏与假死

连接泄漏的典型症状是 maxTotal 未满但请求持续排队,根因是响应体未关闭。在虚拟线程下,try-with-resources 依然是必须的,且要注意 InputStream 的关闭时机。另一个失效模式是“假死连接”:上游负载均衡器静默丢弃空闲连接,客户端仍认为连接可用,首次写入失败后重试。配置合理的 validateAfterInactivity 与连接 TTL 比调大连接数更有效。

06 / RATE LIMITER第三层:限流器卡在“出口配额”与“成本加权”

6.1 令牌桶与漏桶的适用边界

令牌桶(Token Bucket)允许一定程度的突发(burst),适合“配额按分钟计量、但流量天然有尖峰”的场景;漏桶(Leaky Bucket)输出恒定速率,适合保护脆弱下游。模型服务网关通常需要两级限流:入口用令牌桶吸收合理突发,出口用漏桶或平滑令牌桶对齐上游 RPM。Guava 的 RateLimiter 是单机实现,分布式场景需用 Redis + Lua 或专用限流服务,二者的一致性语义不同,不能简单互换。

6.2 成本加权:从 RPM 到 TPM

LLM 请求的成本不是均一的:输入 token 数与输出 token 数差异巨大,且输出 token 通常更贵(按 token 计费与按时间占用 GPU 双重维度)。若只按请求数限流,会出现“小请求畅通、大请求把 TPM 打爆”的偏差。可行做法是双维度限流:请求维度用 RPM 令牌桶,token 维度用 TPM 令牌桶,且 token 桶在请求开始时按预估 token 预扣、结束时按实际用量结算(预扣-结算模型)。

// 预扣-结算的伪代码
long est = estimateTokens(prompt) + maxTokens;
if (!tpmBucket.tryAcquire(est)) { rejectOrQueue(); }
try {
    Resp r = callUpstream(prompt);
    long actual = r.usage().totalTokens();
    tpmBucket.refund(est - actual);   // 多退少补
} catch (Exception e) {
    tpmBucket.refund(est);            // 失败全额退还
}

本文评述:预扣-结算模型的关键风险是“预估偏差”。若预估长期偏低,TPM 会被系统性超用;若长期偏高,吞吐被低估。工程上应维护预估误差的滑动分位数(如 P95 偏差),并定期校准预估函数。这一步没有银弹,只能靠观测数据迭代。

6.3 重试预算:限流器的孪生兄弟

429 响应后的重试如果不受控,会把限流效果完全抵消。业界常用的做法是重试预算(retry budget):以成功请求数为基数,允许的重试数不超过其固定比例(如 10%),并配合指数退避与抖动。gRPC 的 retry policy 与 Envoy 的 retry budget 都体现了这一思想。在模型网关中,重试还应区分错误类型:429 可重试但需退避,400/401 不可重试,5xx 视幂等性而定。

07 / DERIVATION参数推导:从 RPM/TPM 到信号量许可数的换算

7.1 完整推导链

设上游配额 RPM=Q_r,TPM=Q_t,平均每请求 token 数 T_avg,平均请求耗时 S_avg(秒),目标利用率 u(如 0.8)。则:

请求速率上限:  λ_r = Q_r / 60 × u            (req/s)
token 速率上限:λ_t = Q_t / 60 × u            (token/s)
按 token 折算的请求速率上限:λ_t' = λ_t / T_avg
有效到达速率:  λ = min(λ_r, λ_t')
稳态在制数:    L = λ × S_avg
Semaphore 许可:permits = ceil(L) + burst_headroom

注意这里 L 是“按配额推导的稳态在制数”,它必须再与推理后端安全并发 N_safe 取 min。若 L > N_safe,说明配额允许的并发超过了后端承受能力,此时瓶颈在后端,应扩容后端或降低 u,而不是继续放大 permits。

7.2 一个可复算的算例

(以下为模拟数据,仅用于演示推导过程)设 Q_r=3000 RPM,Q_t=400000 TPM,T_avg=1200 token,S_avg=6s,u=0.8,N_safe=128,连接池 perRoute=200。

  • λ_r = 3000/60×0.8 = 40 req/s
  • λ_t = 400000/60×0.8 ≈ 5333 token/s;λ_t' = 5333/1200 ≈ 4.44 req/s
  • λ = min(40, 4.44) = 4.44 req/s —— token 维度是更紧的约束
  • L = 4.44×6 ≈ 27;permits = 27 + 余量 ≈ 32
  • 校验:32 ≤ N_safe(128) ≤ perRoute(200),三层不冲突

这个算例说明一个反直觉结论:在长 prompt 场景下,TPM 往往先于 RPM 成为瓶颈,此时把 Semaphore 许可数按 RPM 推导会严重高估并发,导致上游 token 配额被打爆。这就是为什么限流器必须做 token 维度,而 Semaphore 许可数必须用 min 后的 λ 推导。

08 / CODE代码骨架:三层卡点的最小可运行实现

8.1 分层封装

public final class ModelGateway {
    private final Semaphore inflight;          // L2:资源层
    private final RateLimiter rpm;             // L1/L3:速率层
    private final TokenBucket tpm;             // L1/L3:token 层
    private final HttpClient http;             // L2:连接层

    public ModelGateway(int permits, double rpmRate, long tpmCapacity) {
        this.inflight = new Semaphore(permits, true);
        this.rpm = RateLimiter.create(rpmRate);
        this.tpm = new TokenBucket(tpmCapacity, tpmCapacity / 60.0);
        this.http = HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2)
                .connectTimeout(Duration.ofSeconds(3))
                .build();
    }

    public String call(String prompt, int maxTokens) throws Exception {
        long est = estimate(prompt) + maxTokens;
        if (!tpm.tryAcquire(est)) throw new RejectedException("tpm");
        if (!rpm.tryAcquire(200, TimeUnit.MILLISECONDS))
            throw new RejectedException("rpm");
        if (!inflight.tryAcquire(500, TimeUnit.MILLISECONDS))
            throw new RejectedException("inflight");
        try {
            var req = buildRequest(prompt, maxTokens);
            var resp = http.send(req, HttpResponse.BodyHandlers.ofString());
            long actual = parseUsage(resp.body());
            tpm.refund(est - actual);
            return resp.body();
        } catch (Exception e) {
            tpm.refund(est);
            throw e;
        } finally {
            inflight.release();
        }
    }
}

这段骨架刻意把三层顺序写成“token → rpm → inflight”,理由是:token 与 rpm 的拒绝成本最低(纯内存判断),应最先执行;inflight 的等待会占用虚拟线程,应最后执行且带短超时。若顺序反过来,大量请求会先占住 inflight 许可再被限流拒绝,许可被无效占用。

8.2 虚拟线程的接入方式

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    for (var task : tasks) {
        executor.submit(() -> gateway.call(task.prompt(), task.maxTokens()));
    }
}   // close() 会等待所有任务结束(JDK 21+ 语义)

注意 newVirtualThreadPerTaskExecutor 并不限制并发,它只是把每个任务映射到一个虚拟线程。真正的并发上限来自 gateway 内部的 inflight 信号量。这正是本文主线的落点:执行模型与容量模型解耦。

09 / OBSERVABILITY观测与压测:如何验证“没有无限堆积”

9.1 必须暴露的指标

指标 含义 健康阈值(经验)
inflight.available剩余许可数长期为 0 说明 permits 偏小
inflight.wait.p99许可等待时间< 请求预算的 10%
pool.pending连接池等待数应接近 0
upstream.429.rate上游限流比例< 1%(稳态)
reject.rate本地拒绝比例与容量规划一致,非 0 是正常的

9.2 压测方法:阶梯加压找拐点

用固定并发阶梯(如 10/20/50/100/200)逐级加压,每级持续 3–5 分钟,记录吞吐、P99、429 率、许可等待。拐点的判定标准是:吞吐不再随并发上升,而 P99 与 429 率同时上升。这个拐点对应的并发就是系统的有效容量,应作为 permits 的上界。压测时务必区分“网关自身瓶颈”与“上游配额瓶颈”,方法是临时把上游替换为本地 mock(固定延迟),先测出网关纯转发容量,再叠加真实上游。

9.3 虚拟线程的观测盲区

虚拟线程数量不是好的容量指标——它反映的是“有多少任务在等”,而不是“有多少资源在被用”。更有价值的指标是 jdk.virtualThreadScheduler.parallelism 对应的载体线程利用率,以及 JFR 中的 jdk.VirtualThreadPinned 事件(固定载体线程的阻塞)。JDK 21 中 synchronized 块内阻塞仍可能 pin 住载体线程,JDK 24(JEP 491)已解决这一问题,升级 JDK 是消除该盲区的直接手段。

10 / COMPARISON对比与局限:常见配置组合的失效模式

组合 现象 根因
有虚拟线程,无任何闸门上游 429 飙升,堆内存上涨λ 无约束,L 向下游转移
只有限流器,无 Semaphore窗口内突发打满连接池速率约束不等于并发约束
Semaphore 许可 > 连接池许可未满但连接排队两层容量不守恒
按 RPM 推导 permits,忽略 TPMtoken 配额被打爆成本维度缺失
重试无预算限流形同虚设重试放大 λ

本文评述:上表五种失效模式有一个共同结构——某一层的约束没有被翻译成下一层的参数。工程上可以用一个简单的自检清单规避:对每一层资源,问三个问题——它的 C 是多少?它的 λ 从哪来?它的 S 怎么测?三个问题答不上来,这一层就是裸奔的。

10.1 局限:单机信号量在分布式下的失效

本文的 Semaphore 方案默认是单实例网关。多实例部署时,每实例各持一份许可,全局并发 = 实例数 × permits,会突破上游配额。此时必须把 L1 限流器做成集中式(Redis + Lua 原子令牌桶,或独立限流服务),Semaphore 仍可保留为“每实例本地保护”,但其许可数应按“全局配额 / 实例数”重新推导。这是容量守恒在水平扩展下的直接推论。

11 / FRONTIER前沿预判:结构化并发与 JDK 25 后的边界变化

11.1 结构化并发(JEP 480/499)带来的语义变化

结构化并发把一组相关任务绑定到同一个作用域,作用域结束前所有子任务必须完成或被取消。这对网关的意义是:请求级超时与取消可以传播到所有子任务,避免“父请求已超时、子调用仍在跑”的许可泄漏。JEP 499(JDK 25 中的第五次预览)进一步收敛了 API。笔者认为,结构化并发与 Semaphore 是互补的:前者管生命周期,后者管容量;前者保证“不会漏释放”,后者保证“不会超并发”。

11.2 ScopedValue 与请求上下文

JEP 506(ScopedValue,JDK 25 正式)替代 ThreadLocal 传递请求上下文,避免了虚拟线程下 ThreadLocal 的继承与清理问题。对限流器而言,这意味着“按租户/按模型维度限流”的上下文传递更安全,不会因为线程复用而串号。这是一个容易被低估的工程收益。

11.3 自适应限流的研究方向

固定阈值限流在流量形态漂移时会失准。学术界与工业界都在探索基于延迟反馈的自适应算法(如 Netflix concurrency-limits 的 Gradient2、AIMD 类算法)。这类算法的共同假设是“延迟随并发上升而上升”,在模型服务中该假设成立但存在滞后(首 token 延迟与总延迟分离)。笔者判断,未来两年内会出现针对 LLM 流式响应的专用自适应限流器,其反馈信号不是总延迟,而是“首 token 时间 + 输出速率”的联合分布。

12 / CONCLUSION结论与可执行路径

回到标题的问题:虚拟线程不会突破 rate limit 和连接池上限,因为它根本不在这两个约束的作用域内。它改变的是执行成本,不是容量。要让系统“既不无限堆积、又不把并发压得过低”,可执行路径如下:

  1. 盘点四类边界:上游 RPM/TPM、连接池 maxTotal/perRoute、推理后端 N_safe、JVM 堆与 GC。每一项写出当前值与来源。
  2. 按公式推导 permits:λ = min(RPM 折算, TPM 折算),L = λ×S_avg,permits = min(L, N_safe, N_conn)×safety_factor。
  3. 三层落地:token/rpm 限流器在最前(拒绝成本低),Semaphore 在资源持有处(带短超时),连接池参数与 permits 对齐(连接数 ≥ permits)。
  4. 重试加预算:重试数 ≤ 成功数的固定比例,429 退避带抖动,非幂等错误不重试。
  5. 压测找拐点:阶梯加压,以“吞吐不再上升、P99 与 429 同时上升”为拐点,拐点并发作为 permits 上界。
  6. 观测闭环:暴露 inflight.available、许可等待 P99、pool.pending、429 率、本地拒绝率,按周校准 safety_factor。

这套路径没有魔法,全部是可测量、可复算的工程量。它的价值在于把“并发该开多大”从一个拍脑袋的数字,变成一个由配额、延迟与资源容量共同决定的推导结果。虚拟线程让我们不必再为线程数发愁,但也正因为如此,我们更没有理由把容量问题留给线程池去“兜底”。

拓展阅读 / 教程与视频
  • Oracle 官方虚拟线程指南:https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html
  • JEP 444 虚拟线程:https://openjdk.org/jeps/444
  • JEP 491(synchronized 不再 pin 载体线程):https://openjdk.org/jeps/491
  • Apache HttpClient 5 连接管理:https://hc.apache.org/httpcomponents-client-5.4.x/
  • OpenAI Rate Limits 文档:https://platform.openai.com/docs/guides/rate-limits
  • vLLM 官方文档(连续批处理与显存):https://docs.vllm.ai/

REFERENCES主要参考文献

  1. OpenJDK. JEP 444: Virtual Threads. 2023. https://openjdk.org/jeps/444
  2. OpenJDK. JEP 491: Synchronize Virtual Threads without Pinning. 2024. https://openjdk.org/jeps/491
  3. OpenJDK. JEP 499: Structured Concurrency (Fifth Preview). 2025. https://openjdk.org/jeps/499
  4. Kwon W., Li Z., Zhuang S., et al. Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP 2023.
  5. Yu G.-I., Jeong J. S., Kim G.-W., et al. Orca: A Distributed Serving System for Transformer-Based Generative Models. OSDI 2022.
  6. Apache Software Foundation. Apache HttpClient 5 Connection Management. 2024. https://hc.apache.org/httpcomponents-client-5.4.x/
  7. OpenAI. Rate Limits Guide. 2025. https://platform.openai.com/docs/guides/rate-limits
  8. Anthropic. Rate Limits Documentation. 2025. https://docs.anthropic.com/en/api/rate-limits
  9. gRPC Authors. gRPC Retry Policy Design. 2024. https://grpc.io/docs/guides/retry/

说明:本文参考文献池共 62 篇(含 JEP、厂商文档、会议论文与工程博客),其中 2023 年及以后文献 34 篇,占比约 55%。上文列出 9 篇主要文献。文中算例为模拟数据,用于演示推导量纲,不代表任何厂商承诺值;涉及数据集的部分(如 token 用量分布)如需复现,预处理步骤为:剔除异常长度样本(>P99.9)、按模型版本分组、对 token 数取对数后统计分位数。

文章声明:本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。

内容仅供学习参考。如需引用,请以原始文献为准。  全文约 12600 字  |  参考文献 62 篇(主要 9 篇)。
🔒 复制本站文章内容需登录并达到 L3。当前:未登录

分享到

💬
微信
📷
朋友圈
🐧
QQ好友
🌐
QQ空间
👁
微博
📌
钉钉
🔗
复制链接
📑
复制图文

微信扫一扫分享

打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。

💬 评论 (0)

评论功能已关闭

⏸️ 本站暂未开放评论功能,不能进行评论,此为规划的后续开发预留
首页| 关于本网| 网站声明| 联系我们| 网站纠错| 服务| 网站地图
黔ICP备19010680号-1  |  邮箱:six528528@163.com
贵公网安备 52010302001819号
Copyright 2019-2026 http://www.databrush.com/ All rights reserved.
QQ
QQ扫一扫
Logo
DBN数据刷