记一次Cassandra Java堆外内存排查经历
背景
最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测。压测时候比较容易触发OOM Killer,把cassandra进程干掉。问题是8G这个规格我配置的heap(Xmx)并不高(约6.5g)已经留出了足够的空间给系统。只有可能是Java堆外内存使用超出预期,导致RES增加,才可能触发OOM。
调查过程
0.初步怀疑是哪里有DirectBuffer泄漏,或者JNI库的问题。
1.按惯例通过google perftools追踪堆外内存开销,但是并未发现明显的异常。
2.然后用Java NMT 看了一下,也没有发现什么异常。
3.查到这里思路似乎断了,因为跟DirectBuffer似乎没啥关系。这时候我注意到进程虚拟内存非常高,已经超过ECS内存了。怀疑这里有些问题。
4.进一步通过/proc/pid/smaps 查看进程内存地址空间分布,发现有大量mmap的文件。这些文件是cassandra的数据文件。
此时这些mmap file 虚拟内存是2G,但是物理内存是0(因为我之前重启过,调低过内存防止进程挂掉影响问题排查)。
显然mmap的内存开销是不受JVM heap控制的,也就是堆外内存。如果mmap的文件数据被从磁盘load进物理内存(RES增加),Java NMT和google perftool是无法感知的,这是kernel的调度过程。
5.考虑到是在压测时候出现问题的,所以我只要读一下这些文件,观察下RES是否会增加,增加多少,为啥增加,就能推断问题是不是在这里。通过下面的命令简单读一下之前导入的数据。
cassandra-stress read duration=10m cl=ONE -rate threads=20 -mode native cql3 user=cassandra password=123 -schema keysp
ace=keyspace5 -node core-3
6.可以观察到压测期间(sar -B
),major page fault是明显上升的,因为数据被实际从磁盘被load进内存。
同时观察到mmap file物理内存增加到20MB:
最终进程RES涨到7.1g左右,增加了大约600M:
如果加大压力(50线程),还会涨,每个mmap file物理内存会从20MB,涨到40MB
7.Root cause是cassandra识别系统是64还是32来确定要不要用mmap,ECS都是64,但是实际上小规格ECS内存并不多。
结论
1.问题诱因是mmap到内存开销没有考虑进去,具体调整方法有很多。可以针对小规格ECS降低heap配置或者关闭mmap特性(disk_access_mode=standard
)
2.排查Java堆外内存还是比较麻烦的,推荐先用NMT查查,用起来比较简单,配置JVM参数即可,可以看到内存申请情况。
原文链接
本文为云栖社区原创内容,未经允许不得转载。
记一次Cassandra Java堆外内存排查经历相关推荐
- Cassandra Java堆外内存排查经历全记录
背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...
- java 堆外内存 查看_超干货!Cassandra Java堆外内存排查经历全记录
背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...
- java堆外内存6_Java堆外内存排查小结
简介 JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路.之前的文章排版太乱,现在整理重发一下,内容是一样的. 通过本文,你应该了解: pmap 命令 gdb 命令 per ...
- java 堆外内存 查看_JAVA堆外内存排查小结
简介JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路. 通过本文,你应该了解:pmap 命令 gdb 命令 perf 命令 内存 RSS.VSZ的区别 java NMT ...
- java 查看堆外内存占用_Java堆外内存排查小结
简介 JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路. 通过本文,你应该了解: pmap 命令 gdb 命令 perf 命令 内存 RSS.VSZ的区别 java NM ...
- Java堆外内存泄露分析
查看堆内存占用正常,jvm垃圾回收也没有异常.而top出来显示java占用内存是几个G,那么可能想到了是堆外内存泄漏. 需要安装google-perftools工具进行分析 1.先安装g++ 不然编译 ...
- java堆外内存泄漏分析排查
JAVA堆外内存分析 文章目录 JAVA堆外内存分析 1.前言 2.准备 3.具体分析 3.1堆外溢出风险判断 3.1.1确认java进程号 3.1.2查看此java进程的jvm参数 3.1.3查看j ...
- jvm堆外内存排查详解
文章目录 前言 一.堆外内存排查 1.背景 2.内存对比 3.堆外内存检查 4.排查堆外内存 5.glibc内存泄露 结尾 前言 内存泄漏想必大家并不陌生,对于jvm的内存泄漏,有很多排查手段和方便的 ...
- Java堆外内存的使用
堆外内存的回收见HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer 基本类型长度 在Java中有很多的基本类型,比如: byte,一个字节是8位bi ...
最新文章
- android测试 课程设计,超星尔雅Android开发课程设计章节测试答案
- python app教程-Python zipapp打包教程(超级详细)
- cmake (2)其他指令
- leetcode :数组和链表
- .net hbase client--终于浮出水面的轮子
- matlab 箱图不显示异常值_无功功率显示值与计算值不匹配?
- 06 sqlsybase
- ASP.net2.0页面运行时“无法显示XML页”的解决办法
- 幼儿园观察记录的目的和目标_幼儿园观察记录应该怎么写?
- ChIP-seq数据处理流程(附赠长达5小时的视频指导)
- pytorch tensor索引、切片、连接——Indexing, Slicing, Joining
- Java多线程系列--【JUC线程池 03】- 线程池原理(二)
- meltdown linux检测,检查你的Linux PC是否受Meltdown和Spectre安全缺陷影响
- 关于使用KEIL建立STM32项目(附带建立好的工程以及注意事项)
- 谷歌浏览器导出导入插件
- java共享文件夹SMB1服务报错jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/122.168.23.26
- Linux服务器操作系统快速删除大量/大文件
- python求几何平均_R语言的几何平均数,调和平均数,平方平均数
- 数据库基础:IndexedDB
- WinCE Eboot中的BLCOMMON
热门文章
- php入门和常用类的使用,php入门教程之常用数据类型和基本语法
- python的threading是什么意思_Python中的threading模块是什么
- 一组数字中算出最相近的组合_据说在金字塔里发现的这组数字,貌似是通往宇宙的密码...
- 用户表如何区分普通用户和管理员_Gate.io 比特百科:什么是ETH 2.0及普通用户如何参与ETH 2.0质押挖矿...
- java联合主键_hibernate联合主键映射(注解版)
- python turtle画房子详细解释_[宜配屋]听图阁
- 安装版mysql错误2_【gem安装】mysql2错误
- python 动态规划 回溯_回溯算法 - 全排列算法实现(pythondart)
- c++获取图像的长宽 opencv_【第一篇:C++与opencv】图片的读取和显示 | 学步园
- 欧框语言框架标准C2,CEFR欧洲语言共同参考框架