linux里查看最耗CPU的线程

69 篇文章 1 订阅

1、top后按c查看最耗cpu的进程,得到pid

2、top -Hp pid 查看该进程里的线程资源使用情况,找到最耗资源的线程的pid

3、jstack pid来查看进程的各个线程栈,注意这里的pid是第一步中进程的pid,不是第二步得到的线程id

4、将第二步得到的pid转成16进制之后在线程栈信息里查找nid等于pid16进制的,就找到最耗资源的线程的栈信息

 

话不多说了,先来看代码吧

public class Test{
        public static void main(String args[]){
                for(int i=0;i<10;i++){
                        new Thread(){
                                public void run(){
                                        try{
                                                Thread.sleep(100000);
                                        }catch(Exception e){}
                                }
                        }.start();
                }
                Thread t=new Thread(){
                        public void run(){
                                int i=0;
                                while(true){
                                        i=(i++)/100;
                                }
                        }
                };
                t.setName("Busiest Thread");
                t.start();
        }
}

这个例子里新创建了11个线程,其中10个线程没干什么事,主要是sleep,另外有一个线程在循环里一直跑着,可以想象这个线程是这个进程里最耗cpu的线程了,那怎么把这个线程给抓出来呢?

首先我们可以通过top -Hp <pid>来看这个进程里所有线程的cpu消耗情况,得到类似下面的数据

$ top -Hp 18207
top - 19:11:43 up 573 days,  2:43,  2 users,  load average: 3.03, 3.03, 3.02
Tasks:  44 total,   1 running,  43 sleeping,   0 stopped,   0 zombie
Cpu(s): 18.8%us,  0.0%sy,  0.0%ni, 81.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  99191752k total, 98683576k used,   508176k free,   128248k buffers
Swap:  1999864k total,   191064k used,  1808800k free, 17413760k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18250 admin     20   0 26.1g  28m  10m R 99.9  0.0   0:19.50 java Test
18207 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18208 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.09 java Test
18209 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18210 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18211 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18212 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18213 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18214 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18215 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18216 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18217 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18218 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18219 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18220 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18221 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18222 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18223 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18224 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18225 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18226 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18227 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test

拿到这个结果之后,我们可以看到cpu最高的线程是pid为18250的线程,占了99.8%:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18250 admin     20   0 26.1g  28m  10m R 99.9  0.0   0:19.50 java Test

接着我们可以通过jstack <pid>的输出来看各个线程栈:

$ jstack 18207
2016-03-30 19:12:23
Full thread dump OpenJDK 64-Bit Server VM (25.66-b60 mixed mode):

"Attach Listener" #30 daemon prio=9 os_prio=0 tid=0x00007fb90be13000 nid=0x47d7 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"DestroyJavaVM" #29 prio=5 os_prio=0 tid=0x00007fb96245b800 nid=0x4720 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000]
   java.lang.Thread.State: RUNNABLE
    at Test$2.run(Test.java:18)

"Thread-9" #27 prio=5 os_prio=0 tid=0x00007fb91498c800 nid=0x4749 waiting on condition [0x00007fb906bfe000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at Test$1.run(Test.java:9)

"Thread-8" #26 prio=5 os_prio=0 tid=0x00007fb91498b800 nid=0x4748 waiting on condition [0x00007fb906ffe000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at Test$1.run(Test.java:9)

"Thread-7" #25 prio=5 os_prio=0 tid=0x00007fb91498b000 nid=0x4747 waiting on condition [0x00007fb9073fe000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at Test$1.run(Test.java:9)

"Thread-6" #24 prio=5 os_prio=0 tid=0x00007fb91498a000 nid=0x4746 waiting on condition [0x00007fb9077fe000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at Test$1.run(Test.java:9)
...

上面的线程栈我们注意到nid的值其实就是线程ID,它是十六进制的,我们将消耗cpu最高的线程18250,转成十六进制0X47A,然后从上面的线程栈里找到nid=0X47A的线程,其栈为:

"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000]
   java.lang.Thread.State: RUNNABLE
    at Test$2.run(Test.java:18)

即将最耗cpu的线程找出来了,是Businest Thread

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要查看Linux系统中的CPU线程数,可以使用以下命令: 1. 使用lscpu命令查看CPU信息,包括CPU核心数、线程数等信息。 2. 使用cat /proc/cpuinfo命令查看CPU信息,其中processor字段表示CPU核心数,而siblings字段表示CPU线程数。 3. 使用nproc命令查看CPU核心数。 4. 使用top或htop命令查看CPU使用情况,其中的CPU行显示了CPU核心数和线程数。 希望能对您有所帮助! ### 回答2: 在Linux系统中,可以使用不同的命令来查看CPU线程数。 1. top命令: top命令是一种实时的系统监视器,它可以实时监控系统的CPU使用率、进程、内存、负载平均值等。在终端输入top命令后,可以看到系统的实时运行情况,其中第二行的“Tasks”项显示了系统的进程总数和线程总数。 2. lscpu命令: lscpu是一个Linux系统命令,它用于显示CPU架构信息,包括CPU型号、核数、线程数和缓存大小等。在终端输入lscpu命令后,可以看到CPU架构的详细信息,其中“Thread(s) per core”项显示了每个CPU核心的线程数。 3. /proc/cpuinfo文件: /proc/cpuinfo是一个虚拟的文件系统,在Linux系统中它存储了系统的CPU信息。可以使用命令“cat /proc/cpuinfo”打印出该文件内容,其中每个处理器都有一个独立的区域,其中Thread(s)项显示了该处理器的线程数。 总结:Linux查看CPU线程数的方法有很多,包括使用top命令、lscpu命令和/proc/cpuinfo文件等。以上三种方法都是比较简单的,您可以根据自己的需要选择一种适合自己的方式来查看CPU线程数。 ### 回答3: 在Linux系统中,可以使用多种命令来查看CPU线程数,其中就包括了top命令、htop命令、lscpu命令、nproc命令、以及/proc/cpuinfo文件等。下面我们就来逐一介绍这些命令的使用方法。 1. top命令 top命令是一个非常常用的Linux系统命令,它可以用于查看系统中CPU、内存等各种资源的使用情况。在top命令的输出结果中,包含了每个CPU核心的线程数。输入top命令后,可以按下1键,就可以看到每个CPU核心的线程数了。 2. htop命令 htop命令与top命令十分类似,也是用于查看系统资源的使用情况。不同的是,htop命令的输出结果更加详细、易读,同时还支持使用鼠标进行交互式操作。在htop命令的输出结果中,也可以很容易地看到每个CPU核心的线程数。 3. lscpu命令 lscpu命令可以用于查看CPU的相关信息,包括CPU架构、CPU核心数、线程数等等。输入lscpu命令后,可以看到类似于下面的输出结果: CPU(s): 4 Thread(s) per core: 2 Core(s) per socket: 2 Socket(s): 1 4. nproc命令 nproc命令可以用于查看当前系统中CPU核心数和线程数。输入nproc命令后,可以直接看到当前系统中的线程数。 5. /proc/cpuinfo文件 最后一个方法则是直接查看/proc/cpuinfo文件。这个文件包含了当前系统中CPU的详细信息,包括CPU型号、频率、缓存大小、核心数量、线程数等等。在这个文件中,每个CPU核心对应着一个独立的section。因此,我们可以非常简单地通过查看该文件来获取CPU线程数的信息。 总之,以上这些方法都可以用来查看Linux系统中的CPU线程数。不同的方法有各自的特点,可以根据实际情况选择合适的方法来使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值