背景

公司有一个使用golang开发的采集模块,负责调用多个外部系统采集数据;最近做了一次架构上的调整,将采集模块分成api、job两个子模块,并部署到容器中,拆分前部署在虚机上。

现象

部分采集任务在容器中的执行时间比虚机中执行时间要长,8倍左右,本地测试无异常

排查思路

调用外部接口耗时过长?

只有部分任务执行时间长,怀疑容器调用那部分系统接口比较慢,于是在容器中curl外部接口接口,发现并不慢,排除这个可能。

程序问题?

将现有部署在虚机中的正常运行的应用,部署到容器中发现部分任务也会慢; 将部署在容器中的应用部署到虚机后恢复了正常;怀疑是容器本身或容器网络的问题,一时想不到是什么原因,于是开始了漫长的定位

pprof

pprof是golang提供的性能分析工具之一,采集模块已经引入pprof,首先使用它进行排查;

(1). 在容器中安装pprof/flamegraph1

(2). 在容器中执行如下命令,开启pprof的http服务

(3).输入上述http地址

  • 查看cpu profiler

没有什么太大异常,只有少许执行逻辑消耗一秒多

  • 查看了top/flame graph都没有查看到什么异常

pprof中可以查看以下几类信息

  • cpu(CPU Profiling): $HOST/debug/pprof/profile,默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件
  • block(Block Profiling):$HOST/debug/pprof/block,查看导致阻塞同步的堆栈跟踪
  • goroutine:$HOST/debug/pprof/goroutine,查看当前所有运行的 goroutines 堆栈跟踪
  • heap(Memory Profiling): $HOST/debug/pprof/heap,查看活动对象的内存分配情况
  • mutex(Mutex Profiling):$HOST/debug/pprof/mutex,查看导致互斥锁的竞争持有者的堆栈跟踪
  • threadcreate:$HOST/debug/pprof/threadcreate,查看创建新OS线程的堆栈跟踪

由于跟网络有关系,所以想查看下io耗时,pprof无法实现我的需求,想到可以使用trace观察

期间又使用go-torch采集火焰图数据并查看,与pprof类似,感兴趣的同学可自行尝试

trace

trace也是go tool性能问题分析工具之一

(1) 打开trace



主要有以下几块:Goroutine、网络阻塞、同步锁、同步阻塞等

(2) 观察网络IO

一下子看到了60多秒,心里一阵窃喜,但从第一个节点开始已经是50多秒了,仍然不知道是什么原因造成的。又看了gorouting部分

看到network wait那一列耗时占比非常大,心里又是一阵窃喜,基本确定是网络的问题了,点击某一个gorouting进入grouting页面,再根据慢的任务名称找到相应gorouting,点击进入到trace页面

由于network占用大多数时间,连续点了靠后的几个绿条,发现最后一条语句一样,到代码中查看,发现是调用redis的代码,于是在容器中ping redis服务器,又在虚机中ping,发现容器ping的响应时间是虚机的26倍左右;想到公司的服务器分多地部署,于是又查虚机、redis、容器的部署地域,发现虚机和redis在同一地域,而容器和redis服务器不在同一地域,这时才恍然大悟,后面的解决办法就简单了,不在此赘述了;

总结

分析问题要从大到小,逐渐缩小范围,不能一上来就进入细节,这样会耗时较长。开始我怀疑是虚机网络问题,排查了外部系统接口,但遗漏了redis,造成后面花了几个小时仔细排查。其实也是情有可原吧,这个采集模块代码细节我并不熟悉,我的语言技术栈主要是Java,对golang语言不太熟悉,只因负责这个模块开发的同学束手无策,我是这个项目的负责人,只能赶鸭子上架了。一遇到问题,我就有一种莫名的小激动,因为遇到了我未知的领域,又有机会对技术有更深入的了解了。喜欢我文章的同学欢迎关注公众号哦,不定期分享干货!

参考

Golang应用性能问题排查分析的更多相关文章

  1. 排查golang的性能问题 go pprof 实践

    小结: 1.内存消耗分析 list peek  定位到函数   https://mp.weixin.qq.com/s/_LovnIqJYAuDpTm2QmUgrA 使用pprof和go-torch排查 ...

  2. golang 性能调优分析工具 pprof (上)

    一.golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占 ...

  3. golang 性能调优分析工具 pprof(下)

    golang 性能调优分析工具 pprof(上)篇, 这是下篇. 四.net/http/pprof 4.1 代码例子 1 go version go1.13.9 把上面的程序例子稍微改动下,命名为 d ...

  4. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  5. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  6. 【转】Android应用开发性能优化完全分析

    http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...

  7. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  8. SQL Server 2008性能故障排查(四)——TempDB

    原文:SQL Server 2008性能故障排查(四)--TempDB 接着上一章:I/O TempDB: TempDB是一个全局数据库,存储内部和用户对象还有零食表.对象.在SQLServer操作过 ...

  9. SQL Server 2008性能故障排查(一)——概论

    原文:SQL Server 2008性能故障排查(一)--概论 备注:本人花了大量下班时间翻译,绝无抄袭,允许转载,但请注明出处.由于篇幅长,无法一篇博文全部说完,同时也没那么快全部翻译完,所以按章节 ...

随机推荐

  1. Linux下修改禅道端自定义端口号

    第一种方式 一.        首先,如果我们的服务器的80端口没有开放的话,那么我们就是只能修改Apache应用服务的端口了,其实非常简单,安装完成禅道后,在任意目录下输入命令: /opt/zbox ...

  2. 开源一套原创文本处理工具:Java+Bat脚本实现自动批量处理对账单工具

    原创/朱季谦 这款工具是笔者在2018年初开发完成的,时隔两载,偶然想起这款小工具,于是,决定将其开源,若有人需要做类似Java批处理实现整理文档的工具,可参考该工具逻辑思路来实现. 该工具是运行在w ...

  3. Hive数据倾斜优化

    在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...

  4. Spark Connector Reader 原理与实践

    本文主要讲述如何利用 Spark Connector 进行 Nebula Graph 数据的读取. Spark Connector 简介 Spark Connector 是一个 Spark 的数据连接 ...

  5. Web常用编码以及攻击绕过笔记

    一.URL编码形式:"%"加上ASCII码(先将字符转换为两位ASCII码,再转为16进制),其中加号"+"在URL编码中和"%20"表示一 ...

  6. 全栈工程师-史上最强VSCODE插件-提高开发效率

    当你点进来的时候 ,你可能是被标题吸引进来的,也有可能是 偶然间,看到的,首先恭喜你,已经准备好向全栈开发工程师靠近 ,那我们不说废话,直接开始,咱们先从安装步骤开始讲起 ,因为有些人连插件在哪都不知 ...

  7. 4. 上新了Spring,全新一代类型转换机制

    目录 ✍前言 版本约定 ✍正文 PropertyEditor设计缺陷 新一代类型转换 Converter 代码示例 不足 ConverterFactory 代码示例 不足 GenericConvert ...

  8. 【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 

    问题描述 Service Bus如何确保消息发送成功,发送端是否有Ack机制(是否有回调API告诉发送端,服务端已经收到消息)?根据对.NET发送Service Bus消息代码的分析,发送方法queu ...

  9. 精尽Spring MVC源码分析 - RequestToViewNameTranslator 组件

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  10. 服务器安装PVE6.1.2

    1     去官网下载PVE的镜像文件 https://www.proxmox.com/en/downloads 2     制作成U盘启动 准备一个U盘用来制作启动盘(记得将U盘里原来的资料备份然后 ...