问题
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方式。