在核心交易系统性能优化上的实践
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