最近处理一起历史遗留问题,感觉很爽。
现象:
背景:设备采用ARM,即rk3568处理器,采用Linux系统;主要用于视觉后端处理
现象:当软件运行一段时间,大概1个小时(也不是很固定),CPU使用率会变成原先一倍,这个到不影响软件使用流畅,但采集卡的驱动会出现异常,也开始丢帧了(甚至不出流),算是很严重的bug。
作为资深软件开发人员,首先怀疑程序有问题,或某个线程挂掉了。但实际产生现象后,软件流畅度还是有所保证的,非视频相关一些操作都很正常。后来在跟采集卡厂家沟通过程中,发现采集卡驱动在CPU调频的时候会出现异常,需要重启驱动才可以恢复。
然后,当然怀疑是CPU是否降频了,如果降频一半,的确会导致CPU占用率比较高。那么问题来了,怎么让CPU不主动降频呢?猜测应该是电源管理相关,特别是ARM这些嵌入式,的确默认会存在降频的可能。考虑本设备不用考虑节能的问题,所以针对此猜测,最好的解决办法就是CPU不降频。
- 如何查看当前电源管理模式?
在设备端:
cd /sys/devices/system/cpu/cpu0/cpufreq
如果没有该目录,说明该系统不支持电源管理模式(或系统裁剪掉了)
通过 ls 可以看到如下:
affected_cpus related_cpus scaling_governor
cpuinfo_cur_freq scaling_available_frequencies scaling_max_freq
cpuinfo_max_freq scaling_available_governors scaling_min_freq
cpuinfo_min_freq scaling_cur_freq scaling_setspeed
其中 scaling_governor 就是当前电源管理模式,cat下就可以看到了
scaling_available_governors就是支持哪些管理模式(一般来说,都是至少支持以下5种)
①、Performance,最高性能,直接用最高频率,不考虑耗电。
②、Interactive,一开始直接用最高频率,然后根据 CPU 负载慢慢降低。
③、Powersave,省电模式,通常以最低频率运行,系统性能会受影响,一般不会用这个!
④、Userspace,可以在用户空间手动调节频率。
⑤、Ondemand,定时检查负载,然后根据负载来调节频率。负载低的时候降低 CPU 频率,这样省电,负载高的时候提高 CPU 频率,增加性能。
我的设备默认是 Interactive,现在需要改成 Performance
接下去的操作,无非是两种:
1. 在启动时候修改模式,注意要把每个CPU都修改了
2. 修改内核,默认改成 performance
下面是启动时候或者过程中(未验证过是否可行)修改模式
for i in $(seq 0 1 15)
doecho "performance" > /sys/devices/system/cpu/cpu${i}/cpufreq/scaling_governor
done
- 如何在内核里修改默认performance?
进入kernel目录,输入make menuconfig ARCH=arm64
然后加载使用的config
选择 CPU power management 然后 选择 CPU Frequency scaling (可能不同版本略有不同)
进入之后,如下图,选择默认的模式(其他地方不要修改,也不要直接把这个功能去掉)
然后save,重新build kernel ,更新kernel到板子上即可