首页 > 系统相关 >influxdb内存占用剖析

influxdb内存占用剖析

时间:2024-04-15 21:11:21浏览次数:22  
标签:cache storage influxdb 剖析 内存 memory size

目标

本文将讲述influxdb内存中都存了哪些数据?
什么情况下会导致内存占用暴增?
以及内存相关的配置。

我的influxdb配置

我的influxdb配置如下:
/etc/influxdb/config.toml

bolt-path = "/var/lib/influxdb/influxd.bolt"
engine-path = "/var/lib/influxdb/engine"
storage-cache-max-memory-size = 20737418240
storage-cache-snapshot-memory-size = 524288000
log-level = "info"
storage-max-index-log-file-size =  50485760
storage-max-concurrent-compactions = 2

几个关键配置说明:

  1. storage-cache-max-memory-size: db实例可以使用的最大内存。如果机器内存超大,可以设置为 0,无限制。
cache-max-memory-size = "1g"
The maximum size that a shard cache can reach before it starts rejecting writes.

Valid memory size suffixes are: k, m, or g (case-insensitive, 1024 = 1k). Values without a size suffix are in bytes.

Consider increasing this value if encountering cache maximum memory size exceeded errors.

Environment variable: INFLUXDB_DATA_CACHE_MAX_MEMORY_SIZE

  1. storage-cache-snapshot-memory-size:
The size at which the engine will snapshot the cache and write it to a TSM file, freeing up memory.

Valid memory size suffixes are: k, m, or g (case-insensitive, 1024 = 1k). Values without a size suffix are in bytes.

Environment variable: INFLUXDB_DATA_CACHE_SNAPSHOT_MEMORY_SIZE

往 DB 写数据时,数据先写入 WAL 文件,同时也会写入内存中。然后定期把内存中的数据写入 TSM 文件。
这里定义的就是内存中数据的最大 size。当超过这个 size,会对内存中的数据产生一个快照,然后把快照写入 TSM 文件。

同时,还有另外一个配置cache-snapshot-write-cold-duration,它定义了当一个分区超过一定时间没有新数据写入,就会把内存中的数据刷新到磁盘。

The time interval at which the engine will snapshot the cache and write it to a new TSM file if the shard hasn’t received writes or deletes.

三点:

  • influxdb中每个分区的数据是单独存储的。因为每个分区会产生一个 WAL 文件。同时每个分区会单独占用一份内存空间。因此,当数据时间乱序写入时(写入的数据有 23年的、24 年。。。),就会占用更多的内存。
  • 内存中的数据格式,具体来讲每个time series 对应一个数据结构,他们是有序的。 因此,基数越大占用内存也越多。
  • 当机器内存不足时,可以降低storage-cache-snapshot-memory-size配置的大小,来降低总的内存占用。同理,当内存充足时,可以调大该配置,降低刷新磁盘的频率,降低 cpu 和磁盘开销。
  1. storage-max-concurrent-compactions
The maximum number of concurrent full and level compactions that can run at one time. The default value of 0 results in 50% of the CPU cores being used at runtime for compactions. If explicitly set, the number of cores used for compaction is limited to the specified value. This setting does not apply to cache snapshotting. For more information on GOMAXPROCS environment variable, see GOMAXPROCS environment variable on this page.

如果你的机器间歇性地 CPU 过高,可以降低这个参数的值。

通过influxdb监控数据,验证上述配置的效果

https://docs.influxdata.com/influxdb/v2/reference/internals/metrics/#influxdb-storage-statistics
通过 DB 暴漏的metrics指标,可以监控 DB 的内存运行状态。

我使用的是prometheus监控。

指标 1:

storage_cache_inuse_bytes: Gauge of current memory consumption of cache

image

该指标,显示的是每一块cache(一个分区对应一块 cache) 的内存大小。
内存中一共有 10 份 cache,说明有 10 个活跃的分区最近有数据写入。
每个分区占用内存最大400 多 M,这也吻合了我们前面的配置storage-cache-snapshot-memory-size = 524288000

下面看下storage_cache_inuse_bytes和的变化趋势:
image
我们看到,这个总的内存占用波动挺大。 内存占用高的时段,基本都是因为我在导入大量的历史数据(写活跃分区多了)。

这个和,应该是由配置storage-cache-max-memory-size = 20737418240控制的,不能大于 20G。

那么,总的内存占用会大于 20G 吗?如何避免呢?

  • 降低配置storage-cache-snapshot-memory-size = 524288000
  • 避免基数太大。 因为influxdb中会建立反向索引,索引的大小和基数大小密切相关。

指标 2
storage_cache_disk_bytes: Gauge of size of most recent snapshot

