我们可以看到influxdb这个进程中目前VIRT是15G,RES是6.2G,SHR是6.1G。那么我们需要弄清楚这三个指标分别代表了什么
RES: 指的是进程当前在RAM中使用的内存大小,也就是常驻内存的大小。RES包括了所有的程序指令、数据以及共享库等在内,但不包括被交换出去的内存。
RES=SHR+程序自身内存占用(堆栈相关内存占用),通过上图的TOP来看,常驻内存中大部分都是共享内存,那么到底共享了什么?
我们主要关注里面的Size、Rss字段,分别代表了申请的内存空间的大小以及真实占用内存的大小,发现那些占用大的内存快,基本上来自xxx.tsm文件,可能通过下面的方式看起来更直观一点:
因为这些tsm文件导致的常驻内存的大小就有6.1G,这还只是筛选出大于10M的那些数据文件,总的应该会更多。那么问题来了,influxdb为什么会将这些文件引入内存?
a. influxdb启动时会调用文件存储层打开对于文件等的引用
基于上面的分析,我们可以对TOP中的VIRT、RES、SHR 这三个的值进行分析验证:
这个值再加上influxdb自身的堆栈以及其他的共享库文件的占用,基本上为15G。
SHR:共享内存大小,在TOP中显示的值是6.1 G。上文我们就通过smaps拿到了映射进入内存的文件的大小是6.1G,基本上是一致的。
RES:常驻内存大小,在TOP中显示的值是6.2G。自身堆栈的占用可以通过influx工具进入查询。
RES=SHR+自身堆栈占用=6.1G+0.15G=6.15G,这个值四舍五入和6.2G是持平的。
influxdb内存占用大,主要是因为利用了mmap对数据文件进行内存映射。另外为了提升查询性能,在内存中构建了大量的索引帮助快速定位数据等。
网友评论