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

  • 相关阅读:
    【数据库】-数据库显示不允许保存更改
    C#编程:从控制台读取数字的两种方式
    【终结版】C#常用函数和方法集汇总
    运行supervisord -c /etc/supervisor/supervisord.conf 出错,解决办法
    supervisord监控服务必备命令
    【持续更新中···】Linux下的小技巧
    运行supervisorctl reload报错解决方法
    ASP.NET Core 发布 centos7 配置守护进程
    【C++】std::是什么?
    DNS查询相关
  • 原文地址:https://www.cnblogs.com/wx170119/p/12445396.html
Copyright © 2011-2022 走看看