导致超时原因
了解基本情况后,知道可用性降低是由于超时导致,非其他错误。进行简要分析,能够想出一些可能的原因,
1.例如某些业务写法导致性能问题
2.异常流量
3.系统调用
4.网络问题
5.cpu throttle
6.中间件问题(如redis,mysql)
7.go调度
8.gc问题等。
至于是这8名嫌疑犯还是另有其人,需要结合实际现象进行排除与论证,所以需要针对性的收集一些线索。
现在的矛头指向go runtime与系统调用。根据以往的经验有以下几种主要手段辅助定位:
- 采集pprof,用cpu profiler查看cpu占用,memory profiler查看gc问题
- 开启GODEBUG=gctrace=1 ,可查看程序运行过程中的GC信息。如果觉得是gc问题,可查看服务可用性抖动时间段gctrace是否异常,进一步确认问题
- 添加fgprof,辅助排查off-cpu可能性,off-cpu例如I/O、锁、计时器、页交换等,具体详看鸟窝大佬文章:分析Go程序的Off-CPU性能(https://colobu.com/2020/11/12/analyze-On-CPU-in-go/)
- 采集go trace,查看go调度问题,例如gc、抢占调度等,真实反映当时调度情况
- linux strace查看go运行时调用了哪些系统调用导致超时