美文网首页
mac开发系列35:CPU监控

mac开发系列35:CPU监控

作者: 悲观患者 | 来源:发表于2017-08-14 14:59 被阅读277次

今天有用户反馈,在mac微信不退出的情况下,盖上电脑,发热会比较厉害,然后打开电脑,用活动监视器看到mac微信的能耗和CPU占用率都比较高。很自然的想法就是,盖上电脑期间,mac微信究竟干了什么事情,这些事情当中,又有哪些比较耗CPU?

如果是开着电脑,并且可以重现,就可以用instrument来定位耗CPU的业务代码。然而,盖上电脑没法用instrument,所以只能靠日志了。那么,日志要怎么加,才能让CPU占用率跟特定的业务代码关联起来呢?

mach内核中有数据结构记录了每个线程的CPU占用率,而堆栈调用分析框架(这里选用BSBacktraceLogger)可以打出每个线程执行的现场日志,两者结合,就是我们想要的。下面直接上代码:

    kern_return_t kr;
    task_info_data_t tinfo;
    mach_msg_type_number_t task_info_count;    
    task_info_count = TASK_INFO_MAX;
    kr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)tinfo,     &task_info_count);
    if (kr != KERN_SUCCESS) {
          return nil;
    }
    thread_array_t thread_list; // 线程数组
    mach_msg_type_number_t thread_count; // 线程数   
    thread_info_data_t thinfo;
    mach_msg_type_number_t thread_info_count;
    thread_basic_info_t basic_info_th;    
    kr = task_threads(mach_task_self(), &thread_list, &thread_count); // 获取线程列表和线程数
    if (kr != KERN_SUCCESS) {
        return nil;
    }

    NSString* backstraces = nil;// 遍历每个线程    
    for (int j = 0; j < thread_count; j++)
    {
        thread_info_count = THREAD_INFO_MAX;
        kr = thread_info(thread_list[j], THREAD_BASIC_INFO,   (thread_info_t)thinfo, &thread_info_count); //获取线程信息
        if (kr != KERN_SUCCESS) {
            return nil;
        }
        basic_info_th = (thread_basic_info_t)thinfo; // 线程基本信息,包含CPU占用率、CPU占用时间等等
        if (!(basic_info_th->flags & TH_FLAGS_IDLE)) {
            float current_thread_cpu = basic_info_th->cpu_usage / (float)TH_USAGE_SCALE * 100.0; // 当前线程的CPU占用率
            if(current_thread_cpu >= 自定义单核CPU占用率阈值){
    // 记录CPU占用率超过阈值的线程的执行堆栈
                NSString* backstrace = [BSBacktraceLogger bs_backtraceOfMachThread:thread_list[j]];
                backstraces = [NSString stringWithFormat:@"%@\n%@",     backstraces, backstrace];
            }
        }        
    }

    kr = vm_deallocate(mach_task_self(), (vm_offset_t)thread_list, thread_count * sizeof(thread_t));

    return backstraces;

这里只是抛砖引玉,有待后续深入研究。

相关文章

  • mac开发系列35:CPU监控

    今天有用户反馈,在mac微信不退出的情况下,盖上电脑,发热会比较厉害,然后打开电脑,用活动监视器看到mac微信的能...

  • Linux/windows监控磁盘IO的工具——WGCLOUD

    WGCLOUD是一款国人开源的运维监控工具,支持主机监控,ES集群监控,CPU监控,CPU温度监控,大屏展示,内存...

  • iOS学习

    【React Native 系列教程】Mac(OSX) 平台搭建 React Native 开发环境 在 Mac ...

  • dstat用法

    监控CPU\MEN: dstat --top-mem --top-io --top-cpu常用常规监控:dstat...

  • android开发之内存CPU监控

    cpu,内存监控作为android性能测试的一部分,在日常工作中使用也比较频繁,一般测试人员都是直接adb命令输出...

  • CPU监控

    adb shell dumpsys cpuinfo | findstr

  • 监控CPU

    CPU 上下文切换 根据任务的不同,CPU 的上下文切换就可以分为几个不同的场景,也就是进程上下文切换、线程上下文...

  • Linux CPU性能分析与监控——vmstat、top

    Linux性能监控工具汇总: iostat 磁盘性能监控 vmstat 虚拟内存性能监控、CPU监控(进程上...

  • 监控实例(Linux/Windows)的CPU使用率

    一、项目背景 需要实时监控云服务器上实例的CPU使用率,类似于腾讯云和阿里云的实例监控数据 二、开发实现思路 通过...

  • Infinity Dashboard for Mac(多功能应用

    Infinity Dashboard for Mac是一款多功能应用程序管理工具,内置35个模块,帮您监控任何消息...

网友评论

      本文标题:mac开发系列35:CPU监控

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