2016-01-22 117 views
1

我在java中測試我的服務器,並監視它的CPU使用情況。 首先,我使用top命令,它告訴我,如下所示:在linux中的java服務器CPU使用情況監視器

enter image description here

然後,我用命令

PS -C的Java -1-鄰PCPU,CPU,美觀大方,狀態,cputime,pid,tid |排序 來顯示所有的Java線程

enter image description here

第一列是每個線程的CPU使用情況。

我剛剛發現最高使用率僅爲0.3,所有cpu使用量總和遠低於31.6。

我希望有人能告訴我爲什麼,THKS

編輯:

要了解更多信息,我用頂部-Hp 1234(1234is我的Java PID) ,我突然發現了存在java線程(pidis 1238)和CPU使用率通常突然提升到10-20甚至更多,我認爲這是應該受到指責的。

然後我用

jstack 1234 | grep的4D6 -A 30

看到線程的更多細節,而事實證明,我說:

「VM主題「prio = 10 tid = 0x00007ff6ec060000 nid = 0x4d6 runnable

」VM週期性任務線程「prio = 10 tid = 0x00007ff6ec091800 n ID = 0x4dd 等待條件

JNI全局引用:262

我希望你可以幫我分析一下。

+0

嘗試使用'htop'獲取詳細信息 –

+0

THKS for answer,我已經安裝並習慣了htop,但是它並沒有解決我的問題,我想要的是看到每個java線程的CPU使用情況,因爲在我的顯示器顯示得太高,但我得到每個java線程的java cpu使用率都低於0.3%。 –

+0

因爲線程列表在不同於總和值(31.6)的時刻由'ps'輸出。兩者不匹配。 –

回答

1

也許對pcpu值有誤解。從man ps

CPU使用率目前表現爲時間的百分比花了過程的整個生命週期內運行。這並不理想,並且不符合ps另外符合的標準。 CPU使用率不太可能精確到100%。

如果進程啓動並且CPU利用率很高,那麼%CPU的值很高。當相同的進程稍後CPU利用率較低或處於睡眠狀態時,此值會降低。 %CPU代表cputime/realtime ratio

作爲一個小例子

class Loop { 
    public static void main(String...args) throws Exception { 
     long l = 0; 
     for (int i = 0; i >= 0; i++) { 
      for (int j = 0; j < 50; j++) { 
      l++; 
      } 
     } 
     System.out.println("will sleep now"); 
     Thread.sleep(30_000); 
    } 
} 

開始在下面的命令一個會話,這將監視處理在一秒的間隔。

watch -n 1 ps -C java -o pcpu,state,cputime,etimes 

現在在另一個會話中運行示例代碼。

只要Java代碼在foo循環中並且未打印will sleep now%CPU的值非常高(約爲100)。當Java進程達到Thread.sleep時,%CPU的值將不斷減少(在此示例中)。

相關問題