背景
最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测。压测时候比较容易触发OOM Killer,把cassandra进程干掉。问题是8G这个规格我配置的heap(Xmx)并不高(约6.5g)已经留出了足够的空间给系统。只有可能是Java堆外内存使用超出预期,导致RES增加,才可能触发OOM。
调查过程
初步怀疑是哪里有DirectBuffer泄漏,或者JNI库的问题。按惯例通过googleperftools追踪堆外内存开销,但是并未发现明显的异常。然后用Java NMT看了一下,也没有发现什么异常。
查到这里思路似乎断了,因为跟DirectBuffer似乎没啥关系。这时候我注意到进程虚拟内存非常高,已经超过ECS内存了。怀疑这里有些问题。
进一步通过/proc/pid/smaps查看进程内存地址空间分布,发现有大量mmap的文件。这些文件是cassandra的数据文件。