2016-01-22 77 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的值将不断减少(在此示例中)。

相关问题