故意高CPU使用率,GCD,QOS_CLASS_BACKGROUND和spindump

时间:2016-01-21 19:33:49

标签: xcode grand-central-dispatch cpu-usage

我正在开发一个碰巧使用大量CPU周期来完成其工作的程序。我注意到它和其他CPU密集型任务,如iMovie导入/导出或Grapher示例,将触发旋转转储报告,登录控制台:

  

2016年1月21日12:37:30.000 PM内核[0]:进程iMovie [697]线程22740抓住了烧CPU!它在180秒内使用了超过50%的CPU(实际最近使用率:77%)。 thread lifetime cpu usage 91.400140 seconds,(87.318264 user,4.081876 system)分类帐info:balance:90006145252 credit:90006145252 debit:0 limit:90000000000(50%)period:自上次补充以来的180000000000时间(ns):116147448571

     

1/21/16 12:37:30.881 PM com.apple.xpc.launchd [1] :( com.apple.ReportCrash [705])端点已通过旧版启动(3)API激活。请切换到XPC或bootstrap_check_in():com.apple.ReportCrash

     

1/21/16 12:37:30.883 PM ReportCrash [705]:为pid = 697 thread = 22740 percent_cpu = 77 duration = 117调用spindump,因为cpu利用率过高   2016年1月21日12:37:35.199 PM spindump [423]:将iMovie版本9.0.4(1634)的cpu_resource.diag报告保存到/ Library / Logs / DiagnosticReports / iMovie_2016-01-21-123735_cudrnaks-MacBook-Pro。 cpu_resource.diag

我知道高CPU使用率可能与软件错误相关联,但某些操作只需要高CPU使用率。监视和报告预计会占用大量CPU的进程/线程似乎浪费资源。

在我的程序中,我使用四个串行GCD调度队列,一个用于i7处理器的每个核心。我尝试过使用QOS_CLASS_BACKGROUND,并且spin dump识别出这个:

  

主要状态:31个样本非最前端应用,非抑制,内核模式,线程QoS背景

使用QOS_CLASS_BACKGROUND代替QOS_CLASS_USER_INITIATED时,风扇旋转速度要慢得多,程序完成时间大约需要2倍。作为一个副作用,Activity Monitor仍会报告相同任务的%CPU使用率和更长的总CPU时间。

基于Apple的能效文档,QOS_CLASS_BACKGROUND似乎是需要很长时间才能完成的事情的正确选择:

  

工作需要很长时间,例如分钟或小时。

那么为什么它还会抱怨使用大量的CPU时间呢?我已经阅读了关于禁用spindump的方法,但是这些方法会禁用所有进程。有没有一种程序化的方法告诉系统这个进程/线程应该使用大量的CPU,所以不要打扰它吗?

0 个答案:

没有答案
相关问题