提升树莓派性能的方法
文章目录
- 前言
- 树莓派安装 raspi-config 工具(ubuntu等非官方树莓派系统)
- 硬件以及系统配置方面
- 1. 减少 GPU 内存用量
- 2. 禁用L2 cache
- 3. 提高运行频率
- 4. cpu 隔离
- 5. 中断隔离
- 5.1 普通外设中断
- 5.2 timer tick
- 5.3 设置中断亲和性 irqaffinity
- 5.4 禁用 irqbalance
- 5.5 关闭 nmi_watchdog
- 6. 禁用 soft-lockup 检测器,死锁相关
- 7. offload RCU(Read-Copy Update) callback
- 8. 其它内核配置选项
- 程序编写方面
前言
树莓派安装 raspi-config 工具(ubuntu等非官方树莓派系统)
安装依赖:
sudo apt install whiptail parted lua5.1 alsa-utils psmisc
从Raspberrypi官网下载最新的deb安装包:
wget http://archive.raspberrypi.org/debian/pool/main/r/raspi-config/raspi-config_20200707_all.deb
安装Deb安装包:
sudo dpkg -i raspi-config_20200707_all.deb
运行raspi-config:
sudo raspi-config
硬件以及系统配置方面
1. 减少 GPU 内存用量
如何查看GPU内存?
通过 cat /proc/meminfo
判断内存容量。
树莓派
树莓派上的内存是分一些给CPU用,分一些给GPU用的,GPU占用的默认是76M(1GB以上),rpi4 上,GPU 的 3D 组件有自己的内存管理单元,使用 Linux 中动态分配的内存。
方法一:
修改config.txt:gpu_mem=16
,16MB 是最小值。
修改前:
修改后:
方法二:
运行raspi-config
,选择分配大小。
2. 禁用L2 cache
disable_l2cache=1
禁止 CPU 对 GPU 的 L2 cache 的访问。BCM2835 的默认值为 0。在 BCM2836、BCM2837 和 BCM2711 上,默认值为 1。
3. 提高运行频率
方法一:
二代 raspi-config 超频设置选项参考:
修改配置文件.config:
arm_freq/arm_freq_min
: 设置 CPU 频率,以MHZ为单位。1500/600,1800 if arm_boost=1(以pi4举例,下同)。
arm_boost
: 将 arm_freq
增加到硬件支持的最高频率,set 1。
gpu_freq/gpu_freq_min
: 提供更精细的设置选项 * /250
*core_freq/core_freq_min
: 设置 GPU 频率,MHz,会影响 CPU 的性能,由于二者共享 L2 cache 和内存总线(树莓派每个版本均共享?)。500/200
*h264_freq/h264_freq_min
: hardware video block,MHz,覆盖 gpu_freq。500/250
*isp_freq/isp_freq_min
: image sensor pipeline block,MHz,覆盖 gpu_freq。500/250
*v3d_freq/v3d_freq_min
: 3D block,MHz,覆盖 gpu_freq。500/250
*hevc_freq/hevc_freq_min
: High Efficiency Video Codec block,MHz,覆盖 gpu_freq,rpi4 专有。500
sdram_freq
: SDRAM 频率,rpi4 不支持内存频率超频,MHz。3200(pi4)
over_voltage/over_voltage_min
: CPU/GPU 电压上限,范围 [-16,8]=[0.95,1.55],步长0.025V,force_turbo=1
时,允许值大于6(大于1.5V),over_voltage
亦会设置。0
over_voltage_sdram
: 提供更精细的设置选项 * 0
*over_voltage_sdram_c
: SDRAM控制器电压,[-16,8]=[0.8V,1.4V],步长0.025V。0
*over_voltage_sdram_i
: SDRAM I/O电压,同上。0
*over_voltage_sdram_p
: SDRAM phy电压,同上。0
固件使用自适应电压缩放 (AVS) 来确定由 over_voltage 和 over_voltage_min 定义的范围内的最佳 CPU/GPU 电压。
force_turbo
: 强制 turbo 模式(终极超频模式)即使 ARM 核空闲,会设置 over_voltage_*
值。
initial_turbo
: 从启动到 turbo 模式,设置一个缓冲时间。最大 60s。0 Secs
temp_limit
:过热保护。当 SoC 达到此值(以摄氏度为单位)时,这会将时钟和电压设置为默认值。85
查看运行频率:
结论:
- 树莓派4B不支持SDRAM超频,默认3200MHz
- 注释字段
arm_boost=1
。 force_turbo=1
强制使用最大频率,设置 CPU、GPU、内存频率、以及over_voltage_*
的值。temp_limit=85
设置过热保护,将频率和电压设置为默认值,标称温度 -40~85。
修改前:
修改后:
方法二:
https://blog.csdn.net/weixin_39589455/article/details/123073227?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-2-123073227-null-null.pc_agg_new_rank&utm_term=%E6%A0%91%E8%8E%93%E6%B4%BEcpu%E9%A2%91%E7%8E%87&spm=1000.2123.3001.4430
安装工具:sudo apt-get install cpufrequtils
查看当前运行频率:sudo cpufreq-info -w -m
方法三:
raspi-config
中的 overclock 选项,只适合于 pi1 和 pi2。
4. cpu 隔离
修改 cmdline.txt,添加内核启动参数 isolcpus=3
隔离第4个CPU。
编写测试程序,一共产生4个进程,负载均衡后平摊到每个CPU。
ubuntu@ubuntu:~/high_performance_rpi$ cat multiprocess.c
#include <stdlib.h>
void main()
{fork();fork();while(1);
}
运行后,查看 htop
,确实进行了任务平摊:
修改 cmdline.txt,隔离 CPU4:
运行程序,查看 htop
,确实进行了隔离,用户空间的进程不能在它上面运行。
通过 taskset
命令,绑定任务到隔离的 CPU 3 上运行:
将任务的 CPU 亲和性从 [0-2] 修改为 3,htop 查看结果:
结论:isolcpu
可以隔离用户进程。
5. 中断隔离
5.1 普通外设中断
https://www.cnblogs.com/linhaostudy/p/14498098.html
查看外设中断的亲和性,值为7(0b0111),除了4号CPU被屏蔽。
结论:对于普通外设,isolcpu 参数可以进行屏蔽,对于 timer tick、IPI 不行。
5.2 timer tick
传统的tick机制在系统进入空闲状态时仍然会产生周期性的中断,这种频繁的中断迫使CPU无法进入更深的睡眠。如果放开这个限制,在系统进入空闲时停止tick,有工作时恢复tick,实现完全自由的,根据需要产生tick的机制,可以使CPU获得更多的睡眠机会以及更深的睡眠,从而进一步节能。dynamic tick的出现,就是为彻底替换掉周期性的tick机制而产生的。
————————————————
版权声明:本文为CSDN博主「lee_xin_gml」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lee_xin_gml/article/details/7866206
一般情况下,Linux 配置了 IDLE 状态时的 NO_HZ tickless,即,CPU4 上没有任务时,该timer值不会增加,但是当该CPU4上有任务时,CPU4的timer数量会增加,timer tick会频繁打断该线程,造成大量上下文切换。
想要达成运行一个任务时,也能够不增加 timer tick 值,需要重新编译内核,设置选项 Full dynticks system(tickless)
:
结论:对于 IDLE 状态的 CPU,一般情况下不会受到 timer tick 打扰,要想在 CPU 上运行的某一个任务不会被打扰,需要设置内核选项,同时指定内核参数,nohz_full=3
,使得 CPU3 支持 NO_HZ_FULL。
5.3 设置中断亲和性 irqaffinity
内核启动参数:irqaffinity=0,1,2
,默认由核0核1核2处理Linux中断,保证实时核3不会受到linux非实时设备的中断请求。
5.4 禁用 irqbalance
linux irqbalance 用于优化中断分配,它会自动收集系统数据以分析使用模式,并依据系统负载状况将硬件中断分配到各个CPU核心上处理。
内核启动参数:noirqbalance
并且运行:
sudo systemctl stop irqbalance.service
sudo systemctl disable irqbalance.service
5.5 关闭 nmi_watchdog
NMI Watchdog 中包含 soft lockup detector 和 hard lockup detector,树莓派内核没有启用看门狗功能(Pi Zero、Pi 1),当内核宕机后即进入死机状态,不会重启系统。如果需要配置看门狗功能,参考 https://blog.csdn.net/ling_lang/article/details/116268623。
内核启动参数:nmi_watchdog=0
并且运行:
echo '0' > /proc/sys/kernel/nmi_watchdog
6. 禁用 soft-lockup 检测器,死锁相关
内核配置:
SOFTLOCKUP_DETECTOR=n
BOOTPARAM_SOFTLOCKUP_PANIC=n
7. offload RCU(Read-Copy Update) callback
对于 HPC 和实时工作负载很有用,对于被 RCU 保护的共享数据结构,读者不需要锁即可访问,写者在访问时需要拷贝一个副本,在副本上修改,然后通知访问该数据的CPU退出并指向新的被修改的数据(call-back),不使用 call-back,使用内核线程代替,减少CPU抖动。
内核配置:CONFIG_RCU_NOCB_CPU = y
8. 其它内核配置选项
CONFIG_MIGRATION=n,不允许在保持虚拟内存页地址不变的情况下移动其所对应的物理内存页的位置。
CONFIG_PREEMPT=y,开启抢占
CONFIG_CPU_FREQ =n,禁止处理器动态调整频率。
CONFIG_CPU_IDLE =n
程序编写方面
- 使用静态编译语言
- 编写高性能的代码
- 尽量让分支有规律性,使用likely()/unlikely()或编写无分支代码
- 利用cache局部性原理,防止伪共享
- 合理分配任务优先级
- 尽量使用静态库
- 避免实时任务中进行动态内存分配
- 驱动程序中断处理尽可能短等等
提升树莓派性能的方法相关推荐
- 神经网络模型提升算法性能的方法
转自:https://machinelearningmastery.com/improve-deep-learning-performance/(英文原文) PS:找了好久,CSDN都分类为转载,但是 ...
- 几种通过降低Cache失效率来提升程序性能的方法
几种通过降低Cache失效率来提升程序性能的方法 1 将矩阵转置 2 分块处理矩阵乘法 3 将分块和转置结合 4 总结 当程序访问多个数组时,经常会出现有些数组按行访问,有些数组按列访问的情况.以 ...
- Win10显卡提升游戏性能的方法
对于游戏玩家而言,一张好用的显卡是非常重要的,用户还可以对自己的电脑显卡性能进行提升,大大提高游戏体验感.下面小编就给大家分享一下NVIDIA和AMD显卡如何设置为最高性能的方法. AMD显卡驱动22 ...
- Win11如何提高游戏性能?Win11提升游戏性能的方法
Win11如何提高游戏性能?随着硬件的发展,游戏的画面水平和玩法复杂度都在提高.要是做好性能优化,将能赋予游戏更大的空间去提升效果和玩法.= 更多重装系统教程尽在小白系统重装官网 方法一: 1.点击 ...
- mysql性能升级方案_使用FriendFeed来提升MySQL性能的方法
背景 我们使用MySQL存储了FriendFeed的所有数据.数据库随着用户基数的增长而增长了很多.现在已经存储了超过2.5亿条记录与一堆涵盖了从评论和"喜欢"到好友列表的其他数据 ...
- 莱斯大学找到了多被提升3G/4G网络性能的方法
为什么80%的码农都做不了架构师?>>> Rice University has figured out how to double capacity on 3G/4G networ ...
- win7怎么设置计算机的性能,win7怎么提升电脑性能
2020-09-22 17:55:00 浏览量:912 大家都知道,电脑的运行速度取决于电脑的内存,如果电脑的内存太低的话,那么电脑的运行速度就会大大降低,想要电脑运行速度提升,那就得提高内存的性能. ...
- Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net
Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net 1. 提升单例有能力的1 2. 减少工作数量2 2.1. 减少距 ...
- 提升PHP性能的21种方法
提升PHP性能的21种方法. 1.用单引号来包含字符串要比双引号来包含字符串更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会. 2.如果能将类的方法定义成static,就尽量定义成s ...
最新文章
- 命题模式持续在变 你变不变
- 10个免费在线逻辑关系图表图形设计制作工具
- 使用信号量实现简单双向同步
- JZOJ 5952. 【NOIP2018模拟11.5A组】凯旋而归
- 2006年上海交通大学计算机研究生机试真题
- 微信模板消息47001错误
- 项目经理的商务指南系列之四:认识谈判(不做传声筒,不做顶门闩,进退之策,进退之法,有机事者必有机心)...
- 整理Oracle日期时间函数
- Google Earth Engine(GEE)——图表概述(记载图表库)
- CAD如何绘制六连环图案?CAD使用圆,椭圆,直线综合练习
- 计算机组成原理————寄存器寻址方式大总结
- vue + web 前端访问后端,跨域问题解决方案
- laravel Eloquent whereIn 多个字段
- mysql日期教程_Navicat for MySQL 设置日期时间栏位教程(图文)
- python opencv 入门 绘图函数 (3)
- 幽默感七个技巧_如何让自己变得幽默-16个聊天幽默技巧
- C语言const和volatile关键字
- android lcm,MTK Android Driver :lcm
- 50天50个前端小项目(纯html+css+js)第十二天(FAQ 问题与回答框)
- [深度学习论文笔记]Knowledge distillation from multi-modal to mono-modal segmentation networks从多模态到单模态分割的知识提取
热门文章
- 最全VIM in PyCharm 的.ideavimrc文件的键盘设置
- Java8-20-lambda 设计模式
- Android Studio 快捷键大全,安卓内存监控悬浮
- LCD驱动程序——代码编写(二)
- 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
- qq. 微信分享出去的页面。如何唤起app,跳到指定的页面
- Cross-Origin Read Blocking (CORB) blocked cross-origin response 问题
- 【FPGA】Mint20.3系统安装VCS2018环境
- 对于ALU(算数逻辑运算单元)算数和逻辑的一点理解
- 零基础学cad要多久_零基础学CAD,快捷键倒背如流值得一试,很有技巧,实用操作!...