通过宿主机查看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——第一章:用户交互
变量 = input(提示语)首先会在屏幕中显示出提示语, 用户输入内容. 然后把用户输入的内容交给前面的变量 案例1: a = input("请输入第一个数字:") #括号里是提 ...
- k8s环境设置-pod下载及重启策略
k8s环境设置 在我们开始使用k8s之前,我们可以先做一些环境配置,使k8s更加的方便使用 第一个要做的就是kubectl命令的补全 在使用kubectl的时候你会发现参数你是Tab不出来的,这时候我 ...
- ElasticSearch的简单api介绍
1:ElasticSearch是什么? Elasticsearch 是一个分布式的免费开源搜索和分析引擎 适用于包括文本.数字.地理空间.结构化和非结构化数据等在内的所有类型的数据 Elasticse ...
- .Net人的自我修养-书目汇总
.Net人的自我修养-书目汇总 2019年来现在的公司开始从事.Net相关的工作.记录一下工作以来看过(或者翻过)和听过还不错打算看相关的技术书籍或资料. 为了方便给大家参考,看(翻)过书目以难度排序 ...
- 什么是HuggingFace
一.HuggingFace简介 1.HuggingFace是什么 可以理解为对于AI开发者的GitHub,提供了模型.数据集(文本|图像|音频|视频).类库(比如transformers|peft|a ...
- 基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现(Python版本)
[摘要]本文将为大家带来使用Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现的展示. 前言 YOLOv3可以算作是经典网络了,较好实现了速度和精度的Trade off,成为和 ...
- 教你使用Jupyter可视化查询语句的语法树
摘要:本文以华为图引擎使用的cypher查询语言为例,将查询语句的解析结果(语法树)在jupyterLab上可视化. 本文分享自华为云社区<使用Jupyter可视化查询语句的语法树--以图查询语 ...
- 带你学会区分Scheduled Thread Pool Executor 与Timer
摘要:本文简单介绍下Scheduled Thread Pool Executor类与Timer类的区别,Scheduled Thread Pool Executor类相比于Timer类来说,究竟有哪些 ...
- 结MySQL 的一些知识点:MySQL 安装
MySQL 安装 所有平台的 MySQL 下载地址为: MySQL 下载 . 挑选你需要的 MySQL Community Server 版本及对应的平台. **注意:**安装过程我们需要通过开启管理 ...
- Solon2 开发之IoC,一、注入或手动获取配置
约定 resources/app.yml( 或 app.properties ) #为应用配置文件 配置样例 track: name: xxx url: http://a.a.a db1: jdbcU ...