当前位置: 纯净系统家园 >  微软资讯 >  CPU调频、线程绑核、优先级控制实践:如何优化计算机性能?

CPU调频、线程绑核、优先级控制实践:如何优化计算机性能?

更新时间:2023-07-01 11:04:36作者:yidaimei
0

背景

为了进一步优化App性能,最近针对如何提高应用对CPU的资源使用、以及在多线程环境下如何提高关键线程的执行优先级做了技术调研。本文是对技术调研过程的阶段性总结,将分别介绍普通应用如何调控App频率、如何将指定线程绑定到特定CPU、如何通过提升线程优先级获得更多CPU时间片。


1

CPU调频

1.1 概念

通常更高的CPU频率代表了更快的运行速度,一个设备可能包含多个CPU,以我目前使用的Mi 11 Pro为例,它的CPU为8核分别为,1 x 2.84GHz (ARM 最新Cortex X1 核心)+3 x 2.4GHz (Cortex A78)+4 x 1.8GHz (Cortex A55) 。 这里列出的CPU频率为CPU物理理论上的最大频率,在实际运行过程中CPU的频率范围为governor动态控制的。目前的Androd设备普遍采用schedutil gover进行调频控制,它会根据运行过程的CPU负载进行调频。不过默认的调频存在一些限制,比如调频之间的间隔需>10ms, 并且根据schedutil的升频计算公式,并不保证能直接升频到最高频率。

在实际应用中,如果我们已经知道接下来需要执行高CPU负载任务,通过提前主动升频来提升性能,就能减少卡顿或者提高任务的执行耗时。

在Android系统 :可以通过


测试结果如下:

CPU调频、线程绑核、优先级控制实践:如何优化计算机性能?

由此可见,如果希望最大程度提高线程优先级的话,还是需要使用Process的函数。

那么这里为什么Android系统下通过Thread.setPriority 设置的最高优先级nice值为什么为-8呢?通过跟踪native层代码路径发现,这里Java线程优先级的1~10 在底层的取值 其实是映射了使一个数组,该数组存储了对应设置的nice优先级,其中的最高优先级10对应的 ANDROID_PRIORITY_URGENT_DISPLAY 对应的nice值就为-8

CPU调频、线程绑核、优先级控制实践:如何优化计算机性能?

Android系统对于什么情况下使用什么nice值 完整定义如下:

CPU调频、线程绑核、优先级控制实践:如何优化计算机性能?


3.3 验证

为了验证设置线程优先级对线程获得CPU时间片的提升效果,我们创建一组工作线程,并同时执行,每个线程会执行一个类似死循环的工作,这样每个线程都不会主动让出CPU,工作5秒后,计算当前线程得到CPU执行的时间。为了更好对比线程优先级对CPU时间片分配的影响,我们将这组线程统一绑定到一个核心上,这样可以更好的观测线程优先级对CPU时间片分配的的影响。

CPU调频、线程绑核、优先级控制实践:如何优化计算机性能?

根据输出结果可以发现,优先级为-20的线程占用了cpu98%的执行时间,其他线程几乎没得到执行。

而如果将线程优先级修改为0,也就是默认的线程优先级,那么这4个线程将会得到几乎相同的执行时间。

CPU调频、线程绑核、优先级控制实践:如何优化计算机性能?

从这个结果看,线程优先级的效果还是比较明显的。

不过在实际情况中,如果这些线程并没有特别指定在某个CPU执行,那么它们可能会在任何CPU上执行,系统会自动将线程调度到其他不繁忙的CPU上。

以下是指定了 task4的优先级,但并没有绑定CPU核的情况输出的结果:

CPU调频、线程绑核、优先级控制实践:如何优化计算机性能?

这里有2个信息:

一开始task可能会被分配在相同的CPU上,但由于我们的任务几乎是一个空循环任务,对CPU的使用率较高,此时每个任务都无法得到足够的CPU时间片执行,而1、4核心可能又几乎是空闲的,因此当系统发现某些CPU负责较高时,系统自动将部分线程任务迁移到空闲的CPU上执行
由于线程被分配的不同的CPU上,因此这几个线程之间不存在优先级比较关系,因此每个任务都得到了充足的CPU时间执行。

从这里我们也可以看出,不合理的强绑定CPU核心, 有时候可能会起到相反的效果。


4

总结

本文分享了Android系统下自主控制CPU频率、线程指定核心和优先级的方式,不过这些能力需要具体落实到业务场景才能够获得实际的收益。后续我们将在进程冷启动、Activity启动阶段、页面滑动、帧渲染线程优化、等业务场景进行尝试。



参考资料:

升频计算公式:https://docs.kernel.org/scheduler/schedutil.html高通BoostFramework概要介绍: https://juejin.cn/post/7141196697555714079BosstFrameowrk:https://gerrit.pixelexperience.org/plugins/gitiles/frameworks_base/+/0420df35ae49ed11d503571aa76f80a154f1b4ac/core/java/android/util/BoostFramework.javaAndroid虚拟机线程启动过程解析, 获取Java线程真实线程id的方式:https://juejin.cn/post/7138690370694545415Android 高版本采集系统CPU使用率的方式:https://juejin.cn/post/7135034198158475300https://lwn.net/Articles/792502/https://dumps.tadiphone.dev/dumps/oneplus/op516el1/-/blob/qssi-user-13-SKQ1.220519.001-S.202208250304-release-keys--ALLNET/vendor/etc/powerhint.xmlhttps://deepinout.com/qcom-camx-debug-user-guide/camx-perf-debug-user-guide/qcom-perflock-usage.htmlhttp://www.manongzj.com/blog/31-sgltmktizd.htmlpowerhint.xml、powerhint.xmlhttps://en.wikipedia.org/wiki/Processor_affinity



作者:进武

来源:微信公众号:得物技术

出处:https://mp.weixin.qq.com/s/H6IghIVzPCMYhzQcdzwxLQ

相关教程

copyright ©  2012-2024 纯净系统家园 yidaimei.com 版权声明