在核心交易系统性能优化上的实践

1、性能演进

  • befor 1000 持仓单,200qps
  • after >30000持仓单,<=1000qps (持仓单计算上限:报价消费延迟5个
  • 规则

##2、服务性能分析

前置认知:计算密集型系统 计算吞吐,计算迟滞,cpu寸土寸金

2.1 整体分析

go tool pprof http://localhost:6060/debug/pprof/profile?seconds=60

Top10

pprof.svg

sched.svg

cpuwait :https://github.com/TigerWitForex/TradeEndDocs/pull/334/files

重点指标:GC、锁、threadwait、make、syscall

2.2 发现问题

排除外因,服务器用户资源隔离

  • mallocGC 占用时间长 ,decimal
  • chanrecv/chansend 占用时间长
  • runtime.pthread_cond_wait/runtime.pthread_cond_signal cpu利用率高
  • trading-system/calc/server.profitWorker.func1 N=115506 ???

2.3 带着问题看代码

  • Mind

  • mallocGC 占用时间长 ==》频繁对象分配(逃逸,GC压力,进程挂起计算暂停(gctrace 查看具体)

  • chanrecv/chansend 占用时间长 ==》阻塞逻辑,无法充分利用计算资源

  • runtime.pthread_cond_wait/runtime.pthread_cond_signal cpu利用率高 ==》(chan,gp切) 浪费计算资源

  • profitWorker.func

3 改造

3.1 业务逻辑改造

csp改造

3.2 细节

gpool,全局变量,syncpool

4 总结

- 要对内存分配、垃圾收集、协程调度有基本的认识
- 通信共享内存
- 并发克星 锁 (不是不能用锁,锁性能不是问题,锁竞争才是
- 串行逻辑分解 充分利用计算资源
- g不是银弹,按需池化(隔离减少栈扩所容,数量可控
- 内存复用 gc杀手

70%业务,20%技术,10%极致(内联、逃逸、内存对齐(cpu-cache-friendly)

5、more

去锁: 缓存多副本 读写分离(GetSpread
库/工具: json-iterator,gogoprotobuf,go-deadlock
日志落盘❌ 
LMAX-Exchange  

6、ref

曹大 sycall https://studygolang.com/articles/20854
lmax-exchange https://www.jianshu.com/p/7401ee67b22a