zoukankan      html  css  js  c++  java
  • docker容器中进行Threaddump查看jvm状态

    前言

    在执行性能测试时需要导出Threaddump,程序运行在Docker容器中,在容器外不能直接使用jcmd 命令和jstack命令进行dump操作,会提示没有该命令,执行yum安装也不行。

    解决办法:

    查看正在运行的容器id
    执行命令:docker ps

    查到的docker容器id如下

    使用docker exec进入Docker容器,命令如下:
    docker exec -it 29198c060396 /bin/sh


    运行jps,已经能看到刚才启动的spring boot应用了

    这时就可以使用jstat,jmap等根据进程id查看程序状态了,以下是我运行jstack查看的堆栈信息


    导出jmap dump的文件,进一步分析,copy docker中的文件到宿主机,命令如下
    docker cp 29198c060396:/logs/d.20170726.txt .

    d.20170726.txt 是我刚才用jmap -dump生成的文件

    29198c060396是docker 容器id

    在Docker中执行jstack时提示No such process,如下图:

    原因分析:

    docker中不能直接使用宿主机上的进程ID

    解决方法:

    docker container内进程信息,与宿主机上进程信息的映射关系,可以使用docker top查看宿主机与Docker中进程的对应关系,具体操作如下:

    1. 找到容器的id

    docker ps

    2. 找到容器在宿主机上映射后的进程信息

    docker top 9b40a74ceb82(容器id)

    就会得到类似下面的信息,其中PID是容器内进程在宿主机上的pid,ppid是容器内进程在宿主机上的父进程pid

    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                9849                1611                0                   Mar07               ?                   00:00:00            bash /usr/bin/start

    找到对应的容器内PID后就可以使用JStack进行Thread dump操作


    参考资料:

    https://blog.csdn.net/longxing_123/article/details/76163980

    https://blog.csdn.net/micklf/article/details/79563869

  • 相关阅读:
    使用 requests 维持会话
    使用 requests 发送 POST 请求
    使用 requests 发送 GET 请求
    requests 安装
    使用 urllib 分析 Robots 协议
    使用 urllib 解析 URL 链接
    使用 urllib 处理 HTTP 异常
    使用 urllib 处理 Cookies 信息
    使用 urllib 设置代理服务
    按单生产程序发布
  • 原文地址:https://www.cnblogs.com/wx170119/p/12445396.html
Copyright © 2011-2022 走看看