美文网首页
linux下如何定位CPU过高问题

linux下如何定位CPU过高问题

作者: 小怪兽狂殴奥特曼 | 来源:发表于2019-03-16 17:28 被阅读0次

linux下如何定位CPU过高问题

1 先查看进程pid

ps aux | grep xxx

2 查看线程占用率情况

top -H -p pid
linux中的线程是一个轻量级进程,每个线程都有自己的pid。执行这个命令后可以看出占用率最高的线程的PID。
单看进程pid我们很难知道我们代码中的哪个线程出了问题,我们可以利用prctl(PR_SET_NAME, "xxx")给线程起名。至此我们通过线程名,大概可以猜到问题出现在哪个线程了。
然而还不够。

3 分析出问题的接口

strace -f -p PID
或者pstack PID
PID为上面的命令查看到的占用CPU最高的线程的PID。
之后可以看出调用最频繁的接口。

举个例子吧。这是一段C代码。

#include <pthread.h>
#include <stdio.h>
#include <sys/prctl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/syscall.h>

void *thread_hndl1(void *arg)
{
        prctl(PR_SET_NAME, "thread_1");
        printf("i am thread_1 tid=0x%lx, pid=%d\n", 
              pthread_self(), syscall(SYS_gettid));
        while(1)
        {
                usleep(10);
        }
}
void *thread_hndl2(void *arg)
{
        prctl(PR_SET_NAME, "thread_2");
        printf("i am thread_2 tid=0x%lx, pid=%d\n", 
                    pthread_self(), syscall(SYS_gettid));
        while(1)
        {
                sleep(1);
        }
}

int main()
{
        pthread_t pid1,pid2;
        pthread_create(&pid1, NULL, thread_hndl1, NULL);
        pthread_create(&pid2, NULL, thread_hndl2, NULL);
        pthread_join(pid1, NULL);
        pthread_join(pid2, NULL);
}

先编译上面代码。

gcc -g -o debug_thread_mode debug_thread_mode.c -lpthread

运行程序

./debug_thread_mode

新开一个窗口,先查看debug_thread_mode的进程PID

ps aux | grep debug_thread_mode
捕获.PNG

进程号是21308,接着执行

top -H -p 21308
捕获2.PNG

PID为21309,名字为thread_1(上面用prctl设置的)的线程cpu占用率最高。
接着执行

watch -n 1 pstack 21309

输出


捕获3.PNG

问题大概出在nanosleep()接口
进一步验证,执行如下命令

strace -f -p 21309

输出


捕获4.PNG

验证我们的猜想。

相关文章

  • linux下如何定位CPU过高问题

    linux下如何定位CPU过高问题 1 先查看进程pid 2 查看线程占用率情况 top -H -p pidlin...

  • 如何定位java进程cpu占用过高

    如何定位java进程cpu占用过高 如何定位java进程cpu占用过高,分三步走 根据cpu消耗,打印出pid进程...

  • 定位CPU过高问题

    首先,自己写一个死循环模拟cpu过高场景 执行 top -c 命令,查看占用cpu最高的进程image.png可以...

  • Linux 下 CPU 过高的问题排查方法

    查找进程中占用cpu的线程 查看异常线程 top -H -p 进程号 top -H -p 10193 2.将异常线...

  • 线上服务器CPU突然占用率高,如何排查

    如果线上服务器发生CPU占用率过高的问题时,应该如何排查并定位问题。 1 问题发现 本文整理自一个真实的案例,是楼...

  • 排查CPU磁盘等问题

    排查CPU问题 1.top -H 定位进程,确定是否是java进程占用CPU过高2.top -H -p 6610 ...

  • 2019-08-14

    上午协助定位抽取器工程运行时cpu占用过高的问题,发现运行时大量加载本地大文件并实时解析,且消耗cpu过高,建议开...

  • 服务器CPU负载过高,如何定位问题

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。CPU负载过高解决问题过程: 使用...

  • cpu使用率过高问题定位

    top命令分析进程的CPU使用率执行top -c ,显示进程运行信息列表,可以看到每个进程的CPU使用率键入大写P...

  • cpu占用率过高问题定位

    找到进程top -c 显示进程详细信息(包含了运行参数)的列表键入大写P,按照cpu使用率排序 找到该进程中最耗C...

网友评论

      本文标题:linux下如何定位CPU过高问题

      本文链接:https://www.haomeiwen.com/subject/ccvsmqtx.html