2016-03-05 53 views
4

我一直在試圖用Docker容器化一個Java應用程序。當我讓容器以超級用戶身份運行此進程時,CPU使用率達到100%並保持在那裏。然而,以根爲主,它的表現要好得多,約佔2%。作爲非root用戶的Java進程消耗100%的CPU,但是因爲root很好

# docker run -d -p 8006:8006 -u root --name root app:latest 
# docker run -d -p 8007:8006 -u nonroot --name nonroot app:latest      
# ps aux | grep java 
root  26537 9.2 4.1 174800 115636 ?  Sl 10:14 0:02 /opt/app/jvm16/bin/java -Xmx128M -Xms128M […] 
nonroot 26808 94.8 6.2 202744 175368 ?  Sl 10:15 0:08 /opt/app/jvm16/bin/java -Xmx128M -Xms128M […] 

該應用程序的功能與root或非root用戶(未掛起)的功能相同。但是如果我在一個真實的(不在容器內)服務器上運行這個相同的應用程序,那麼對於root或非root用戶來說,CPU使用情況都很好,這暗示着與容器相關的原因。

Docker主機上沒有任何東西(我能找到)借鑑了洞察力,而容器內部的Java轉儲並沒有指向任何東西。

我的問題是:這可能是什麼解釋?

回答

4

我的問題是:對此有什麼解釋?

一個可能的解釋是,應用程序反覆嘗試JVM作爲root運行時發揮作用,並在以普通用戶方式運行時失敗;即它是設計不佳的應用和許可問題的組合。

我會嘗試以下方法,試圖找出發生了什麼事:

  • 使用jstack看什麼的線程是活動的,他們在做什麼。如果CPU是100%並且是使用CPU的JVM,則應該有活動線程。使用strace查看JVM正在執行的系統調用。
  • 查看應用程序日誌文件以及docker和其他系統日誌文件,以查看是否有任何線索。
+0

出色的工作。你是對的,我在JVM的pid上運行了一個strace -F -p,實際上,它反覆嘗試在/ tmp中創建一個文件並獲得權限被拒絕。我調整了權限並正常工作。謝謝! –