Linux 线程占用CPU过高定位分析

今天朋友问我一个Linux程序CPU占用涨停了,该如何分析,

CPU占用过高,模拟CPU占用过高的情况

先上一段代码:

 1 #include <iostream>
 2 #include <thread>
 3 #include <vector>
 4
 5
 6 int main(int argc, char **argv) {
 7
 8     std::vector<std::thread> test_threads;
 9     for(int i = 0; i < 9; i++){
10       test_threads.push_back(std::thread([]{
11     while(1){
12       std::this_thread::sleep_for(std::chrono::milliseconds(500));
13     }
14       }));
15     }
16     test_threads.push_back(std::thread([]{
17       while(1){
18       std::cout<<"cpu"<<std::endl;
19       }
20     }));
21
22     for(auto &x : test_threads){
23       x.join();
24     }
25
26     return 0;
27 }

第10个线程中没有进行睡眠,会独占进程的时间片,导致CPU利用率过高,

现在就要定位到第10个

第一步:top 查看程序进程id

第二步:top -H -p 96263 定位CPU占用过高的线程id

第三步:使用pstack 96263或者strace -f -p 96263 定位线程堆栈

strace -f -p 96263

原文地址:https://www.cnblogs.com/Forever-Kenlen-Ja/p/8618102.html

时间: 2024-08-29 18:01:51

Linux 线程占用CPU过高定位分析的相关文章

Java虚拟机六:Java进程占用cpu过高问题分析

在平时开发过程中,经常会碰到Java进程占用cpu过高的现象,本篇将简单记录一下自己分析该类问题的步骤. 1.使用 top -p <pid> 命令(<pid>为Java进程的id号)查看Java进程的cpu占用: 该Java进程占用cpu达到92.2%. 2.使用 top -Hp <pid>  命令(<pid>为Java进程的id号)查看该Java进程内所有线程的资源占用情况(按shft+p按照cpu占用进行排序,按shift+m按照内存占用进行排序)此处按

linux 分析进程占用CPU过高

重点是查看进程的线程中,哪个线程占用cpu过高,然后用gdb附加到进程,调试线程,看是否有死循环或者死锁等问题,步骤如下: 1 先用ps + grep找出该死的进程pid,比如 1706 2 top -H -p 1706,(top然后shift+H可以看出某个线程,左上角有提示:thread on 则为可查看线程)所有该进程的线程都列出来, 看看哪个线程pid占用最多,记下对应的线程号,如:1723 gdb attach 到进程号码(1706) (仍然在gdb中) info threads 结果

Linux排查java程序占用cpu过高的线程代码

分几步骤: 1.通过top,查出占用CPU过高的java进程 ,比如: pid :6666 2.通过ps -mp 6666 -o THREAD,tid,time| sort -n -k1 -r 查看此进程占用线程的情况,比如查到占用CPU异常高的线程的线程Id :8888 以上两步,可以直接通过top -H搞定 3.将需要的线程ID转换为16进制格式: printf “%x\n” 8888 [[email protected]]# printf “%x\n” 8888“22b8n” 4.最后打印

Linux排查Java程序占用CPU很高的解决办法

Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意设置了一个CPU占用很高的场景: 排查问题,步骤: 1. ps -mp [替换为进程ID PID] -o THREAD,tid,time 发现线程6322.6323占用CPU很高,时间也很长. 2. printf “%x” [线程ID TID] 把TID转换为16进制. 3. jstack [进程I

[转]生产环境中程序占用cpu过高的程序的排查办法

一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环.以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题. 根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障. 通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题.但是,怎么定位到具体线程或者代码呢? 首先显示线程列表: ps -mp pid -o THREAD,tid,time 找到了耗时最高的线程28802,占用CPU时间快两个小时了!

w3wp占用CPU过高

w3wp占用CPU过高 在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记录的更全面些. 上两次的博文链接:记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全).EntityFramework中的线程安全,又是Dictionary. 首先请大家不要喷我,因为这一次还是关于Dictionary的一些低级错误,我自己看到都无语了..

用windbg+sos找出程序中谁占用内存过高,谁占用CPU过高(转载)

原文地址: http://www.cnblogs.com/Lawson/archive/2011/01/23/1942692.html 很早看到windbg+sos方面的知识,一直没仔细学习,也许因为自己做的系统还不够复杂,也没线上真实环境查看的权限,一直没学习这方面的知识,最近几天仔细找了这方面的资料,自己也写了个可能造成高CPU高内存的测试web页面,发现确实不错,即使一个生手,也可以用工具连蒙带骗的猜出哪里出了问题,当然对一些命令和内部标示更熟悉了后,可以更好的找出问题所在,非常值得学习.

tomcat占用cpu过高解决办法

在工作中经常遇到tomcat占用cpu居高不下,针对这种情况有以下处理办法进行排查. jps --> 查看java的进程 top -Hp pid --> 根据jps得到的进程号(pid),查看java进程的所有线程,并且可以看到所有线程占用CPU的情况,-H用于显示某个进程的所有线程. printf "%x\n" 9733 -->将第2步查到占用较高CPU的线程号转换为16进制,以便于jstack查看 jstack pid | grep 2605 --> 260

linux 线程与CPU绑定

看到很多程序都是根据CPU个数来创建线程个数,当时很不理解他们之间的关系,咨询了项目组的同事后才有了大致了解.  1. 相关系统函数 下面的函数可以通过man命令查询到. SYNOPSIS #define _GNU_SOURCE #include <pthread.h> int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset); int pthread_getaffinity