首页 > 编程语言 >通过宿主机查看K8S或者是容器内的Java程序的简单方法

通过宿主机查看K8S或者是容器内的Java程序的简单方法

时间:2023-12-10 17:34:05浏览次数:40  
标签:java 查看 dump 宿主机 Java docker K8S root

通过宿主机查看K8S或者是容器内的Java程序的简单方法


背景

最近一个项目的环境出现了 cannot create native process 的错误提示
出现这个错误提示时, docker exec 或者是 kube exec 进入容器/POD内部后,无法使用jstack等的命令. 

然后想简单查看一下问题原因都无从下手. 
这次报错的提示信息其实比较奇怪, 也是提示了OOM
但是看 K8S的监控 内存才 12G (POD限制内存27G) CPU都没有用到 1个核心(POD限制 6个CPU)

看到这些数据时感觉并没有出现堆区内存泄漏导致的OOM, 怀疑是线程池资源未回收导致的线程池数量到达上限.
不过一直是没有任何证据, 所以想想办法从外部进行一下信息的简要查看. 

第一部分现成信息查看

容器是通过cgroup和namespace实现了资源限制和资源隔离. 
虽然Java是跑在K8S管理下面的POD里面的, 但是实际上依旧是Linux系统里面的一个 process
所以理论上可以通过 host 查看 pod内的contianer的部分信息. 

所以可以连上host K8S运行此应用的worker节点. 
这里吐槽一下 美帝的政治正确下, master 节点都改名 control-plane 了. 不适应. 

ps -ef |grep java 可以看到一个进程id

最简单的方法可以使用
top -Hp $pid -bn 1 > docker_jvm.info
就可以查看进程信息. 

第二部分尝试进行dump的获取

先安装 gdb
yum install gdb -y 
然后可以使用 gcore 命令

然后使用 gcore $pid 的方式形成 dump 文件
但是注意可能会失败
注意在执行gcore 之前需要先执行一下
ulimit -c unlimited
设置 core 无限制, 不然会报错:
warning: Memory read failed for corefile section, 1048576 bytes at 0x7fb380c18000.
具体的执行命令为:
ulimit -c unlimited
time gcore 3019830 -o core 

注意这个命令非常耗时, 根据jvm占用内存大小不同而不同. 
配置好的机器速度会快一些.

注意 可能会有一些报错:
warning: Target and debugger are in different PID namespaces; thread lists and other data are likely unreliable.  Connect to gdbserver inside the container.
warning: Expected absolute pathname for libpthread in the inferior, but got target:/lib/x86_64-linux-gnu/libpthread.so.0.

容器内和host内的进程进行 core 获取是不太一样的. 

Core转换为dump文件

之前之前总结过, 这里直接拿来.

需要注意, 如果是 jstack的话 需要安装如下的包才可以, 单独安装 java 是没有的

yum install java-1.8.0-openjdk-devel-* 

jstack `which java` core.3019830
可以进行简单的查看

time jmap -dump:format=b,file=heap.hprof `which java` core.3019830
可以使用这个命令从 core文件中获取一下对应的jvm dump 文件.

获取之后就可以使用 mat jprofiler 工具进行分析了.

之前总结的地址:
https://mp.weixin.qq.com/s?__biz=MzU2MTA2MzQyNw==&mid=2247485503&idx=1&sn=5e8454f65a2e0c8dcb336b5ff295476b&chksm=fc7f3b53cb08b245bb02348687d6f7b400861f7b5409a340e103f452b37dea4f8c67e85c9434&token=1159504462&lang=zh_CN#rd

注意事项

除非是jdk的版本完全一样, 不然是无法解析的, 会报错:
sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp

这是可以使用 docker 内部的 jdk进行相关的处理
方式为:
docker run -it -v /root:/root jdk:$tag

然后在内部执行就可以了

备注

可能依旧会失败. 并且转换的速度非常缓慢

[root@k8sipv6 ~]# docker exec -it tender_curran bash    
root@ef38f1ee8e4f:~# ps -ef |grep jmap
root          33       1 99 17:07 pts/0    00:11:32 jmap -dump:format=b,file=heap.hprof /opt/java/openjdk/bin/java core.3019830
root          63      54  0 17:18 pts/1    00:00:00 grep jmap

可以看到会一直在进行转换, 速度其实挺慢的. 

标签:java,查看,dump,宿主机,Java,docker,K8S,root
From: https://www.cnblogs.com/jinanxiaolaohu/p/17892940.html

相关文章

  • 云计算中的容器化搭档Docker和K8S
    目录Docker容器Docker架构Kubernetes(k8s)容器技术演变传统部署时代:虚拟化部署时代:容器部署时代:为什么需要Kubernetes,它能做什么?DockervsK8s容器引擎vs.容器编排器:支持的镜像类型:镜像定义方式:DockerSwarmvsK8sK8s弃用Docker?Dockerdocker是一种开源的应用容器引擎,可以将应......
  • Java实现对Hadoop HDFS的API操作
    1.配置Hadoop的Windows客户端Hadoop配置Windows客户端2.新建Maven项目[略]3.添加依赖<!--https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client--><dependency><groupId>org.apache.hadoop</groupId>......
  • Java开发者的Python快速实战指南:探索向量数据库之文本搜索
    前言如果说Python是跟随我的步伐学习的话,我觉得我在日常开发方面已经没有太大的问题了。然而,由于我没有Python开发经验,我思考着应该写些什么内容。我回想起学习Java时的学习路线,直接操作数据库是其中一项重要内容,无论使用哪种编程语言,与数据库的交互都是不可避免的。然而,直接操作M......
  • Java网络编程-深入理解BIO、NIO
    深入理解BIO与NIOBIOBIO为Blocked-IO(阻塞IO),在JDK1.4之前建立网络连接时,只能使用BIO使用BIO时,服务端会对客户端的每个请求都建立一个线程进行处理,客户端向服务端发送请求后,先咨询服务端是否有线程响应,如果没有就会等待或者被拒绝BIO基本使用代码:服务端:publicclassTCPServ......
  • 必知必会Java命令-jps
    你好,我是阿光。最近想着把工作中使用过的java命令都梳理一下,方便日后查阅。虽然这类文章很多,但自己梳理总结后,还是会有一些新的收获。这也是这篇笔记的由来。今天先聊聊jps命令。命令概述⭐jps命令是JDK提供的一个工具,用于查看目标系统上的Java进程基本信息(进程ID,启动类,启......
  • Java之反射(重要 · 下)
    创建对象Class类提供了一个实例方法newInstance(),通过该方法可以创建对象,使用起来比较简单。调用构造方法packagejava2023_08_10;importjava.lang.reflect.Constructor;publicclassConstructorReflect{ publicstaticvoidmain(String[]args){ //TODOAuto-genera......
  • java-打包编译常用命令
    java-打包编译常用命令 1.maven预编译(打包检查异常) 在上到测试环境或者生产环境之前,先在本地打包检查异常: mvncleaninstall-Dmaven.test.skip=true-X  2.maven打包 一般用IDEA上的maven工具按钮: 如果打包失败则可以用下面的命令: mvncleaninsta......
  • java-数据结构
    数据结构A:栈先进后出B:队列先进先出C:数组查询快,增删慢D:链表查询慢,增删快List的三个实现类(1)List的三个实现类特点A:ArrayList底层数据结构是数组,查询快,增删慢线程不安全,效率高B:Vector底层数据结构是数组,查询快,增删慢线程安全,效率低C:LinkedList底层数据结......
  • Java中<where>和<if>标签的组合使用
     在Java中,并没有<where>和<if>标签的组合使用。这两个标签不是Java编程语言或Java标准库的一部分,它们可能是你所使用的特定框架或库提供的自定义标签。如果你正在使用某个特定的Java框架或模板引擎(如MyBatis、Thymeleaf等),这些框架或引擎可能提供了自定义标签,使得在代码中使用......
  • Java入门项目--蚂蚁爱购
    简介这是一个靠谱的Java入门项目实战,名字叫蚂蚁爱购。从零开发项目,视频加文档,十天就能学会开发JavaWeb项目,教程路线是:搭建环境=>安装软件=>创建项目=>添加依赖和配置=>通过表生成代码=>编写Java代码=>代码自测=>前后端联调=>准备找工作。学完即可成为合格的Java开发,心里有......