公司一个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问题的更多相关文章

  1. 【原创】大叔问题定位分享(13)HBase Region频繁下线

    问题现象:hive执行sql报错 select count(*) from test_hive_table; 报错 Error: java.io.IOException: org.apache.had ...

  2. 【原创】大叔问题定位分享(1)HBase RegionServer频繁挂掉

    最近hbase集群很多region server挂掉,查看其中一个RegionServer1日志发现,17:17:14挂的时候服务器压力很大,有大量的responseTooSlow,也有不少gc,但是 ...

  3. 【原创】大叔问题定位分享(11)Spark中对大表子查询加limit为什么会报Broadcast超时错误

    当两个表需要join时,如果一个是大表,一个是小表,正常的map-reduce流程需要shuffle,这会导致大表数据在节点间网络传输,常见的优化方式是将小表读到内存中并广播到大表处理,避免shuff ...

  4. 【原创】大叔问题定位分享(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 ...

  5. 【原创】大叔问题定位分享(6)Dubbo monitor服务iowait高,负载高

    一 问题 Dubbo monitor所在服务器状态异常,iowait一直很高,load也一直很高,监控如下: iowait如图: load如图: 二 分析 通过iotop命令可以查看当前系统中磁盘io ...

  6. 【原创】大叔问题定位分享(5)Kafka客户端报错SocketException: Too many open files 打开的文件过多

    kafka0.8.1 一 问题 10月22号应用系统忽然报错: [2014/12/22 11:52:32.738]java.net.SocketException: 打开的文件过多 [2014/12/ ...

  7. 【原创】大叔问题定位分享(4)Kafka集群broker节点从zookeeper上消失

    kafka_2.8.0-0.8.1 一 现象 生产环境一组kafka集群经常发生问题,现象是kafka在zookeeper上的broker节点消失,此时kafka进程和端口都在,然后每个broker都 ...

  8. 【原创】大叔问题定位分享(3)Kafka集群broker进程逐个报错退出

    kafka0.8.1 一 问题现象 生产环境kafka服务器134.135.136分别在10月11号.10月13号挂掉: 134日志 [2014-10-13 16:45:41,902] FATAL [ ...

  9. 【原创】大叔问题定位分享(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 ...

随机推荐

  1. 关于IOC容器的一些个人理解

    一丶前言 下面是本人对于IOC容器的一些个人理解,希望能帮到初学者认识IOC,如有理解得不对的地方欢迎指正,也让我学学. 二丶IOC是什么,它是干嘛的? IOC只是一种编程思想,不局限于任何一种语言, ...

  2. 1 Introduction

    1. Introduction 1.1. License Flowable is distributed under the Apache V2 license. 1.2. Download http ...

  3. h5-canvas 单像素操作

    ###1. 自定义获取指定坐标像素 var canvas = document.querySelector("#cav"); if(canvas.getContext){ var ...

  4. MySql下实现先排序后分组

    最近在工作中遇到一个先排序后分组的需求,发现MySql不同的版本有不同的结果,特此记录. 举例:要求在shop表中查询出各类型商店中价格最高的商品. --表结构-- create table `sho ...

  5. Java 常用数据结构对象的实现原理 集合类 List Set Map 哪些线程安全 (美团面试题目)

    Java中的集合包括三大类,它们是Set.List和Map, 它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类. List.Set都继承自Collection接口 ...

  6. Scrapy 框架,持久化文件相关

    持久化相关 相关文件 items.py 数据结构模板文件.定义数据属性. pipelines.py 管道文件.接收数据(items),进行持久化操作. 持久化流程 1.爬虫文件爬取到数据后,需要将数据 ...

  7. Magento2 Service contracts 服务合同

    服务合同 Magento是一个模块化系统,它使第三方开发人员能够定制和覆盖其框架的核心部分.然而,这种灵活性是有代价的. 业务逻辑倾向于泄漏Magento系统的各个层,这表现为重复且不一致的代码. 商 ...

  8. BZOJ3456城市规划

    题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通.为了 ...

  9. redis-sentinel高可用配置(2)

    一:说明 前面我们已经配置了redis的主从配置(链接),这种主从架构有一个问题,当主master出现了故障了,怎么切换到从服务器上呢? 第一种:手动切换, 这种肯定会造成比较长一段时间的用户不能访问 ...

  10. spring定时任务详解(@Scheduled注解)

    Spring配置文件xmlns加入 xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocati ...