生产Docker应用重启排查经历

一、现象描述

        近期,生产云平台监控发生Docker应用重启次数过多事故报警,经观察发现某些Docker应用不定期地出现重启现象,已严重影响服务正常提供

生产应用重启的判断条件:健康检查连续3次检查不通过 
生产健康检查间隔时间设置为:5s,也就是说如果应用对健康检查请求在15s内未返回结果,则云平台自动重启应用

二、重启现象分析

2.1、线程池泄漏问题

(1)、方法一:pstree命令分析

       第一步:使用ssh命令远程登录应用服务器,然后输入pstree查看各进程下的线程数,初步定位出现的进程和是否发生线程泄漏,效果如下:

        第二步:然后输入命令:pstree -a,具体定位问题进程所在的工程

   (2)、方法二:jvisualvm监控

        jvm参数增加jmx监控参数:

#JMX监控开启,端口号:280$SERVICE_PORT
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=应用所在机器IP -Dcom.sun.management.jmxremote.port=未使用的端口号 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

       打开终端工具,输入:jvisualvm 命令回车进入窗口界面,然后在在《远程》菜单上右击后点击《添加远程主机》,然后设置端口点击《确定》即可

(3)、线程泄漏原因分析

问题一:线程池频繁创建导致线程泄漏

经代码分析得出消息监听器频繁创建线程池,导致的线程泄漏

          因此,对init函数进行改造,防止线程池的频繁创建,改造代码如下:

private Object lock = new Object();public void init() {if (pool != null) {return;}//同步锁机制,瞬间高并发场景防护synchronized (lock) {if (pool != null) {return;}int availableProcessors = Runtime.getRuntime().availableProcessors() * 2 + 1;pool = Executors.newFixedThreadPool(availableProcessors, new ThreadFactory() {public Thread newThread(Runnable r) {Thread thread = new Thread(r);String threadName = "MakeUpListener_Thread_" + threadCount.incrementAndGet();thread.setName(threadName);return thread;}});....代码省略}
}

问题二:线程池大小设置不合理

分析:

(1)、线程池频繁创建

(2)、应用程序高并发异步处理业务时,线程池中的线程大小设置过大,导致线程数大量创建去处理业务,从而导致正常的http请求响应过慢;例如hg-ws联名账户子系统线程池大小设置为:20000,在业务量大的情况下经常出现重启现象

(3)、应用接收到大量客户请求并进行处理,前面请求未处理完成,后面有新的请求,从而导致后边请求一直处于排队状态,请求响应时间较慢

解决方案:

(1)、线程池合理创建,线程池大小设置在合理的区间内

(2)、用户发送请求响应,只需业务主流程是同步执行,非主流程可以异步执行,例如:用户下单支付完成后,向统计系统发送用户交易统计的行为可以异步执行,减少请求占用时间

2.2、Full GC期间,暂停所有应用线程执行,导致请求无响应

分析方法:gc日志分析

第一步:JVM参数配置GC日志收集和输出参数

	JAVA_OPTS="$JAVA_OPTS -verbose:gc"JAVA_OPTS="$JAVA_OPTS -Xloggc:/apps/dbconfig/gc.log"JAVA_OPTS="$JAVA_OPTS -XX:NumberOfGCLogFiles=20"JAVA_OPTS="$JAVA_OPTS -XX:GCLogFileSize=30m"JAVA_OPTS="$JAVA_OPTS -XX:+UseGCLogFileRotation"JAVA_OPTS="$JAVA_OPTS -XX:+PrintVMOptions"JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails"JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCTimeStamps"JAVA_OPTS="$JAVA_OPTS -XX:+PrintHeapAtGC"JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDateStamps"JAVA_OPTS="$JAVA_OPTS -XX:+PrintTenuringDistribution"JAVA_OPTS="$JAVA_OPTS -XX:+PrintAdaptiveSizePolicy"JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCApplicationStoppedTime"JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCApplicationConcurrentTime"JAVA_OPTS="$JAVA_OPTS -XX:+PrintConcurrentLocks"JAVA_OPTS="$JAVA_OPTS -XX:+TraceClassUnloading"

第二步:分析gc日志,可以通过专门的分析工具GCViewer进行分析,也可以通过在https://gceasy.io/网址上进行分析(本人采用线上GC分析方式)

        经过对生产子系统(jdk1.8环境)的gc日志分析,发现生产应用使用的老年代的回收算法(Full Collection)是:UseParallelGC并行处理期(使用多个线程同时进行垃圾回收,多核环境下充分利用CPU资源,减少回收时间,是Server模式下的默认回收器),但在回收期间暂停应用线程的执行;Full GC的大部分原因是:MetaSpace初始化空间不够

经上面总结得出:应用Full GC时间最长长达24s,而生产应用重启主要是因为Full GC时间过长导致
因此主要采取如下方法:
1)、优化JVM参数配置;例如:持久区大小、新老生代比例、回收算法等
2)、健康检查间隔时间延长
应用JVM参数新增:-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewRatio=1 -XX:SurvivorRatio=8

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】深入理解Java线程

1 相关概念 并发:两个或多个事件在同一时间段内发生【多个任务交替执行】 并行:两个或多个事件在同一时刻发生【多个任务同时执行】 进程:进入内存的程序 内存:所有应用程序都要进入到内存中执行 临时存储RAM 线程:进…

机器学习——多元线性回归分析(multiple regression)及应用

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/loveliuzz/article/details/78006493 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_vi…

肖仰华 | 知识图谱研究的回顾与展望

本文转载自公众号知识工场。 本文整理自2017年10月19日肖仰华教授在知识图谱前沿技术课程&#xff08;华东师范大学站&#xff09;所做的报告&#xff0c;报告的题目为《知识图谱研究的回顾与展望》。 大家好&#xff0c;很多人在对知识图谱的研究或者落地方面都表现出了极大的…

Java应用性能调优工具介绍及实践

一、背景 &#xff08;1&#xff09;、随着微服务架构的逐渐推广&#xff0c;一个大型的单个应用程序被拆分为数个微服务系统&#xff0c;这为研发人员的本地调试跟踪带来困难 &#xff08;2&#xff09;、在微服务架构中&#xff0c;由于业务的复杂性&#xff0c;常常一个业务…

Google、MS和BAT教给我的面试真谛

大家好呀&#xff0c;我是「小鹿鹿鹿」&#xff0c;我又来啦&#xff5e;&#xff5e;趁大家还有依稀印象赶紧乘热打铁&#xff5e;&#xff5e;这次聊一聊关于面试的一些小想法&#xff0c;希望和大家交流交流&#xff5e;&#xff5e;虽然资历尚浅&#xff0c;但是也面过不少…

AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法

导读&#xff1a;词向量算法是自然语言处理领域的基础算法&#xff0c;在序列标注、问答系统和机器翻译等诸多任务中都发挥了重要作用。词向量算法最早由谷歌在2013年提出的word2vec&#xff0c;在接下来的几年里&#xff0c;该算法也经历不断的改进&#xff0c;但大多是仅适用…

甲子光年 | 为什么知识图谱终于火了?

本文转载自公众号甲子光年。如果知识是人类进步的阶梯&#xff0c;知识图谱就是AI进步的阶梯。作者&#xff5c;金丝猴编辑&#xff5c;甲小姐设计&#xff5c;孙佳栋微信&#xff5c;甲子光年 (ID:jazzyear)“知识图谱”相较于AI其他分支&#xff0c;似乎是最后一个热起来的赛…

Java多线程并发编程

一、线程池 1.1、什么是线程池 线程池是一种多线程的处理方式&#xff0c;利用已有线程对象继续服务新的任务&#xff08;按照一定的执行策略&#xff09;&#xff0c;而不是频繁地创建销毁线程对象&#xff0c;由此提高服务的吞吐能力&#xff0c;减少CPU的闲置时间。具体组成…

Step-by-step to Transformer:深入解析工作原理(以Pytorch机器翻译为例)

大家好&#xff0c;我是青青山螺应如是&#xff0c;大家可以叫我青青&#xff0c;工作之余是一名独立摄影师。喜欢美食、旅行、看展&#xff0c;偶尔整理下NLP学习笔记&#xff0c;不管技术文还是生活随感&#xff0c;都会分享本人摄影作品&#xff0c;希望文艺的技术青年能够喜…

知识图谱与智能问答基础理解

什么是知识图谱&#xff1f; 知识图谱本质上是语义网络&#xff0c;是一种基于图的数据结构&#xff0c;由节点(Point)和边(Edge)组成。在知识图谱里&#xff0c;每个节点表示现实世界中存在的“实体”&#xff0c;每条边为实体与实体之间的“关系”。知识图谱是关系的最有效的…

鲍捷 | 知识图谱从 0 级到 10 级简化版

本文转载自公众号&#xff1a;文因学堂。文因学以前写过几个进阶指南&#xff0c;可能都太难&#xff0c;不接地气。这里重新写一个更实事求是、更便于工程落地的版本0级&#xff1a;掌握正则表达式、SQL、JSON和一门支持if-then-else的高级语言 —— 是的&#xff0c;这些不是…

Java并发优化思路

一、并发优化 1.1、Java高并发包所采用的几个机制 &#xff08;1&#xff09;、CAS&#xff08;乐观操作&#xff09; jdk5以前采用synchronized&#xff0c;对共享区域进行同步操作&#xff0c;synchronized是重的操作&#xff0c;在高并发情况下&#xff0c;会引起线…

他与她,一个两年前的故事

“ 有没有那个Ta&#xff0c;值得你一生去守护”1她能力出众&#xff0c;业务能力无人能出其左右&#xff1b;他资质平庸&#xff0c;扮演一个很不起眼的角色&#xff1b;她国色天香&#xff0c;是整个公司上上下下关注的焦点&#xff1b;他其貌不扬&#xff0c;甚至很多人根本…

科普 | 知识图谱相关的名词解释

知识图谱&#xff08;Knowledge Graph&#xff09;是谷歌于2012年提出。企业通常出于商业目的去设计新的概念和名词。但每一个概念的提出都有其历史渊源和本质内涵。下面列举了知识图谱相关的几个概念&#xff0c;并简要阐明了它们与知识图谱的关系和区别。Knowledge Base&…

搜索引擎核心技术与算法 —— 倒排索引初体验

今天开启一个新篇章——智能搜索与NLP。本篇章将由羸弱菜鸡小Q和大家一同学习与智能搜索相关的知识和技术&#xff0c;希望能和大家一同学习与进步&#xff0c;冲鸭&#xff01;&#xff01;这里首先区分两个概念&#xff1a;搜索和检索检索&#xff1a;数据库时代的概念&#…

微服务设计原则和解决方案

一、微服务架构演进过程 近年来我们大家都体会到了互联网、移动互联带来的好处&#xff0c;作为IT从业者&#xff0c;在生活中时刻感受互联网好处的同时&#xff0c;在工作中可能感受的却是来自自互联网的一些压力&#xff0c;那就是我们传统企业的IT建设也是迫切需要转型&…

技术动态 | 知识可视化,连接和探究知识之间的联系!

本文转载自公众号&#xff1a;东湖大数据交易中心。大数据百人会线上沙龙 第八期3月1日晚八点&#xff0c;大数据百人会沙龙第八期主讲嘉宾——北京知珠传媒科技有限公司CEO郝庆一先生&#xff0c;分享他对可视化的理解&#xff0c;以及连接知识、探究知识之间的关系。1可视化…

潜在语义分析原理以及python实现代码!!!!

在Wiki上看到的LSA的详细介绍&#xff0c;感觉挺好的&#xff0c;遂翻译过来&#xff0c;有翻译不对之处还望指教。 原文地址&#xff1a;http://en.wikipedia.org/wiki/Latent_semantic_analysis 前言 浅层语义分析&#xff08;LSA&#xff09;是一种自然语言处理中用到的方法…

史上最可爱的关系抽取指南?从一条规则到十个开源项目

正文来自订阅号&#xff1a;AINLP正文作者&#xff1a;太子長琴&#xff08;NLP算法工程师&#xff09;小夕&#xff0c;我来给你出个题&#xff0c;看看你的反应如何&#xff1f;好呀好呀&#xff0c;你说~“梁启超有一个著名的儿子&#xff0c;叫梁思成;同时还有一个著名的学…

论文浅尝 | Leveraging Knowledge Bases in LSTMs

Yang, B., Mitchell, T., 2017. Leveraging Knowledge Bases in LSTMs for Improving Machine Reading. Association for Computational Linguistics, pp. 1436–1446.链接&#xff1a;http://www.aclweb.org/anthology/P/P17/P17-1132.pdf这篇论文是今年发表在 ACL 的一篇文章…