问题
influxdb
部署后,内存会随着查询等操作持续升高且不会主动释放.
分析
go
在释放内存返回到内核时,在Linux
上使用的是MADV_DONTNEED
,虽然效率比较低,但是会让RSS
(resident set size
常驻内存集)数量下降得很快。不过在
go 1.12
里专门针对这个做了优化,在释放内存时,使用了更加高效的MADV_FREE
而不是之前的MADV_DONTNEED
,这样带来的好处是,一次GC
后的内存分配延迟得以改善,也会更加积极地将释放的内存归还给操作系统,以应对大块内存分配无法重用已存在的堆空间的问题。不过也会带来一个副作用
:RSS
不会立刻下降,而是要等到系统有内存压力了,才会延迟下降。InfluxDB
使用MADV_FREE
,只有当系统内存使用有压力的时候才会进行真正的内存回收,这个时候RSS
才会下降,可以通过GODEBUG=madvdontneed=1 ./influxdb
的方式启动,强制使用MADV_DONTNEED
方式.
MADV_FREE
需要Linux 4.5
以及以上内核,否则会继续使用原先的MADV_DONTNEED
方式。