【原创】大叔问题定位分享(14)Kylin频繁OOM问题
公司一个kylin集群,每到周二下午就会逐个节点OOM退出,非常有规律,kylin集群5个节点,每个节点分配的内存已经不断增加到70多G,但是问题依旧;
经排查发现,每周二下午kylin集群的请求量确实会多一些,有可能是kylin的bug,也可能是其他原因,当节点kylin进程内存占用上升时,打印线程堆栈发现,有很多线程都被卡住,synchronized,各种Manager,比如CubeManager、DictionaryManager、MetadataManager,以MetadataManager为例查看kylin代码发现,这些Manager的套路差不多,都有clearCache、getInstance(synchronized),然后getInstance中会调用Constructor,Constructor中会加载一堆东西,这个加载过程比较慢,所以getInstance会长时间synchronized:
org.apache.kylin.metadata.MetadataManager
public static void clearCache() {
CACHE.clear();
}
public static MetadataManager getInstance(KylinConfig config) {
MetadataManager r = CACHE.get(config);
if (r != null) {
return r;
}
synchronized (MetadataManager.class) {
r = CACHE.get(config);
if (r != null) {
return r;
}
try {
r = new MetadataManager(config);
CACHE.put(config, r);
if (CACHE.size() > 1) {
logger.warn("More than one singleton exist");
}
return r;
} catch (IOException e) {
throw new IllegalStateException("Failed to init MetadataManager from " + config, e);
}
}
}
private MetadataManager(KylinConfig config) throws IOException {
init(config);
}
private void init(KylinConfig config) throws IOException {
this.config = config;
this.srcTableMap = new CaseInsensitiveStringCache<>(config, "table");
this.srcTableExdMap = new CaseInsensitiveStringCache<>(config, "table_ext");
this.dataModelDescMap = new CaseInsensitiveStringCache<>(config, "data_model");
this.extFilterMap = new CaseInsensitiveStringCache<>(config, "external_filter");
reloadAllSourceTable();
reloadAllTableExt();
reloadAllDataModel();
reloadAllExternalFilter();
// touch lower level metadata before registering my listener
Broadcaster.getInstance(config).registerListener(new SrcTableSyncListener(), "table");
Broadcaster.getInstance(config).registerListener(new SrcTableExtSyncListener(), "table_ext");
Broadcaster.getInstance(config).registerListener(new DataModelSyncListener(), "data_model");
Broadcaster.getInstance(config).registerListener(new ExtFilterSyncListener(), "external_filter");
}
查看了kylin各个版本的代码,发现都是这个套路,看来kylin不认为这是一个问题,这确实会导致一些潜在的问题,比如高负载时,忽然要刷新,这时就会有大量的请求被synchronized,这个会导致OOM吗?
进一步检查线程堆栈发现,当时tomcat的线程池几乎被占满,这个也很容易理解,之前的请求被synchronized,还不断有新的请求进来,然后线程池就满了,忽然想到,一旦synchronized结束,所有的请求都开始同时处理,而且其中一些请求可能会占用比较多的内存,这样内存可能瞬间就扛不住了,这是一个雪崩效应,上面的场景其实和压测的场景差不多,即服务器满负荷运转,线程池所有的线程都在处理请求,如果tomcat配置的线程池数量太大了,服务器就撑不住了,OOM就是因为这个,如果不改这个配置,内存配置的再大也没用,还是会OOM,把tomcat线程池配置小一些即可;
另外还有一种方法,就是在Load Balancer上加控制,一旦响应很慢,就标记unhealthy,把请求分给其他节点,这样就不会在synchronized的节点上堆积大量请求,也可以避免问题;
【原创】大叔问题定位分享(14)Kylin频繁OOM问题的更多相关文章
- 【原创】大叔问题定位分享(13)HBase Region频繁下线
问题现象:hive执行sql报错 select count(*) from test_hive_table; 报错 Error: java.io.IOException: org.apache.had ...
- 【原创】大叔问题定位分享(1)HBase RegionServer频繁挂掉
最近hbase集群很多region server挂掉,查看其中一个RegionServer1日志发现,17:17:14挂的时候服务器压力很大,有大量的responseTooSlow,也有不少gc,但是 ...
- 【原创】大叔问题定位分享(11)Spark中对大表子查询加limit为什么会报Broadcast超时错误
当两个表需要join时,如果一个是大表,一个是小表,正常的map-reduce流程需要shuffle,这会导致大表数据在节点间网络传输,常见的优化方式是将小表读到内存中并广播到大表处理,避免shuff ...
- 【原创】大叔问题定位分享(8)提交spark任务报错 Caused by: java.lang.ClassNotFoundException: org.I0Itec.zkclient.exception.ZkNoNodeException
spark 2.1.1 一 问题重现 spark-submit --master local[*] --class app.package.AppClass --jars /jarpath/zkcli ...
- 【原创】大叔问题定位分享(6)Dubbo monitor服务iowait高,负载高
一 问题 Dubbo monitor所在服务器状态异常,iowait一直很高,load也一直很高,监控如下: iowait如图: load如图: 二 分析 通过iotop命令可以查看当前系统中磁盘io ...
- 【原创】大叔问题定位分享(5)Kafka客户端报错SocketException: Too many open files 打开的文件过多
kafka0.8.1 一 问题 10月22号应用系统忽然报错: [2014/12/22 11:52:32.738]java.net.SocketException: 打开的文件过多 [2014/12/ ...
- 【原创】大叔问题定位分享(4)Kafka集群broker节点从zookeeper上消失
kafka_2.8.0-0.8.1 一 现象 生产环境一组kafka集群经常发生问题,现象是kafka在zookeeper上的broker节点消失,此时kafka进程和端口都在,然后每个broker都 ...
- 【原创】大叔问题定位分享(3)Kafka集群broker进程逐个报错退出
kafka0.8.1 一 问题现象 生产环境kafka服务器134.135.136分别在10月11号.10月13号挂掉: 134日志 [2014-10-13 16:45:41,902] FATAL [ ...
- 【原创】大叔问题定位分享(30)mesos agent启动失败:Failed to perform recovery: Incompatible agent info detected
mesos agent启动失败,报错如下: Feb 15 22:03:18 server1.bj mesos-slave[1190]: E0215 22:03:18.622994 1192 slave ...
随机推荐
- 关于IOC容器的一些个人理解
一丶前言 下面是本人对于IOC容器的一些个人理解,希望能帮到初学者认识IOC,如有理解得不对的地方欢迎指正,也让我学学. 二丶IOC是什么,它是干嘛的? IOC只是一种编程思想,不局限于任何一种语言, ...
- 1 Introduction
1. Introduction 1.1. License Flowable is distributed under the Apache V2 license. 1.2. Download http ...
- h5-canvas 单像素操作
###1. 自定义获取指定坐标像素 var canvas = document.querySelector("#cav"); if(canvas.getContext){ var ...
- MySql下实现先排序后分组
最近在工作中遇到一个先排序后分组的需求,发现MySql不同的版本有不同的结果,特此记录. 举例:要求在shop表中查询出各类型商店中价格最高的商品. --表结构-- create table `sho ...
- Java 常用数据结构对象的实现原理 集合类 List Set Map 哪些线程安全 (美团面试题目)
Java中的集合包括三大类,它们是Set.List和Map, 它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类. List.Set都继承自Collection接口 ...
- Scrapy 框架,持久化文件相关
持久化相关 相关文件 items.py 数据结构模板文件.定义数据属性. pipelines.py 管道文件.接收数据(items),进行持久化操作. 持久化流程 1.爬虫文件爬取到数据后,需要将数据 ...
- Magento2 Service contracts 服务合同
服务合同 Magento是一个模块化系统,它使第三方开发人员能够定制和覆盖其框架的核心部分.然而,这种灵活性是有代价的. 业务逻辑倾向于泄漏Magento系统的各个层,这表现为重复且不一致的代码. 商 ...
- BZOJ3456城市规划
题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通.为了 ...
- redis-sentinel高可用配置(2)
一:说明 前面我们已经配置了redis的主从配置(链接),这种主从架构有一个问题,当主master出现了故障了,怎么切换到从服务器上呢? 第一种:手动切换, 这种肯定会造成比较长一段时间的用户不能访问 ...
- spring定时任务详解(@Scheduled注解)
Spring配置文件xmlns加入 xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocati ...