文章目录
- 前言
- 树莓派安装 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。
修改前:
修改后:
方法二:
aggregatepagefirst_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 普通外设中断
查看外设中断的亲和性,值为7(0b0111),除了4号CPU被屏蔽。
结论:对于普通外设,isolcpu 参数可以进行屏蔽,对于 timer tick、IPI 不行。
5.2 timer tick
传统的tick机制在系统进入空闲状态时仍然会产生周期性的中断,这种频繁的中断迫使CPU无法进入更深的睡眠。如果放开这个限制,在系统进入空闲时停止tick,有工作时恢复tick,实现完全自由的,根据需要产生tick的机制,可以使CPU获得更多的睡眠机会以及更深的睡眠,从而进一步节能。dynamic tick的出现,就是为彻底替换掉周期性的tick机制而产生的。
一般情况下,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),当内核宕机后即进入死机状态,不会重启系统。如果需要配置看门狗功能,
内核启动参数: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局部性原理,防止伪共享
- 合理分配任务优先级
- 尽量使用静态库
- 避免实时任务中进行动态内存分配
- 驱动程序中断处理尽可能短等等