线上问题排查之golang使用json进行对象copy
作者:whoops本尊 时间:2023-10-06 05:03:23
前言:
记一次golang使用json进行对象copy的内存溢出问题排查
问题现象:新增的功能,灰度部署在k8s集群的服务,发现机器老是被打崩,因为是灰度,且控制了qps在100多,但是机器却崩溃。通过对灰度机器的监控。发现是内存太高导致机器挂掉。此次回顾一下排查历程。
增加GC次数,从而可以通过pprof去抓取内存使用情况:
将程序的GOGC由原先的2000改为200,从而增加GC次数,然后去抓取内存消耗情况
第一步操作完成,经验证机器可以正常运行,借助gops导出cpu运行图和内存消耗情况
①将编译好的linux版本的gops导入到目标机器上
②执行命令 gops 查看正在运行的程序的pid
③执行命令获取cpu运行状态 gops pprof-cpu 27
④执行命令获取内存消耗情况 gops pprof-heap 27
执行上述两个命令后,其会生成文件在tmp目录下 :
//⑤将生成的文档下载到本地后,分别执行
go tool pprof -http=:8080 cpu_profile*
go tool pprof -http=:8081 heap_profile*
//在本地生成可视化
内存的火焰图如下 :
cpu的火焰图如下:
通过对火焰图的分析,可以明显的看到json.Marshal 和 json.Unmarshal 有明显的占用问题。跟着火焰图去找寻调用此处的该方法,定位到
此处就不列出runtime.Context对象的具体情况了,你可以理解为里面多处指针,多处切片。反正就是结构体很大 【PS:改天针对大结构体出个压测结果】
发现问题后更换如下代码进行对象copy,注意此拷贝结构体不能有小写字母开头。另外建议尽量少进行对象copy,尽可能的细化到需要copy的地方
/**
* @Description:深拷贝数据 (慎用--结构体不能有小写字母开头)
*/
func DeepCopy(dst, src interface{}) error {
var buf bytes.Buffer
if err := gob.NewEncoder(&buf).Encode(src); err != nil {
return err
}
return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
}
来源:https://juejin.cn/post/7110217714559844366
标签:golang,排查,json,copy
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python调用Tkinter示例浅析
2022-04-30 02:53:32
![](https://img.aspxhome.com/file/2023/9/79599_0s.png)
pytorch visdom安装开启及使用方法
2023-11-27 06:39:41
![](https://img.aspxhome.com/file/2023/9/117979_0s.png)
.Net Core服务治理Consul搭建集群
2024-05-09 09:03:07
![](https://img.aspxhome.com/file/2023/4/129814_0s.jpg)
Pytorch数据读取与预处理该如何实现
2021-12-23 17:44:35
![](https://img.aspxhome.com/file/2023/0/100950_0s.png)
如何在Win10系统使用Python3连接Hive
2023-08-10 07:00:39
![](https://img.aspxhome.com/file/2023/6/80456_0s.png)
关于数据库中保留小数位的问题
2024-01-13 13:34:45
Python可视化库之HoloViews的使用教程
2023-11-05 17:09:03
![](https://img.aspxhome.com/file/2023/4/117544_0s.jpg)
MySQL如何查询当前正在运行的SQL语句
2009-02-13 13:40:00
Python中让MySQL查询结果返回字典类型的方法
2024-01-25 04:37:33
JavaScript[对象.属性]集锦
2020-07-08 18:05:45
从IIS到SQL Server数据库安全
2008-12-24 15:58:00
Python中使用__new__实现单例模式并解析
2021-10-29 23:11:22
几种设置表单元素中文本输入框不可编辑的方法总结
2024-04-18 09:34:14
python读取Excel表格文件的方法
2023-07-24 01:17:14
![](https://img.aspxhome.com/file/2023/2/75332_0s.jpg)
Python多线程实现模拟火车站售票
2021-09-20 03:23:49
![](https://img.aspxhome.com/file/2023/6/99196_0s.jpg)
python利用scatter绘画散点图
2021-02-02 01:45:37
![](https://img.aspxhome.com/file/2023/6/94166_0s.png)
浏览器右下角弹出提示窗口
2008-10-30 12:37:00
Python符号计算之实现函数极限的方法
2021-09-05 02:02:21
Python 开发工具PyCharm安装教程图文详解(新手必看)
2023-04-25 05:01:08
![](https://img.aspxhome.com/file/2023/0/100810_0s.jpg)
JavaScript Length 字符长度函数
2008-12-12 12:29:00