首页 > 编程语言 >在docker内定位占用cpu过高的java线程

在docker内定位占用cpu过高的java线程

时间:2023-07-21 20:22:14浏览次数:41  
标签:容器 java jstack 宿主机 pid 线程 docker

参考 ​>

  1. 确定进程信息
  • 判断该进程是否在Docker容器中。使用cat /proc/<pid>/cgroup查看打印内容是否包含:/docker/。原理是Docker使用了Linux cgroups
  • 使用pstree -s <pid>查看打印的进程树是否包含docker-containe,显示信息如下:
  systemd(1)───docker(1101)───docker-containe(1447)───docker-containe(7088)───entrypoint.sh(7099)───java(7152)─┬─{java}(7177)
  1. 确定进程中的线程CPU使用情况

注意:同一进程/线程在宿主机的pid和在容器中的pid不一样,其中的对应关系可以通过cat /proc/<pid>/status | grep NSpid获取

  • 宿主机:

    通过top -H -p <pid>或者ps -To pcpu,tid,pid,user <pid> |sort -r -k1 |more

  • 容器:

    若使用镜像类似BusyBox,容器内top -H不支持,但仍可使用以上宿主机方式获取占用cpu高的线程,只是获取的线程pid为宿主机上pid而非容器内pid

    若容器内支持top -H,则通过以上命令在容器内获取占用cpu高的线程pid

  1. jvm线程dump
  • 宿主机:

    通过jstack命令,使用jstack -l <pid>将结果输出到控制台,如果想将内容保存到文件中请使用jstack -l <pid> > jstack_$(date "+%Y%m%d%H%M%S").txt,其中<pid>为进程ID。若无jstack命令,可以考虑通过kill命令,使用kill -3 <pid>将结果输出到默认的日志文件中。

  • 容器:

    进入容器,如上操作。或者无jstack命令时,使用jattach,如下。

之后根据线程堆栈中nid、占用cpu高的线程pid进行进制转换(printf "%x\n" <pid>),以及注意宿主机和容器线程id mapping,就能定位出代码中消耗cpu的位置了。

标签:容器,java,jstack,宿主机,pid,线程,docker
From: https://www.cnblogs.com/hello-yz/p/17572331.html

相关文章

  • Docker学习路线9:运行容器
    要启动一个新的容器,我们使用dockerrun命令,后跟镜像名称。基本语法如下:dockerrun[选项]镜像[COMMAND][ARG...]例如,要运行官方的Nginx镜像,我们可以使用:dockerrun-d-p8080:80nginx这会启动一个新的容器,并将主机的端口8080映射到容器的端口80。列出容器要......
  • java分布式从入门到架构学习路线?
    java分布式从入门到架构学习路线?初级阶段:1.Java基础知识:掌握Java语言的基本语法、面向对象编程的概念、集合框架和异常处理等基础知识。2.网络编程:了解Java网络编程的基本概念,学习Socket编程和网络通信协议,掌握TCP/IP和HTTP协议的基本原理。3.分布式系统概念:理解分布式系统......
  • java private变量
    如何实现Java的私有变量作为一名经验丰富的开发者,我很高兴能够教会你如何实现Java中的私有变量。私有变量是指只能在类内部访问的变量,其他类无法直接访问或修改它们。下面是一个简单的步骤表格,展示了整个实现私有变量的流程。步骤描述1创建一个Java类2声明一个私有......
  • java pcm转g711a
    JavaPCM转G711a实现流程步骤概览首先,我们来描述一下整个实现流程。下表列出了实现步骤及其详细说明:步骤描述1读取PCM文件2将PCM数据转换为G711a3将G711a数据写入文件在下面的文章中,我们将逐步解释每个步骤的具体实现。步骤详解步骤1:读取PCM文件在......
  • 到主机 的 TCP/IP 连接失败 java.net.ConnectException: Connection timed out
    org.apache.commons.dbcp.SQLNestedException:CannotcreatePoolableConnectionFactory(到主机的TCP/IP连接失败。java.net.ConnectException:Connectiontimedout:connect) 1、网络配置tcp/IP没有打开2、防火墙3、连接地址写错(工程文件中数据库连接写正确了,不代表编......
  • java preHandle 拦截器 跳过某个接口
    Java拦截器preHandle方法的使用及跳过某个接口拦截器是JavaWeb开发中常用的一种技术,可以拦截用户请求并在处理请求之前进行一些操作,比如身份验证、权限控制等。在Spring框架中,使用拦截器可以很方便地实现这些功能。在拦截器的preHandle方法中,我们可以根据需要来判断是否要拦截某......
  • java parseObject修改
    JavaparseObject修改在Java编程中,我们经常需要将字符串转换为对象,或者将对象转换为字符串。这种转换的过程被称为"解析"。Java中提供了多种方式来实现解析,其中之一就是使用parseObject方法。parseObject方法的作用parseObject方法是Java中的一个静态方法,它被定义在java.text.F......
  • java po层
    JavaPO层介绍及示例代码在Java开发中,PO层(PersistenceObject,持久化对象)是指用于表示数据库中的表结构的Java类。PO层的主要作用是将数据库表的结构映射成Java对象,方便进行数据操作和传递。PO层的作用PO层是整个系统的持久化模型,用于描述数据库中的表结构。它的作用主要有以下几......
  • java opncv能提取有图像上的文字吗
    使用JavaOpenCV提取图像上的文字JavaOpenCV是一个开源计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。它可以用于各种任务,如图像处理、人脸识别、目标检测等。在本文中,我们将探讨如何使用JavaOpenCV来提取图像上的文字。安装JavaOpenCV首先,我们需要安装JavaOpenCV。......
  • java pop指令
    实现Javapop指令作为一名经验丰富的开发者,我很乐意教会你如何实现Java中的pop指令。pop指令在Java中用于从栈中弹出一个元素,并将其丢弃。下面我将详细介绍实现该指令的步骤。实现流程以下是实现Javapop指令的流程,我用表格展示了每个步骤的名称和描述,以帮助你更好地理解。......