【问题标题】:java server cpu usage monitor in linuxlinux中的java服务器cpu使用监控
【发布时间】:2016-01-22 09:11:13
【问题描述】:

我用 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 (1234is my java pid) 我突然发现有一个java线程(pidis 1238),cpu使用率通常突然提升到10-20甚至更多,我认为应该归咎于此。

然后我使用

jstack 1234 |grep 4d6 -A 30

查看线程的更多细节,它向我展示了:

“VM 线程”prio=10 tid=0x00007ff6ec060000 nid=0x4d6 可运行

“VM 周期性任务线程”prio=10 tid=0x00007ff6ec091800 nid=0x4dd 等待条件

JNI 全局引用:262

希望你能帮我分析一下。

【问题讨论】:

  • 尝试使用htop获取详细信息
  • THKS 回答,我已经安装并习惯了 htop,但它没有解决我的问题,我想要查看每个 java 线程的 cpu 使用情况,因为在我的监视器中它显示太高了,但是我被告知每个java线程的java cpu使用率都低于0.3%。
  • 因为线程列表是由ps 在与总和值(31.6)不同的时刻输出的。两者不匹配。
  • Thks,没错,我发现有一个java线程,它的cpu使用率突然上升到10-20%,我认为应该怪这个线程,我在我的问题中添加了详细信息,希望您能提供更多帮助
  • 使用Linux小工具“threadcpu”可以帮你列出CPU使用率高的线程。它通过使用测量间隔而不是通过从流程开始计算所有 jiffies 来做到这一点。 tuxad.com/blog/archives/2018/10/01/…

标签: java linux cpu


【解决方案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 的值将不断减小(在本例中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多