0%

influxdb内存持续升高不主动释放问题

问题

influxdb部署后,内存会随着查询等操作持续升高且不会主动释放.

分析

  • go在释放内存返回到内核时,在Linux上使用的是MADV_DONTNEED,虽然效率比较低,但是会让RSSresident 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 方式。

参考链接