高并发压测下json.Unmarshal的性能瓶颈

0 阅读1分钟

mermaid-diagram.png


🧠 1. 基础环境信息

🖥️ 机器配置

CPU:8核
内存:24G
系统:Mac
Go版本:1.24.10
fd限制:65535
端口范围:10000~65535

📦 服务架构

Cache-Aside + SingleFlight 防击穿
redis存储结构:列表json

🚀 2. 压测目标

目标:1w 并发
模式:k6 VU 模式

📊 3. 初始压测结果(全链路)

http_req_duration:
avg = 1.92s
p95 = 4.07s
p99 = 4.78s

QPS:7556.118687/s

🧠 初步现象

  • QPS 未达预期
  • RT 偏高

❗初步结论

性能明显低于预期,需要进行瓶颈定位


🔍 4. 问题排查(断点分析法)


🥇 断点1:Go 直接 return(去业务逻辑)

代码

return &v1.GetCommentsReply{Comments: []*v1.Comment{}}, nil

结果

http_req_duration:
avg = 362.82ms
p95 = 948.57ms
p99 = 1.82s

QPS:35067.480146/s

🥈 断点2:去 Redis(返回默认JSON)

代码

json.Unmarshal → return

结果

http_req_duration:
avg = 1.31s
p95 = 4.31s
p99 = 5.12s

QPS:7881.484146/s

结论

没有网络io的情况下,结果很不理想


🚀 5. 优化方案


定位到问题后,尝试使用下面2个方案优化,保证公平性json.Unmarshal也重新压一遍
压测vu:1w (降vu为了数据更稳定,单机压测,vu太大,cpu爆炸会有干扰)

1w并发性能对比QPS
json.Unmarshal21840
sonic.Unmarshal27550
protobuf28814