Influxdb1.5版本 占CPU高 和 内存高问题

1、关闭上传报告给Influxdb 

     reporting-disabled = false

2、配置相关的

#wal日志落盘周期,官方建议0-100ms
  #尝试了100ms,50ms,20ms之后,目前折中采用50ms
  wal-fsync-delay = "50ms"
  #使用tsi1索引
  index-version = "tsi1"
  #分片允许最大内存,当超过最大内存会拒绝写入
  #内存越大,多个新老分片会占用更多的堆空间
  cache-max-memory-size = "2g"
  #当cache超过128m时,会进行快照落盘
  cache-snapshot-memory-size = "128m"
  #cache冷冻写入时间
  cache-snapshot-write-cold-duration = "30m"
  #进行全量压缩时间
  #由于retention policy为72小时
  #超过72小时,可以认为不进行全量压缩
  compact-full-write-cold-duration = "80h"
  #并行压缩处理器
  max-concurrent-compactions = 8
  #说明: 压缩TSM数据,一次落盘的吞吐量
  #默认48m
  #修改为64m
  #[优化点]:增大写入量,减轻io压力
  compact-throughput = "64m"
  #压缩每秒最大落盘数据量
  compact-throughput-burst = "16m"

  #wal日志超过128m时会被压缩为索引文件,并删除
  max-index-log-file-size = "128m"
3、查询超时时间要设置 默认一直等待 按实际需求设置 针对CPU高的

query-timeout = "60s"

4、Series 是占内存的大户,

influxdb中,series是一个很重要的概念,它是retentionPolicy、measurement、tag set雷同的汇合,蕴含了监控对象的元数据信息,series的数量=RP*measurement*tag set。

一般来讲,监控对象稳固后,series根本是固定的;influxdb将series放在内存作为索引,放慢了数据查问,这使得series的数量不能太大,否则influxdb内存会被撑爆,默认单个database内series限度为<100W个

第一,通过合理地规划,来减少不必要的tag。如果某个tag的值分布非常的多,可以考虑下它是否有必要作为tag,是不是作为field更合适。

第二,通过设置保留策略,保留更少的数据。influxdb是时序数据库,主要被用来存储监控数据,可以根据具体场景来保留更短的数据,这样的话会有一些旧数据由于过期而被清理掉,从而减少series的数量

查询命令语句
show series from measurements

influxdb本身提供了一些针对调试的支持,通过下面的接口返回的数据,可以分析出所有数据库的series数量

http://localhost:8086/debug/vars

在返回的数据中,每个数据库都会出现下面的数据,numSeries就是series的数量

查阅了相关资料之后,整理了influxdb使用tsi索引时原理图:

Influxdb1.5版本 占CPU高 和 内存高问题_第1张图片

 

说明:

写入influxdb时,会同时写wal文件及cache内存, wal用于宕机恢复cachecache在达到配置中的阈值时,会进行snapshot快照,进行落盘influxdb的series及index索引会在内存中全量保存,用于快速检索wal文件大小在达到配置中阈值时,会进行压缩转换到index索引influxdb会对磁盘数据文件{{index+data}}按照分片shard维度进行四次压缩(level1,2,3及full),以节约磁盘空间

你可能感兴趣的:(Influxdb,Influxdb)