如何监控各个线程的资源占用情况?

Posted 嵌入式大杂烩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何监控各个线程的资源占用情况?相关的知识,希望对你有一定的参考价值。

大家好,我是杂烩君。

嵌入式Linux开发中,有时候为了定位问题,需要查看某个进程的各个线程的运行情况。

例子

multi_thread.c:

左右滑动查看全部代码>>>

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// 线程名称最大长度
#define APP_THREAD_NAME_MAX_LEN     32

// 线程索引
typedef enum _app_thread_index

    APP_THREAD_INDEX_TEST0,
    APP_THREAD_INDEX_TEST1,
    APP_THREAD_INDEX_TEST2,
    APP_THREAD_INDEX_TEST3,
    APP_THREAD_INDEX_TEST4,
    APP_THREAD_INDEX_TEST5,
    APP_THREAD_INDEX_MAX
app_thread_index_e;

// 线程入口函数指针类型
typedef void *(*p_thread_fun)(void *param);

// 线程数据表
typedef struct _app_thread

    pthread_t thread_handle;
    p_thread_fun thread_entry;
    char name[APP_THREAD_NAME_MAX_LEN];
app_thread_s;

static void *test0_thread_entry(void *param);
static void *test1_thread_entry(void *param);
static void *test2_thread_entry(void *param);
static void *test3_thread_entry(void *param);
static void *test4_thread_entry(void *param);
static void *test5_thread_entry(void *param);

// 线程表
app_thread_s s_app_thread_table[APP_THREAD_INDEX_MAX] =

    0, test0_thread_entry, "test0_thread",
    0, test1_thread_entry, "test1_thread",
    0, test2_thread_entry, "test2_thread",
    0, test3_thread_entry, "test3_thread",
    0, test4_thread_entry, "test4_thread",
    0, test5_thread_entry, "test5_thread"
;

static void *test0_thread_entry(void *param)

    printf("test0_thread running...\\n");

    while (1)
    
        usleep(2 * 1000);
    
    
    return NULL;


static void *test1_thread_entry(void *param)

    printf("test1_thread running...\\n");

    while (1)
    
        usleep(2 * 1000);
    
    
    return NULL;


static void *test2_thread_entry(void *param)

    printf("test2_thread running...\\n");

    while (1)
    
        usleep(2 * 1000);
    
    
    return NULL;


static void *test3_thread_entry(void *param)

    printf("test3_thread running...\\n");

    while (1)
    
        usleep(2 * 1000);
    
    
    return NULL;


static void *test4_thread_entry(void *param)

    printf("test4_thread running...\\n");

    while (1)
    
        usleep(2 * 1000);
    
    
    return NULL;


static void *test5_thread_entry(void *param)

    printf("test5_thread running...\\n");

    while (1)
    
        usleep(2 * 1000);
    
    
    return NULL;
;

static int create_all_app_thread(void)

    int ret = 0;

    for (int i = 0; i < APP_THREAD_INDEX_MAX; i++)
    
        ret = pthread_create(&s_app_thread_table[i].thread_handle, NULL, s_app_thread_table[i].thread_entry, NULL);

        if (0 != ret)
        
            printf("%s thread create error! thread_id = %ld\\n", s_app_thread_table[i].name, s_app_thread_table[i].thread_handle);
            return ret;
        
        else
        
            printf("%s thread create success! thread_id = %ld\\n", s_app_thread_table[i].name, s_app_thread_table[i].thread_handle);
            pthread_setname_np(s_app_thread_table[i].thread_handle, s_app_thread_table[i].name);
        

        pthread_detach(s_app_thread_table[i].thread_handle);
    

    return ret;


int main(int argc, char **argv)
 
    create_all_app_thread();
    
    while (1)
    
        usleep(2 * 1000);
    

    return 0;

我们可以通过top命令来查看。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。

这里我们指定查看multi_thread进程的各线程运行情况,命令:

top -H -p `pidof multi_thread`

注意:

这里的 `号并不是单引号!!!

这里的 `号并不是单引号!!!

这里的 `号并不是单引号!!!

这个符号在键盘上感叹号!键的左边。

我们先运行程序,再使用top命令查看,如:

注意,我们创建线程的时候需要使用 pthread_setname_np 函数设置线程的名字,否则top -H显示不出来具体的线程。

假如我们把上例中的pthread_setname_np屏蔽掉,结果如:

可见,不调用pthread_setname_np设置线程名称的话,top -H查看得到的各线程名称就是进程名。

以上本次的分享,期待大家的三连支持!

注意

由于微信公众号近期改变了推送规则,为了防止找不到,可以星标置顶,这样每次推送的文章才会出现在您的订阅列表里。

猜你喜欢:

分享一种灵活性很高的协议格式(附代码例子)

嵌入式大杂烩周记 | 第 16 期

嵌入式大杂烩周记 | 第 15 期

访问非法内存为什么不会出错?

嵌入式大杂烩周记 | 第 14 期

分享几个实用的代码片段(第二弹)

分享一种你可能不知道的bug定位方法

分享一种修改配置文件的方法

《嵌入式大杂烩周记第 13 期:lz4》

《嵌入式并行多线程处理器,了解一下!》

《分享一种修改配置文件的方法》

《分享几个实用的代码片段(附代码例子)》

《废旧板子再利用:搭建无线调试环境!》

《嵌入式段错误的3种调试方法汇总!》

《简说TCP通信非阻塞接收(附代码例子)》

《TCP通信常用接口的使用封装》

《写国际化的嵌入式代码,时间问题如何处理?》

《Linux命令行万能解压命令》

《嵌入式软件中,总线错误的坑?替大家先踩一步》

《分享嵌入式软件调试方法及几个有用的工具!》

《分享两点提高编程能力的建议!》

在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总

以上是关于如何监控各个线程的资源占用情况?的主要内容,如果未能解决你的问题,请参考以下文章

如何监控各个线程的资源占用情况?

如何查看linux系统的资源占用情况

如何监控 Tomcat 的内存占用情况

如何使用JDK自带jvisualvm监控工具

如何用java代码来监控系统内存·cpu·线程占用情况,并生成日志

Linux系统监控命令及如何定位到Java线程