legegecoder
legegecoder
发布于 2021-12-05 / 777 阅读 / 0 评论 / 0 点赞

Tensorflow Java Api 堆外内存泄漏排查

起因

模型管理平台主要就是加载模型对外提供接口,包括给推荐给信息治理。一共100台实例,8C16G堆大小最大设置的是8G,因为Tensorflow Java Api加载模型的时候调用的是本地方法,一个C++写的库。每次因为模型每天需要更新,频繁加载卸载内存只升不降,隔个两三天就会重启一次。top命令看一下Java进程占满了pod内存

排查

网上也查找了一下,大多都是以下几种

  1. 预测完Tensor对象没有调用Close方法。查看了一下代码发现是有的。
  2. 卸载的使用没有调用Close方法,代码的确有问题,用的SaveModelBundle简单来说加载完后存储模型信息方便后续调用。代码每次只是close了session,没有调用model的close方法。
 savedModelLoader.getModel().session().close();

 savedModelLoader.getModel().close();

结果

修改了以后发现还是不行,pod的内存只升不降。前后高了半个月左右领导也有些失望了。其实测试了在本地一切都是正常的,一到生产就不行。怀疑过是不是容器部署的问题,换了几台用ECS部署,很失望还是如此。最后翻阅github issue 在Tf-serving的issue中找到一点思路,换系统的内存分配器,默认用的是mallco。更改系统的LD_PRELOAD变量把他换成 jemallco 。 让运维重新打包镜像重启。果不其然解决。

参考


评论