docker运行jar jdbc无法访问呢_JVM运行时调试

当Docker内的Java应用出现性能问题,如jar通过jdbc访问数据库时CPU占用过高,可以使用top命令查看进程,通过jstack或Arthas获取堆栈信息。由于docker内可能使用openjdk而本地是Oracle HotSpot VM,jstack可能不兼容。Arthas作为替代工具,能方便地查看container内的线程堆栈,帮助定位到如resolveTimeoutRollSelectionMatch这样的问题方法。
摘要由CSDN通过智能技术生成

如果线上出现了问题,如何在JVM运行时排查问题

首先查看应用运行情况

使用top 指令查看当前应用运行情况:

52057b30fb894d66532a66b206017cbe.png

定位到 PID为27775 的进程占用CPU较高

接下来可以用

top -Hp <pid>

查看指定应用运行情况

6868f35923d4eab32d8e36861297a857.png

这里的PID指的是PID为27775的进程创建的子进程。

定位到 28021 占用 CPU 异常高

printf 0x%x 28021

将此数字转换为十六进制数 0x6d75,然后使用jstack命令

jstack 27775 > stack.log

将 堆栈日志输出到statck.log

vim stack.log

搜索 0x6d75, 可以定位到该线程的堆栈情况

"pool-12-thread-2" Id=243 cpuUsage=79% RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    ……………… 省略
      at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3008)
    ……………… 省略
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
    ……………… 省略
    at com.varena.tournament.consumer.task.MatchTask.resovleTimoutRollSelectionMatch(MatchTask.java:76)

运行时堆栈已经打印出来,可以看到此处有大量的 MySQL IO ,方法也定位到是 resovleTimoutRollSelectionMatch

到目前为止已经定位到了问题,就是这个方法导致的cpu占用高。

上面介绍的是不适用docker去部署项目可以这么排查。

实际上在执行 jstack 命令时, 会因为 docker 内使用的是 openjdk 镜像, 而本机使用的是

Oracle HotSpot VM 的不同, 导出 jstack 命令异常。

因为上述问题, 在实际操作中使用的是 Arthas 做的查看堆栈操作。

6331e2e082f30e52f57d9d0e16a4de04.png

Arthas 使用方法 (前提是使用了我封装好的镜像, 此处还没有更新到全部 Jenkins 发布脚本中, 目前dev 在用)

docker ps 查出你的应用 container id

docker exec -it {container_id} /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"

c42b2fac84dc9748577e406b26e3a15c.png

thread 命令

-n 3 打印 cpu 占用率排名前 3 的线程堆栈

$ thread -n 3
"pool-12-thread-2" Id=243 cpuUsage=79% RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    ……………… 省略
      at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3008)
    ……………… 省略
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
    ……………… 省略
    at com.varena.tournament.consumer.task.MatchTask.resovleTimoutRollSelectionMatch(MatchTask.java:76)

一样的玩法, 还是 top, top -p <pid>, H 查看 CPU 占用高的线程

注意日常观测应用的运行状态才能更好地优化应用性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值