Prhub

#22213 Fix streaming session busy check double-counting; add compat CI tests

sgl-project/sglang · 作者 hnyls2002 · 合并时间 2026-04-12 16:48

分析状态 已生成
文件变更 2提交数 11 · 评论 22
代码增减 +111 / -31
bugfix run-ci test observability scheduling

执行摘要

修复流式会话繁忙内存检查重复计数问题,避免虚假泄漏断言。

根据PR body描述,当restore_to_req从槽位借出KV到活动请求时,槽位的req_pool_idx有意不清除(以支持分块预填充重试的幂等性)。这导致session_held_tokens()_get_total_uncached_sizes()同时计数相同的KV页面,触发了虚假的内存泄漏断言。

建议精读该PR,重点关注SessionSlotis_active字段的设计决策,以及如何平衡内存检查准确性与重试幂等性。同时,留意提交历史中的迭代过程,理解内存管理复杂性和后续问题追踪。

讨论亮点

Review评论为空,但从提交历史中可见关键讨论点:提交消息显示,初始修复后发现了重叠调度问题(commit 94509ae),导致在繁忙内存检查中仍需跳过KV转移的请求以避免双重计数;后续提交(如88541edd)移除了严格检查以处理预存在的不匹配问题;最终提交(83acdb9)跳过了retract变体,因为识别出真实的令牌泄漏问题(约14个令牌),留待后续工作(如#21875)解决。结论是修复了重复计数核心问题,但其他相关问题被标记为单独追踪。

实现拆解

实现方案分两部分:在内存管理模块的python/sglang/srt/mem_cache/session_aware_cache.py中,为SessionSlot类添加is_active布尔字段,并在save_from_reqrestore_to_req方法中设置和清除该字段,同时修改session_held_tokens()session_held_swa_tokens()session_held_req_count()方法,跳过活动槽位的计数。在测试模块的test/registered/sessions/test_streaming_session.py中,启用环境变量SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY=2以激活严格内存检查,并添加TestStreamingSessionMixedChunk测试类验证混合块场景下的兼容性。

文件 模块 状态 重要度
python/sglang/srt/mem_cache/session_aware_cache.py mem_cache modified 8.0
test/registered/sessions/test_streaming_session.py test modified 4.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

SessionSlot.save_from_req SessionSlot.restore_to_req session_held_tokens session_held_swa_tokens session_held_req_count

评论区精华

重复计数问题修复 正确性

PR body 描述了问题根源:在 restore_to_req 时 req_pool_idx 未清除,导致 session_held_tokens 和 _get_total_uncached_sizes 双重计数。解决方案是添加 is_active 字段来跟踪借出状态。

结论:通过添加 is_active 字段并在相关方法中跳过活动槽位,成功修复双重计数问题。 · 已解决

测试覆盖与迭代调整 测试

提交历史显示多次测试迭代:初始启用严格检查,后发现重叠调度问题需跳过 KV 转移请求,最终移除 retract 变体因识别真实泄漏。这反映了内存检查逻辑的复杂性。

结论:最终测试启用严格检查(level=2)并添加混合块变体,但跳过了 retract 相关测试以隔离已知问题。 · 已解决

风险与影响

技术风险包括:1. 核心内存管理逻辑变更(session_aware_cache.py)可能引入回归,影响流式会话的KV缓存跟踪准确性。2. 测试依赖环境变量SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY,若未正确设置可能导致测试覆盖不全。3. 提交历史显示有迭代调整(如跳过retract变体),表明底层内存检查逻辑复杂,可能存在未覆盖的边缘情况。

对用户:修复了虚假内存泄漏断言,提升流式会话功能的稳定性和可靠性。对系统:改进了繁忙内存检查的准确性,避免错误触发断言导致服务中断。对团队:增强了测试覆盖,提供混合块场景的兼容性验证,有助于后续开发和维护。

核心路径变更 测试依赖环境变量 边缘情况覆盖不足

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

执行摘要

  • 一句话:修复流式会话繁忙内存检查重复计数问题,避免虚假泄漏断言。
  • 推荐动作:建议精读该PR,重点关注SessionSlotis_active字段的设计决策,以及如何平衡内存检查准确性与重试幂等性。同时,留意提交历史中的迭代过程,理解内存管理复杂性和后续问题追踪。

功能与动机

根据PR body描述,当restore_to_req从槽位借出KV到活动请求时,槽位的req_pool_idx有意不清除(以支持分块预填充重试的幂等性)。这导致session_held_tokens()_get_total_uncached_sizes()同时计数相同的KV页面,触发了虚假的内存泄漏断言。

实现拆解

实现方案分两部分:在内存管理模块的python/sglang/srt/mem_cache/session_aware_cache.py中,为SessionSlot类添加is_active布尔字段,并在save_from_reqrestore_to_req方法中设置和清除该字段,同时修改session_held_tokens()session_held_swa_tokens()session_held_req_count()方法,跳过活动槽位的计数。在测试模块的test/registered/sessions/test_streaming_session.py中,启用环境变量SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY=2以激活严格内存检查,并添加TestStreamingSessionMixedChunk测试类验证混合块场景下的兼容性。

关键文件:

  • python/sglang/srt/mem_cache/session_aware_cache.py(模块 mem_cache): 核心内存管理文件,添加is_active字段并修改KV计数逻辑,直接解决重复计数问题。
  • test/registered/sessions/test_streaming_session.py(模块 test): 测试文件,启用严格内存检查并添加混合块测试变体,验证修复效果和兼容性。

关键符号:SessionSlot.save_from_req, SessionSlot.restore_to_req, session_held_tokens, session_held_swa_tokens, session_held_req_count

评论区精华

Review评论为空,但从提交历史中可见关键讨论点:提交消息显示,初始修复后发现了重叠调度问题(commit 94509ae),导致在繁忙内存检查中仍需跳过KV转移的请求以避免双重计数;后续提交(如88541edd)移除了严格检查以处理预存在的不匹配问题;最终提交(83acdb9)跳过了retract变体,因为识别出真实的令牌泄漏问题(约14个令牌),留待后续工作(如#21875)解决。结论是修复了重复计数核心问题,但其他相关问题被标记为单独追踪。

  • 重复计数问题修复 (correctness): 通过添加is_active字段并在相关方法中跳过活动槽位,成功修复双重计数问题。
  • 测试覆盖与迭代调整 (testing): 最终测试启用严格检查(level=2)并添加混合块变体,但跳过了retract相关测试以隔离已知问题。

风险与影响

  • 风险:技术风险包括:1. 核心内存管理逻辑变更(session_aware_cache.py)可能引入回归,影响流式会话的KV缓存跟踪准确性。2. 测试依赖环境变量SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY,若未正确设置可能导致测试覆盖不全。3. 提交历史显示有迭代调整(如跳过retract变体),表明底层内存检查逻辑复杂,可能存在未覆盖的边缘情况。
  • 影响:对用户:修复了虚假内存泄漏断言,提升流式会话功能的稳定性和可靠性。对系统:改进了繁忙内存检查的准确性,避免错误触发断言导致服务中断。对团队:增强了测试覆盖,提供混合块场景的兼容性验证,有助于后续开发和维护。
  • 风险标记:核心路径变更, 测试依赖环境变量, 边缘情况覆盖不足

关联脉络

  • PR #21499 Add SWA support for runtime busy memory check: 都涉及运行时繁忙内存检查逻辑,修改了相关内存管理模块(scheduler_runtime_checker_mixin.py),功能上有交叉。
  • PR #22562 [mem] Flatten memory checkers into composable per-pool invariant checks: 都涉及内存检查器重构,修改了相同或相关的内存管理文件(如scheduler_runtime_checker_mixin.py),共享observability和scheduling标签。

参与讨论