linux里查看最耗CPU的线程

本文介绍了一种通过top和jstack命令组合使用的方法,来找出Java进程中CPU占用最高的线程及其具体信息。

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

<think>好的,我现在需要回答用户关于如何在Linux系统中查看逻辑CPU线程数的问题。首先,我要回忆一下Linux查看CPU信息的常用命令和相关文件。 用户提到的是逻辑CPU线程数,这通常指的是操作系统可见的处理器数量,包括物理核心和超线程技术产生的虚拟核心。我记得在/proc/cpuinfo文件中存储了CPU的详细信息,可以通过读取这个文件来获取逻辑CPU的数量。比如,使用grep命令搜索'processor'条目,然后统计出现的次数,就能得到逻辑CPU的数量。命令应该是这样的:grep -c 'processor' /proc/cpuinfo,或者用cat /proc/cpuinfo | grep processor | wc -l。这两个命令的效果是一样的,都是统计逻辑CPU的数量。 另外,lscpu命令也是一个常用的工具,它会汇总CPU架构的信息,包括逻辑CPU的数量。直接运行lscpu,在输出中找到“CPU(s):”那一行,对应的数值就是逻辑CPU线程数。这个方法可能更直观,因为信息已经整理好了,用户不需要自己去处理文本。 还有nproc命令,这个命令直接返回可用的处理单元数目,也就是逻辑CPU的数量。执行nproc会直接输出一个数字,非常简洁,适合需要快速获取结果的情况。 用户的问题可能还涉及到物理CPU、核心数、线程数的区别。比如,物理CPU指的是实际插在主板上的CPU芯片数量;每个物理CPU可能有多个核心,而每个核心又可能通过超线程技术分成多个逻辑处理器。因此,逻辑CPU的总数是物理CPU数乘以每个CPU的核心数,再乘以每个核心的线程数。不过,用户现在只需要逻辑CPU线程数,所以不需要深入讨论这些细节,但可能需要简要说明这些概念的区别,以防用户混淆。 需要验证这些命令的正确性。比如,在/proc/cpuinfo中,每个processor条目代表一个逻辑CPU,所以统计processor的数量就是逻辑线程数。而lscpu的输出中,CPU(s)那一行显示的也是逻辑CPU的总数。nproc的结果同样如此。这些都是可靠的方法,应该不会有错。 另外,用户可能还关心如何查看其他相关的CPU信息,比如物理核心数、是否启用超线程等。虽然当前问题不涉及这些,但可以稍微提及,作为扩展信息。例如,使用lscpu还可以看到每个核心的线程数(Thread(s) per core),从而判断是否开启了超线程。如果这个数值是2,说明每个核心有两个线程,即超线程已启用。 总结一下,回答中需要包含三个主要命令:查看/proc/cpuinfo、使用lscpu、使用nproc,并解释每个命令的用途和输出结果的含义。同时,区分逻辑CPU与其他相关概念,确保用户明白他们获得的信息是什么。 后,生成相关问题,帮助用户进一步了解CPU信息查看的其他方面,比如如何查看物理CPU数量、如何判断超线程是否启用等。这些问题可以引导用户深入学习,满足他们潜在的需求。</think>在Linux系统中查看逻辑CPU线程数可通过以下三种常用方法实现: 1. **/proc/cpuinfo文件解析** ``` grep -c '^processor' /proc/cpuinfo ``` 该命令统计`/proc/cpuinfo`中`processor`字段数量,直接输出逻辑CPU总数[^1][^2]。 2. **lscpu命令** ``` lscpu | grep '^CPU(s):' ``` 输出结果中的`CPU(s)`数值即为逻辑处理器总数,该命令同时显示物理核数、Socket数量等详细信息。 3. **nproc命令** ``` nproc --all ``` 直接返回系统可用逻辑CPU数量,结果简洁[^2]。 **逻辑CPU概念说明**:逻辑CPU包含物理核心与超线程虚拟核心,例如一个4核CPU开启超线程后可能显示8个逻辑CPU
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值