导语
本文介绍了公司“云化服务”的大背景下,将一个Go服务迁移至公司的基于K8s+docker的容器云平台,使用火焰图进行性能排查和优化方面的实践。欢迎在留言区进行阅读探讨。
背景
在公司“云化服务”的大背景下,将一个Go服务迁移至公司的基于K8s+docker的容器云平台。 在迁移过程中发现服务在Docker容器内的CPU使用率异常的问题。 针对此问题,进行了一些排查和优化的实践。 本文将重现排查过程以及优化方案,希望能为读者提供一些参考。问题现象
在将服务由物理机迁移至容器云计算平台过程中,发现CPU使用率远超预期。 该服务是一个Go编写的消息推送服务,其业务特点是:短时间内会推送大量消息,因此该服务的负载曲线会是一个类似方波的图形。 在迁移前预估业务高峰期的CPU使用率为20%,但是实际的CPU使用率远超预期,到达了70%,是预估值的3倍,如下图所示:![ba35384fcd82f3676fb90f6a62ca3295.png](https://img-blog.csdnimg.cn/img_convert/ba35384fcd82f3676fb90f6a62ca3295.png)
排查过程
1. 采样 在确认容器节点和物理机节点的请求量负载基本一致后,开始对容器节点进行性能排查。 Linux平台有很多性能分析工具像perf、systemtap等。Go的工具集非常丰富,相比于其他Linux工具,可以更加简便深入地进行分析调试。这里直接使用go tool pprof对服务进行profiling采样分析。a) 首先在代码中开启pprof,对于具备http server的服务来说,仅需增加一行代码 import _ "net/http/pprof"
b) 访问 http://ip:port/debug/pprof/ 可以在浏览器中查看pprof采样得到的数据,使用命令行进行采样则更加方便 go tool pprof http://ip:port/debug/pprof/profile?seconds=30
![8c93ffcf20fa05fc2da455ec6bf7ba50.png](https://img-blog.csdnimg.cn/img_convert/8c93ffcf20fa05fc2da455ec6bf7ba50.png)
c) 在pprof中输入指令web,即可生成一个函数调用链的CPU耗时分析