Docker 鏡像,dump openjdk-alpine 鏡像容器中的 jvm

默認狀況下,咱們使用的都是 jre 版本的 openjdk,當容器啓動卡住不動的時候,看不出來任何問題。java

此時若是能 dump 就能知道線程在幹啥,也能找到一些大概的問題。面試

此時 jre 版本的鏡像就不夠用了。docker

切換 jre 爲 jdk 版本

只切換爲 jdk 還不夠,還會遇到 Unable to get pid of LinuxThreads manager thread 的錯誤。apache

建立能夠 dump 用的基礎鏡像

參考前面文章,建立以下鏡像:架構

FROM openjdk:8u191-jdk-alpine3.9
RUN apk add --no-cache tini
ENTRYPOINT ["tini"]

修改項目使用的鏡像和啓動方式

假設上面建立的鏡像名爲 openjdk:8u191-jdk-alpine3.9-tini併發

FROM openjdk:8u191-jdk-alpine3.9-tini
COPY app.jar /opt/dubbo-app/app.jar
WORKDIR /opt/dubbo-app
EXPOSE 20880
ENTRYPOINT ["/sbin/tini", "--", "java", "-jar", "app.jar"]

啓動鏡像後進入容器

  1. jps 查看 pid
  2. jstack -l pid 查看線程信息

關於這次 BUG

通過查看堆棧和代碼,發現是 Dubbo 鏈接 zookeeper 時,用了 CountDownLatch ,因爲經過環境變量配置的 ZOOKEEPER 地址中,環境變量名居然配錯了,致使 zookeeper 一直鏈接不上,所以鎖死了主線程。app

實際上這裏沒有添加 timeout 也是 Dubbo 2.7.1 的一大 BUG。分佈式

dubbo 2.7.1 有不少嚴重 BUG,並且修復和發佈的週期特別的長,必定要慎用。微服務

主線程堆棧信息:高併發

"main" #1 prio=5 os_prio=0 tid=0x00005592eb0f1000 nid=0x9 waiting on condition [0x00007fda15afd000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000f885dac0> (a java.util.concurrent.CountDownLatch$Sync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
    at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
    at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration.<init>(ZookeeperDynamicConfiguration.java:64)
    at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfigurationFactory.createDynamicConfiguration(ZookeeperDynamicConfigurationFactory.java:38)
    at org.apache.dubbo.configcenter.AbstractDynamicConfigurationFactory.getDynamicConfiguration(AbstractDynamicConfigurationFactory.java:33)
    - locked <0x00000000f885db68> (a org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfigurationFactory)
    at org.apache.dubbo.config.AbstractInterfaceConfig.getDynamicConfiguration(AbstractInterfaceConfig.java:275)
    at org.apache.dubbo.config.AbstractInterfaceConfig.prepareEnvironment(AbstractInterfaceConfig.java:250)
    at org.apache.dubbo.config.AbstractInterfaceConfig.startConfigCenter(AbstractInterfaceConfig.java:240)
    at org.apache.dubbo.config.AbstractInterfaceConfig.lambda$null$7(AbstractInterfaceConfig.java:584)
    at org.apache.dubbo.config.AbstractInterfaceConfig$$Lambda$218/1961945640.get(Unknown Source)
    at java.util.Optional.orElseGet(Optional.java:267)

 

對應代碼截圖以下:

獲取資料

本次給你們推薦一個免費的學習羣,裏面歸納Java架構/分佈式/微服務/docker/高性能高併發以及面試資源等。
對Java架構感興趣的程序猿,歡迎加入Q羣:790047143,無論你是剛入行得仍是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時天天更新視頻資料。 最後,祝你們早日學有所成。

相關文章
相關標籤/搜索