背景

最近准备上线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的数据文件。

此时这些mmap file 虚拟内存是2G,但是物理内存是0(因为我之前重启过,调低过内存防止进程挂掉影响问题排查)。

显然mmap的内存开销是不受JVM heap控制的,也就是堆外内存。如果mmap的文件数据被从磁盘load进物理内存(RES增加),Java NMT和google perftool是无法感知的,这是kernel的调度过程。

考虑到是在压测时候出现问题的,所以我只要读一下这些文件,观察下RES是否会增加,增加多少,为啥增加,就能推断问题是不是在这里。通过下面的命令简单读一下之前导入的数据。

可以观察到压测期间(sar -B),majorpagefault是明显上升的,因为数据被实际从磁盘被load进内存。

同时观察到mmapfile物理内存增加到20MB:

最终进程RES涨到7.1g左右,增加了大约600M:

如果加大压力(50线程),还会涨,每个mmap file物理内存会从20MB,涨到40MB

7.Root cause是cassandra识别系统是64还是32来确定要不要用mmap,ECS都是64,但是实际上小规格ECS内存并不多。

结论

问题诱因是mmap到内存开销没有考虑进去,具体调整方法有很多。可以针对小规格ECS降低heap配置或者关闭mmap特性(disk_access_mode=standard)排查Java堆外内存还是比较麻烦的,推荐先用NMT查查,用起来比较简单,配置JVM参数即可,可以看到内存申请情况。

java 堆外内存 查看_超干货!Cassandra Java堆外内存排查经历全记录相关推荐

  1. Cassandra Java堆外内存排查经历全记录

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

  2. java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则

    前言 以一个java老鸟的角度,如何去看 kotlin. Java源代码应该如何用Kotlin重构. 如何正确学习kotlin并且应用到实际开发中.本文将会探究. 本文分两大块,重难点和潜规则. 重难 ...

  3. java 可选参数_超干货详解:kotlin(4) java转kotlin潜规则

    往期推荐 如果面试时大家都说真话... 这400道面试题,决定了你去BAT还是TMD 前言 以一个java老鸟的角度,如何去看 kotlin. Java源代码应该如何用Kotlin重构. 如何正确学习 ...

  4. java如何监控cpu耗时_超级干货:3个性能监控和优化命令讲解

    原标题:超级干货:3个性能监控和优化命令讲解 小编为大家整理出了三个有关性能监控和优化命令详细讲解,别看只有三个,但不影响他噎啊,本篇文章很长,涉及top命令.free命令和 vmstat命令,真的是 ...

  5. java主要内存区域_可能是把Java内存区域讲的最清楚的一篇文章

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄 ...

  6. java字面量 方法区_(一)java的内存模型

    程序计数器(私有) 程序计数器:"是一个非常小的内存空间,用来保证程序依次执行",它可以看作是当前线程所执行的字节码的行号指示器 由于java虚拟机的多线程是通过线程轮流切换并分配 ...

  7. 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  8. java docx 内存溢出_第2章 Java内存区域与内存溢出异常

    本章主要介绍了Java的内存区域以及会触发对应区域内存溢出的触发条件及表现结果.同时还对java对象的内存布局进行了简单的讲解. 2.2 运行时数据区域: 比较直观的一张图来表示: Java虚拟机运行 ...

  9. java 头尾 队列_超详细的java集合讲解

    1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...

最新文章

  1. hung-yi lee_p10_分类/概率生成模型
  2. Create Geometry from WKT(转载)
  3. Mule的基本配置元素:Endpoint、Transformer、Filter、Flow
  4. 重磅!专硕学制改为三年,多所高校发文!
  5. 计蒜客NOIP2017提高组模拟赛(四)day1
  6. BZOJ3057 圣主的考验
  7. oracle中怎么算奇数,oracle - 如何在oracle中获取奇数列 - SO中文参考 - www.soinside.com...
  8. 解读中国杰出CFO之道
  9. (1)FPGA面试题Setup和Holdup时间
  10. GitGithub学习笔记
  11. 文档转成html在线预览,java poi Word文档转为HTML文件 实现在线预览功能
  12. java concurrent 线程通信_java并发之线程间通信
  13. linux I2C驱动实验
  14. 英语词根研究和单词记忆
  15. HTML5-简易Canvas绘图板
  16. 小学英语之拯救小学生 V1.0 名词单复数变化规则
  17. 只有在喝醉的时候,我才会喜欢自己
  18. 搜索引擎的百万免费流量
  19. 编译原理 —— 知识结构导图
  20. 常用电子面单接口API demo下载(菜鸟快递鸟)

热门文章

  1. 基于JAVA疗养院管理计算机毕业设计源码+数据库+lw文档+系统+部署
  2. 齐治堡垒机配置文件服务器,登录齐治堡垒机简易使用手册V
  3. python3 通过api获取oracle REST API for Oracle Eloqua Marketing Cloud Service 数据
  4. word实用技巧:拼音指南用法及注意事项
  5. win10下MySQL5.7基本操作指南
  6. 一诺万金智慧园区平台
  7. JMeter性能测试:JMeter多用户并发模拟及压测结果分析
  8. 基于深度学习的人脸识别技术原理解析与项目实战
  9. Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter
  10. python监控服务器cpu温度实例_监控HP服务器CPU温度的脚本