首页 > 数据库 >golang写入influxdb2,共3种方式,小心有坑!

golang写入influxdb2,共3种方式,小心有坑!

时间:2022-12-28 18:01:09浏览次数:65  
标签:方式 AddField influxdb2 占用 写入 golang CPU

==事件背景==

项目中需要接收设备上报的时序数据,写入到Influxdb中,在压力测试过程中发现服务器CPU占用的非常高,

使用pprof解析了CPU占用的详细信息之后,发现Influxdb的AddField方法占用的CPU较多,记录一下这个问题。

 

==程序版本==

Influxdb:2.0

golang:1.18

influxdb-client-go:1.4.0

 

==参考博客==

golang使用pprof笔记

 

==原因分析==

golang写入influxdb有3种方式,分别如下:

方式一:NewPoint(最终推荐方式)

这种方式是自己构造好tag及field的map,一次性创建出point,然后写入数据

p := influxdb2.NewPoint("stat",
    map[string]string{"unit": "temperature"},
    map[string]interface{}{"avg": 24.5, "max": 45.0},
    time.Now())
writeAPI.WritePoint(p)

 

方式二:NewPointWithMeasurement

这种方式是先构造出point之后,调用AddTag及AddField方法,动态增加tag及field。

p = influxdb2.NewPointWithMeasurement("stat").
    AddTag("unit", "temperature").
    AddField("avg", 23.2).
    AddField("max", 45.0).
    SetTime(time.Now())
writeAPI.WritePoint(p)

 

方式三:WriteRecord

以字符串的形式按照规则构造写入内容,一次性写入数据。

line := fmt.Sprintf("stat,unit=temperature avg=%f,max=%f", 23.5, 45.0)
writeAPI.WriteRecord(line)

 

问题发生时,我使用的是方式二,即动态添加field的方式,然后通过pprof工具抓取cpu占用情况之后,发现AddField占用了大量的CPU

下图finalshell的资源占用截图:

 

下图为pprof的cpu占用截图:

 

通过查看influxdb客户端源码发现,每次AddField方法中都会对已经添加过的Field循环一次,这样就造成了Field越多,循环就越多,从而占用了大量的CPU。

 

===优化方法=

放弃方式二,使用方式一写入数据。修改之后CPU降低了很多。

下图为修改后finalshell的资源占用截图:

 

下图为修改后pprof中cpu占用的截图:

 

--END--

标签:方式,AddField,influxdb2,占用,写入,golang,CPU
From: https://www.cnblogs.com/quchunhui/p/17010910.html

相关文章

  • centos 安装 influxdb2
       http://www.manongjc.com/detail/27-asqkkdxungikkls.html https://github.com/influxdata/influxdb/releases下载influxdb2-2.6.0.x86_64.rpm安装yumloc......
  • 信而泰X1多速率板卡写入SN号和ID——网络测试仪实操
    一、X1多速率板卡SN号和ID说明​速率的License文件需要根据板卡SN号和ID来制作。​3.1.6正式版本,DarYuL2-7高性能网络测试仪支持用户通过Renix查看板卡SN号号。但是有的板......
  • golang安装与vscode配置
     问题描述warning:GOPATHsettoGOROOT(D:\Golang\go\)hasnoeffect解决办法:go1.19.4.windows-amd64.msi安装在d:\Golang\go      ......
  • go-dongle 0.2.3 版本发布,一个轻量级、语义化的 golang 编码解码、加密解密库
    dongle是一个轻量级、语义化、对开发者友好的Golang编码解码和加密解密库Dongle已被awesome-go收录,如果您觉得不错,请给个star吧github.com/golang-module/dong......
  • Go-20 Golang 中go mod 和 golang包详解
    packagemainimport( "fmt" "github.com/shopspring/decimal")//Golang中的gomod以及Golang包详解funcmain(){ /* 1.初始化项目文件夹gomodinit文件......
  • GoLang初探
    简介     多核处理器越来越普及,那有没有一种简单的办法,能够让我们写的软件释放多核的威力?答案是:Yes。随着Golang,Erlang,Scale等为并发设计的程序语言的兴......
  • logback将日志写入到ELK
    springboot中使用logback将日志写入到ELK平台  原文:http://www.tingcream.com/blogArticle/detail/b9ab76ffaeb547388522c9b982e6f419ELK 是由elasticsearch、logst......
  • Golang中interface的使用建议
    https://medium.com/@mbinjamil/using-interfaces-in-go-the-right-way-99384bc69d39分享的是一个关于Golang中interface的正确使用方法。讲道理在medium上找一篇对我有......
  • Golang开发项目目录简介以及目录结构设置规范
    一、Golang项目简单介绍Golang简单的目录结构如下:其中,bin用来存放经过gobulid后的可执行文件,pkg存放编译后的gomodule,而src就存放我们项目的代码 二、三种常用目录结......
  • Golang 环境变量和项目结构
    1.Golang环境变量和项目结构常用exportGO_HOME=/opt/modules/goexportGOPATH=/home/user/go$GO_HOME/bin:$GOPATH/bin12341.1.为什么我使用gobuild命令没有没有......