通过宿主机查看K8S或者是容器内的Java程序的简单方法
通过宿主机查看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
可以看到会一直在进行转换, 速度其实挺慢的.
通过宿主机查看K8S或者是容器内的Java程序的简单方法的更多相关文章
- 宿主机-免密登录Docker容器
CentOS7 安装Docker 讨论QQ:1586558083 目录 一.检查系统内核 二.安装Docker 2.1 安装 2.2 查看docker版本 2.3 启动docker 三.建立docke ...
- docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面
1.从容器里面拷文件到宿主机? 答:在宿主机里面执行以下命令 docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 示例: 假设容器名为testtomcat, ...
- linux下如何映射宿主机中的文件到容器中?
答:在启动容器时使用-v指定宿主机目录和要映射到的容器内部目录,语法如下: docker run -it -v <host_dir>:<container_dir> <c ...
- 可控线性序列机(查看除了inout端口外的其他变量的波形的方法)
可控线性序列机: 可控:有个控制端控制何时输出线性序列. 线性序列机:输出一个线性序列. 知识点: 1.包含多个判定条件时用英文()括起来,用&&连接. 2.使能端EN的设置(类似于D ...
- 如何规避容器内做Java堆dump导致容器崩溃的问题
写在前边 最近公司生产环境的容器云上出了个性能问题,为了做性能分析,使用 JDK 自带的 jmap 收集堆dump,出现了内存溢出导致了容器崩溃. 本篇文章将带你探究,如何规避容器内做堆 dump 导 ...
- 将宿主机东西拷贝到dokcer容器中去
1,获取容器名称或者id : docker ps 2,获取整个容器的id,其实键盘tag就可以补全的. docker inspect -f '{{.Id}}' 步骤A获取的名称或者id 3,在主机 ...
- 在宿主机查看docker使用cpu、内存、网络、io情况
命令: docker stats [OPTIONS] [CONTAINER...] 显示所有: docker stats -a
- 干货:不同场景容器内获取客户端源IP的方法
摘要:客户端和容器服务器之间可能存在多种不同形式的代理服务器,那容器中如何获取到客户端真实的源ip呢? k8s已经成为当今容器化的标准,人们在享受容器带来的高效与便利的同时,也遇到一些烦恼:客户端和容 ...
- Docker-使用数据卷在宿主机和容器间的数据共享
场景一:现在用Docker创建了N个容器,但是这些容器之间需要数据共享,这个时候我们应该怎么办?[参考第四步] 场景二:docker创建了一个容器并进入容器,添加了一些定制功能,此时除了用docker ...
- Docker容器学习梳理 - 应用程序容器环境部署
关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...
随机推荐
- 玩转Python:用Python处理文本数据,附代码
Python 提供了多种库来处理纯文本数据,这些库可以应对从基本文本操作到复杂文本分析的各种需求.以下是一些常用的纯文本处理相关的库: str 类型: Python 内建的字符串类型提供了许多简便的方 ...
- ajax与thymeleaf分别实现数据传输
小杰笔记篇: 1:第一种:利用Model和thymeleaf引擎来完成: Controller层: @CrossOrigin//解决跨域问题 @Controller public class User ...
- 初探 Linux Cgroups:资源控制的奇妙世界
Cgroups 是 linux 内核提供的功能,由于牵涉的概念比较多,所以不太容易理解.本文试图通过简单的描述和 Demo 帮助大家理解 Cgroups . 如果你对云原生技术充满好奇,想要深入了解更 ...
- 2023-06-04:你的音乐播放器里有 N 首不同的歌, 在旅途中,你的旅伴想要听 L 首歌(不一定不同,即,允许歌曲重复, 请你为她按如下规则创建一个播放列表, 每首歌至少播放一次, 一首歌只有在
2023-06-04:你的音乐播放器里有 N 首不同的歌, 在旅途中,你的旅伴想要听 L 首歌(不一定不同,即,允许歌曲重复, 请你为她按如下规则创建一个播放列表, 每首歌至少播放一次, 一首歌只有在 ...
- 2021-01-14:timsort是什么,如何用代码实现?
福哥答案2021-01-14: 答案来自此链接: 介绍: timsort是一种混合.稳定高效的排序算法,源自合并排序和插入排序,旨在很好地处理多种真实数据.它由Tim Peters于2002年实施使用 ...
- 神经网络入门篇:深度学习和大脑的关联性(What does this have to do with the brain?)
深度学习和大脑的关联性 开始讲故事(手动狗头) 深度学习和大脑有什么关联性吗? 关联不大. 那么为什么会说深度学习和大脑相关呢? 当你在实现一个神经网络的时候,那些公式是你在做的东西,你会做前向传播. ...
- 理论+实践,揭秘昇腾CANN算子开发
摘要: 本文介绍了CANN自定义算子开发的几种开发方式和算子的编译运行流程.然后以开发一个DSL Add算子为例,讲解算子开发的基本流程. 本文分享自华为云社区<昇腾CANN算子开发揭秘> ...
- 如何处理分析Flink作业反压的问题?
摘要:反压是 Flink 应用运维中常见的问题,它不仅意味着性能瓶颈还可能导致作业的不稳定性. 反压(backpressure)是实时计算应用开发中,特别是流式计算中,十分常见的问题.反压意味着数据管 ...
- 解读8大场景下Kunpeng BoostKit 使能套件的最佳能力和实践
摘要:本次鲲鹏 BoostKit 训练营为开发者介绍如何基于鲲鹏 BoostKit 使能套件实现应用性能的加速,并重点剖析性能优化技术和关键能力. 本文分享自华为云社区<[云驻共创]" ...
- 高并发中,那些不得不说的线程池与ThreadPoolExecutor类
摘要:从整体上认识下线程池中最核心的类之一--ThreadPoolExecutor,关于ThreadPoolExecutor的底层原理和源码实现,以及线程池中的其他技术细节的底层原理和源码实现. 本文 ...