我在java中测试我的服务器,并监视它的cpu使用情况。 首先我使用top命令,它显示如下:
然后,我使用命令
ps -C java -L -o pcpu,cpu,nice,state,cputime,pid,tid |分类 显示所有java线程
第一列是每个线程的cpu使用情况。
我刚刚发现最高使用率仅为0.3且所有cpu使用量总和远低于31.6。
我希望有人可以告诉我为什么,THKS
编辑:
要查看更多信息,我使用top -Hp 1234(1234是我的java pid) 我突然发现存在一个java线程(pidis 1238),其中cpu的用法通常会突然提升到10-20甚至更多,我认为这是值得责备的。
然后我用
jstack 1234 | grep 4d6 -A 30
查看该主题的更多细节,它向我展示:
" VM Thread" prio = 10 tid = 0x00007ff6ec060000 nid = 0x4d6 runnable
" VM周期性任务线程" prio = 10 tid = 0x00007ff6ec091800 nid = 0x4dd 等待条件
JNI全球参考:262
我希望你能帮我分析一下。
答案 0 :(得分: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-loops中并且没有打印will sleep now
,%CPU
的值就非常高(大约100)。当Java进程达到Thread.sleep
时,%CPU
的值将不断减少(在此示例中)。