如何在 Linux 上查找哪个线程cpu利用率最高?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在 Linux 上查找哪个线程cpu利用率最高?相关的知识,希望对你有一定的参考价值。

参考技术A 可以用 top 命令看
1.找出cpu耗用厉害的进程pid, 终端执行top命令,然后按下shift+p (shift+m是找出消耗内存最高)查找出cpu利用最厉害的pid号
2.根据上面第一步拿到的pid号,top -H -p pid 。然后按下shift+p,查找出cpu利用率最厉害的线程号,比如top -H -p 1328
3.将获取到的线程号转换成16进制,去百度转换一下就行
4.使用jstack工具将进程信息打印输出,jstack pid号 > /tmp/t.dat,比如jstack 31365 > /tmp/t.dat
5.编辑/tmp/t.dat文件,查找线程号对应的信息

嵌入式软件开发杂谈:如何查找CPU使用率最高的函数---pref的使用

在前面文章《嵌入式软件开发杂谈(5):线程的CPU使用率》中简单介绍了如何查看线程的CPU使用率,那么问题来了,知道了某个进程或者线程的CPU使用率,那么如何知道是那个函数导致的CPU使用率升高呐?

最方便的方法是使用perf工具,perf是一款性能分析工具,不仅可以用来分析系统全局性性能,还可以Fenix进程线程级别的性能,甚至到函数以及汇编级别,这里不介绍perf的用法,有兴趣的可以百度下。

参考前面文章的代码,测试代码如下:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <math.h>

int test_sqrt()

	double value = 0;
	int i = 0;
	
	for (i = 0; i < 1000000; i++)
		value += sqrt(i*i*i*i);
	
	return 0;


void* thread11(void* arg)
	
	printf("----->thread11\\n");
	prctl(PR_SET_NAME, "thread11");
	
    while(1)
	
		test_sqrt();
        sleep(1);
    


void* thread12(void* arg)

	printf("----->thread12\\n");
	prctl(PR_SET_NAME, "thread12");
	
    while(1)
	
        usleep(1);
    


void* thread13(void* arg)

	printf("----->thread13\\n");
	prctl(PR_SET_NAME, "thread13");
	
    while(1)
	
        usleep(100);
    


int main()
 
	pthread_t thread[3];
	int s32Ret = 0;
	
	s32Ret = pthread_create(&thread[0], NULL, thread11, NULL);		
	printf("pthread_create, ret:%d\\n", s32Ret);
	sleep(1);
	
	s32Ret = pthread_create(&thread[1], NULL, thread12, NULL);			
	printf("pthread_create, ret:%d\\n", s32Ret);
	sleep(1);
	
	s32Ret = pthread_create(&thread[0], NULL, thread13, NULL);		
	printf("pthread_create, ret:%d\\n", s32Ret);
	sleep(1);

	while(1)
	
		sleep(1);
	
	
	return 0;

将其编译并生成可执行文件test,并执行

我们使用perf top指令,可以查看占用CPU时钟最多的函数或指令,如下

上面字段中的Overhead表示该Symbol事件在所有采样中的比例,可以看到进程test 中的test_sqrt 占用的采样数比例较高。

我们可以单独分析进程test这个进程的情况,使用下面指令:

#perf top -g -p 841

-g 表示开启调用关系分析 -p 指定某个进程号 841为test的进程号

如上,为详细的信息,我们可以使用“方向键”选择test_sqrt,然后再按下“回车键”查看调用关系

如上,可以看到thread11中的test_sqrt函数占用的比例较高

以上是关于如何在 Linux 上查找哪个线程cpu利用率最高?的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式软件开发杂谈:如何查找CPU使用率最高的函数---pref的使用

嵌入式软件开发杂谈:如何查找CPU使用率最高的函数---pref的使用

Linux 环境下如何查找哪个线程使用 CPU 最长?

查看JAVA进程中哪个线程CPU消耗最高

linux单进程如何实现多核cpu多线程分配?

在Linux中通过Top运行进程查找最高内存和CPU使用率