Skip to content

fix(connection): 修复 SendBuffMsg 导致的 QPS 下降与延迟增加问题#408

Open
redfox1999 wants to merge 5 commits into
aceld:masterfrom
redfox1999:fix/write-coroutine-issues
Open

fix(connection): 修复 SendBuffMsg 导致的 QPS 下降与延迟增加问题#408
redfox1999 wants to merge 5 commits into
aceld:masterfrom
redfox1999:fix/write-coroutine-issues

Conversation

@redfox1999
Copy link
Copy Markdown

📝 概述

本 PR 大幅优化了 connection.goSendBuffMsg 的性能。通过将原有的“固定间隔 Flush”策略改为“即时批量消费并 Flush”,同时移除了 SendToQueue 中在高负载下极易误判的 5ms 硬编码超时限制,最终在 10,000 并发连接测试中实现了 QPS 提升近 5 倍(从 1.2W 提升至 6.3W),同时 P99 延迟降低了约 73%

🛠️ 修改内容

  1. connection.go (StartWriter)
    • 移除了默认的 10ms 定时器 Flush 机制(该机制引入了不必要的无谓延迟)。
    • 改为“激进消费并批量刷新”策略:当 msgBuffChan 有数据时,一次性读出通道内当前所有的积压数据进行发送,并立即执行 Flush
  2. connection.go (SendToQueue)
    • 移除了硬编码的 5ms 写入超时限制(在 CPU 负载较高时,该限制极易导致正常请求被误判为超时失败)。
    • 修改为非阻塞的直接写入操作,若通道(Channel)缓冲区确实已满,则立即返回错误。
  3. examples/
    • 增加了 c10k_test 测试代码,用于专门模拟和压测框架在 10,000 个并发连接下的极端性能表现。

📊 性能压测对比

测试场景

  • 并发连接数: 10,000
  • 单连接请求数: 1,000 次(总计 10,000,000 次请求)

核心指标对比

监控指标 修改前 (Before) 修改后 (After) 优化幅度 (Improvement)
总耗时 776.77 秒 156.74 秒 节省 -79.8% 的时间
有效 QPS 12,869.30 63,799.91 提升 +395.7% (约 5 倍)
失败请求数 3,541 次 0 次 实现 0 错误率 🚀
平均延迟 740.28 ms 151.09 ms 降低 -79.6%
P50 延迟 736.52 ms 144.10 ms 降低 -80.4%
P99 延迟 954.50 ms 253.06 ms 降低 -73.5%
最大延迟 1430.98 ms 582.13 ms 降低 -59.3%
📈 点击查看更详细的延迟分布对比

修改前延迟分布 (Before)

响应时间分布 (ms):

0- 50ms: 605 ( 0.01%)
50- 100ms: 982 ( 0.01%)
100- 150ms: 1431 ( 0.01%)
150- 200ms: 1356 ( 0.01%)
200- 250ms: 3091 ( 0.03%)
250- 300ms: 4296 ( 0.04%)
300- 350ms: 5244 ( 0.05%)
350- 400ms: 2861 ( 0.03%)
400- 450ms: 3543 ( 0.04%)
450- 500ms: 6345 ( 0.06%)
500- 550ms: 15859 ( 0.16%)
550- 600ms: 108598 ( 1.09%) █
600- 650ms: 620090 ( 6.20%) ████████
650- 700ms: 2134787 (21.36%) ████████████████████████████
700- 750ms: 3015279 (30.16%) ████████████████████████████████████████
750- 800ms: 2326172 (23.27%) ██████████████████████████████
800- 850ms: 1159192 (11.60%) ███████████████
850- 900ms: 356055 ( 3.56%) ████
900- 950ms: 124517 ( 1.25%) █
950-1000ms: 106156 ( 1.06%) █

修改后延迟分布 (Before)

响应时间分布 (ms):

0- 50ms: 1577 ( 0.02%)
50- 100ms: 6474 ( 0.06%)
100- 150ms: 6376903 (63.77%) ████████████████████████████████████████
150- 200ms: 2998511 (29.99%) ██████████████████
200- 250ms: 504442 ( 5.04%) ███
250- 300ms: 95931 ( 0.96%)
300- 350ms: 9336 ( 0.09%)
350- 400ms: 3470 ( 0.03%)
400- 450ms: 2357 ( 0.02%)
450- 500ms: 569 ( 0.01%)
500- 550ms: 310 ( 0.00%)
550- 600ms: 120 ( 0.00%)
600- 650ms: 0 ( 0.00%)
650- 700ms: 0 ( 0.00%)
700- 750ms: 0 ( 0.00%)
750- 800ms: 0 ( 0.00%)
800- 850ms: 0 ( 0.00%)
850- 900ms: 0 ( 0.00%)
900- 950ms: 0 ( 0.00%)
950-1000ms: 0 ( 0.00%)

@redfox1999
Copy link
Copy Markdown
Author

@aceld 有空时看下这个PR。我第一次提PR,也不知道操作的对不

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant