首页 > 其他分享 >K8S下应用异常卡顿问题的分析与学习

K8S下应用异常卡顿问题的分析与学习

时间:2024-05-18 09:00:01浏览次数:26  
标签:daemon jdk prio 问题 C2 C1 K8S 异常 卡顿

K8S下应用异常卡顿问题的分析与学习


背景

周二自己在处理申威服务器的问题时, 被同事拉进一个群聊.
告知客户现场有一个特殊情况: 
服务晚上重启,  上午速度还可以, 但是到了下午就开始变的非常卡顿.

因为当时正在车上也看不到具体信息. 
晚上九点上会进行了一次简单查看.

发现GC非常平稳, 容器内的CPU和内存都和很正常
部署模式是 华为鲲鹏服务器上面的 华为云 K8S集群
容器部署.

第一次问题分析

第一天没有上手操作(这是一个败笔)
根据现场同事的说明进行了简单的判断. 

启动参数问题不大, 资源没问题 , GC没问题
同事一开始怀疑是 虚拟化挤压导致的性能下降
我通过gclog发现GC时间变化不大, 排除了这一个可能. 

但是怀疑自己分析错了 top -Hp的文件,导致出现误判
怀疑的方向到了 东方通中间件. 以为是中间件的问题. 

第二次问题分析

周三下午问题依旧. 
不过也排除了东方通的问题, 不算是没收获.
没办法紧急联系了华为云的运维人员
进行了一些简单的沟通
发现大家都一样, 认为自己没问题. 
都是别人的问题. 
云平台说别人没问题, 就你们有问题
我们说大项目都没问题,就这个项目有问题.
没办法继续折腾 

周三其实没有特别大的发现, 想着继续看看

第三次问题分析

周四下午问题继续 !-_-!
正好下午有时间可以远程, 趁着六点客户使用低谷期进行了验证
周三其实还是有一个收获的, 看到华为云有一个jvm的监控
周四自己能操作, 多看了会儿, 发现 codecache 是一个深坑, 只有 48MB
然后继续上手操作: 
其实方法还是一样的. 
第一步 docker exec -it $containerid bash 进入容器
第二步 top -Hp 16 然后输入大写的 T  查看 现成CPU使用时间
这里存在一个坑爹的问题, 容器内不显示具体线程信息, 只显示java
第三步 jstack -l 16 > 1.txt 然后 cat 1.txt |grep C2 
查看C2 编译进程的 进程号 发现是 nid=0x32 和 nid=0x33
查看第一步里面的 50号和51号线程, 发下CPU使用率已经超过了80分钟. 
注意这里需要进行 16进制和10进制的转换. 

基本确认 产品应该是 codecache 太小导致的问题. 

问题解决

增加启动脚本: 
-XX:InitialCodeCacheSize=1G  -XX:ReservedCodeCacheSize=1G  

第二天进行查看. 
发现 时间基本可控了. 

问题原因确定

拿现场的JDK 到公司内部进行验证
替换自己的aarch64的 jdk 进行处理
文件名为:
jdk-8u221-linux-arm64-vfp-hflt.tar.gz
替换之后进行启动. 发现
 cat jdk1.8.221.txt |grep C2
"C2 CompilerThread1" #6 daemon prio=9 
"C2 CompilerThread0" #5 daemon prio=9 
只有C2没有C1
[root@NFSV3 ~]# cat jdk1.8.221.txt |grep C1

之前的jdk的情况是: 
[root@NFSV3 ~]# cat jdk18222.txt |grep C1
"C1 CompilerThread20" #25 daemon prio=9 
"C1 CompilerThread19" #24 daemon prio=9 
"C1 CompilerThread18" #23 daemon prio=9 
"C1 CompilerThread17" #22 daemon prio=9 
"C1 CompilerThread16" #21 daemon prio=9 
"C1 CompilerThread15" #20 daemon prio=9 
"C1 CompilerThread14" #19 daemon prio=9 

现场的JDK版本存在问题.  一方面太久, 并且是一个prerelease的.

问题进一步的思考

这个简单的问题浪费了两天的时间
(主要是有其他事情在, 自己没直接上手.)

但是不想浪费时间就这么白白浪费了
趁着帮人解决问题, 想多进行一下思考和数据获取

第一个: 为什么我这边正常情况下 服务器返回而也有 300ms.
不应该这么多的, 公司内x86的机器才  20ms左右
自己想到了网络延迟, 然后ping了下,发现延迟在 40ms. 
自己与项目所在地的距离应该是
好几千公里.  所以理论上在局域网应该会少40ms
然后让交付进行了验证, 的确现场大概是 250ms 左右

第二个: 想到了是容器化部署的情况
我让交付同事直接使用node:port的方式进行查看时延的情况
发现延迟也差不多 250ms
所以怀疑 K8S的出口有一个较大行的网络设备影响了网络延迟. 
公司内最快15ms.明显网络设备产生了 240ms的延迟. 

问题进一步思考之二

为啥方法区默认是48MB
现场同事很细心, 立马发现 分层编译时默认值是 240MB
不启用分层编译是  48MB
但是我们没有明确在指定不使用分层编译
所以这是一个什么鬼? 

又花费了了一段时间进行排查, 暂未发现
感觉可以问问呢 华为云或者是 jdk的版本? 

问题的进一步思考之三

其实如果有perf 或者是 epbf 
或者是使用arthas 或者是 async profiler
可以通过查看火焰图里面大的平台
如果升级jdk 可以使用jfr 然后同构jmc进行分析

估计也可以看到是 complie 相关
也可以确定这个问题原因
但是现场没有部署这一些工具, 部署工具有担心影响性能. 

所以很多问题是需要循序渐进的. 
提高自己的武器库才重要
不能盲猜不能盲信. 

问题的进一步思考之四

需要统一交付物
这几天帮助同事进行处理. 
他找了一圈都没找到openjdk的下载点
自己下载的这个jdk有bug 
也不能怪这位同事.

还是需要有一个统一的知识库和可以获取下载的点的. 

标签:daemon,jdk,prio,问题,C2,C1,K8S,异常,卡顿
From: https://www.cnblogs.com/jinanxiaolaohu/p/18197972

相关文章

  • 放弃k8s,拥抱ECI;水很深,一切都是为了钱,没有钱的动力,云服务商会发展k8s生态???
    学习k8s前鄙视eci,学习完后决定放弃k8s,拥抱ECI;从架构图可以看到,以后ECI不会是方向,只是一些压测,弹性伸缩的业务;2.eci不能融入k8s生态,导致企业不愿意转,这也是eci一直想融入k8s生态,向k8s生态靠拢的原因,就是说是eci什么k8sserverless版本退出,底层基于eci,没有k8s生态eci就是一......
  • java基础 韩顺平老师的 异常 自己记的部分笔记
    443,异常处理入门 packagecom.hspedu.exception_;publicclassException{publicstaticvoidmain(String[]args){intnum1=10;intnum2=0;//老韩解读//1,num1/num2=10/0//2,当执行到num1/num2,因为num2......
  • k8s安装网络组件calico报错Init:ImagePullBackOff
    问题:安装网络组件calico报错Init:ImagePullBackOff[root@k8s-master15:33:08~/kubernets]#kubectlgetpods-nkube-systemNAMEREADYSTATUSRESTARTSAGEcalico-kube-controllers......
  • SpringMVC中的异常处理机制
    1.概述SpringMVC提供了基于xml和基于注解的异常处理机制,一般情况下两者都要进行配置,xml异常处理机制主要用于处理xml方式产生的异常,注解异常处理机制主要用于处理基于注解方式产生的异常。2.基于xml方式的异常处理机制<!--配置基于xml的异常映射--><beanid="simpleMapp......
  • spring security 使用过滤器认证登录时,抛出自定义异常
    前情提要最近在做项目的改造,涉及到新增用户的离职冻结状态,当被离职/冻结后,尝试登录系统,则抛出不同的异常代码给前端,前端依据不同的异常代码提示不同的文本。所以需要对项目的认证逻辑简单调整,增加按照不同的登录用户的状态(离职/冻结)判断,如果满足指定状态,则抛出对应的异常代码。......
  • 多线程下使用List中的subList和remove方法产生的 java.util.ConcurrentModificationEx
    在说多线程操作List之前,我们先看下单线程下产生的问题:单线程List<Integer>listA=newArrayList<>();listA.add(1);listA.add(2);listA.add(3);listA.add(4);listA.add(5);listA.add(6);for(Integera:listA){......
  • 记一次k8s etcd报错Unhealthy
    使用命令某个节点ectd不健康#kubectlgetcsNAMESTATUSMESSAGEERRORcontroller-managerHealthy......
  • python部署至k8s解决方案
    前言最近做了一个全文检索的项目,项目之前的架子是别人搭建的,部署方式是docker-compose,到后期这个同事基本上不参与了,后面发布测试的时候,我们觉得这种方式不适合测试环境和线上发版(当然也可能是我们不熟悉,有点不专业了),于是就在他开发的基础上,做了一些调整:修改Dockerfile:把依赖打......
  • NODEJS通过发送json数据查询目标服务,实现服务器状态监控,发现异常发送到微信群提醒
    root@aea87fa6e6a2:/home/node#catlogin2.jsconstrequest=require('request-promise');constmoment=require('moment');constcron=require('node-cron');process.env.TZ='Asia/Shanghai';//设置时区为上海时区constrp......
  • tkinter打包执行异常
    一、背景tkinter界面中通常会用到日历控件,常用的是tkcalendar,这个包在编译器中使用时一般没什么问题,但是在打包时会出现问题,无论是Pyinstaller还是Nuitka,网上能查到的都是Pyinstaller解决方案,这里写一下Nuitka的解决方案。二、tkcalendar问题1——Calendar与python自带的calenda......