这脸指标,一个是 cache 大小,一个是快照大小。
它们的区别,参考https://docs.influxdata.com/influxdb/v2/reference/internals/storage-engine/#cache
image

指标 3
go_memstats_alloc_bytes: Number of bytes allocated and still in use.

image

从 go 语言角度,当前该程序占用了 6.9G 内存。明显高于前面cache的总和(cache 2G、快照 500M)。
那么,剩下的内存是谁占用的呢?

标签:cache,storage,influxdb,剖析,内存,memory,size
From: https://www.cnblogs.com/xushengbin/p/18136680

相关文章

  • influxdb field type冲突问题
    问题描述2024-04-14T14:59:51ZE![outputs.influxdb_v2]Failedtowritemetrictoiot(willbedropped:422UnprocessableEntity):unprocessableentity:failurewritingpointstodatabase:partialwrite:fieldtypeconflict:inputfield"longitude"......
  • C++_内存模型和函数以及类
    C++内存模型函数函数与编译器类成员变量class内部通过 static修饰变量时,表示该变量为静态成员变量,必须在类外定义 staticconst修饰变量时,表示该变量为静态成员常量,可以在类内初始化,或者在类外初始化 staticconstexpr修饰变量时,表示该......
  • C++对象封装后的内存布局
    在C语言中,数据和数据的处理操作(函数)是分开声明的,在语言层面并没有支持数据和函数的内在关联性,我们称之为过程式编程范式或者程序性编程范式。C++兼容了C语言,当然也支持这种编程范式。但C++更主要的特点在支持基于对象(object-based,OB)和面向对象(object-oriented,OO),OB和OO的基础是......
  • mongo内存管理之cache占用过高,影响正常业务
    云数据库DDS实例shard连接数异常激增影响业务的事件,问题分析如下保障现象:在当天22日21:50-22:21时间段内,连接数异常激增,同时伴随有大量慢日志,实例整体响应速度下降。3月23日19:35贵司报障该实例再次出现shard连接数激增的现象。排查处理:经过排查发现3月22日21:50-......
  • Go实践:用Sync.Map实现简易内存缓存系统
    介绍定义了一个Cache结构体,其中使用sync.Map作为底层数据结构来存储缓存项。Set方法用于设置缓存项,指定键、值以及过期时间。Get方法用于获取缓存项,如果缓存项存在且未过期,则返回值和true,否则返回nil和false。方法的接受者为指针类型,是为了对Cache对象进行操作,并在方法内部访问和......
  • InfluxDB时序数据库图形用户界面可视化工具(influxdb-gui)
    说明之前开发了一款TDengine的GUI程序,出于兴趣,简单搞个InfluxDB的复制版,类似Navicat,目前基础操作功能已满足,后续看情况,可以继续扩展功能。介绍InfluxDB-GUI是一款功能全面、操作简便的influxdb时序数据库图形界面工具,V1.0.0目前支持influxdb版本列表如下:influxdb1.8.10版本......
  • [转帖]内存分析之GCViewer详细解读
    文章目录GCViewer详细解读一,Chart详解二,Eventdetail三,Summary四,Pause五,相关概念5.1GC5.1.1FullGC5.1.2MinorGC5.2垃圾收集器5.2.1串行收集器(Serial)5.2.2**ParNew收集器**5.2.3**ParallelScavenge**收集器**5.2.4CMS收集器(ConcurrentMarkSweep)****5.2.5G1......
  • C++ 解引用与函数基础:内存地址、调用方法及声明
    C++解引用获取内存地址和值在上一页的示例中,我们使用了指针变量来获取变量的内存地址(与引用运算符&一起使用)。但是,你也可以使用指针来获取变量的值,这可以通过使用*运算符(解引用运算符)来实现:stringfood="Pizza";//变量声明string*ptr=&food;//指针声明//引用......
  • CIG容器重量级 监控系统介绍: CAdvisor+InfluxDB+Granfana
       Docker重量级容器监控:CAdvisor+InfluxDB+Granfana查看docker宿主机的所有容器的cpu内存以及网络等数据:dockerstatus CAdivisor介绍-收集数据: InfluxDB--存储数据: Granfana可视化平台展示:  ......
  • SQL 执行大脚本 提示内存不足 解决办法
    SQL 执行大脚本 提示内存不足 解决办法 用微软自带的sqlcmd工具,可以导入执行。以SQL Server 2008R版本为例:第一步:Win+R 键入:cmd 命令,开启命令行工具;第二步:键入:cd C:\Program Files\Microsoft SQL Server\100\Tools\Binn (具体目录路径跟你安装的SQL位置有关)第三步:键入......