rk3588 查看 cpu gpu npu RGA使用率的脚本
system_monitor.sh 实现cpu gpu npu RGA使用率和温度监控
#!/bin/bash
# author:rys
# data:2025.11.18
# 实现cpu gpu npu RGA使用率和温度监控
# 去掉linux空格问题 sed -i 's/\r$//' system_monitor.sh
# chmod +x ./system_monitor.sh
# sudo ./system_monitor.sh
# sudo ./system_monitor.sh 1
# 默认刷新间隔
interval=2.5
# 处理命令行参数
if [ $# -gt 0 ]; then
case $1 in
-h|--help)
echo "Usage: $0 [interval]"
echo " interval: Refresh interval in seconds (default: 1.5)"
exit 0
;;
*)
interval=$1
;;
esac
fi
# 获取版本信息(只获取一次)
get_versions() {
# NPU版本
if [ -f "/sys/kernel/debug/rknpu/version" ]; then
npu_version=$(cat /sys/kernel/debug/rknpu/version | awk '{print $NF}')
else
npu_version="unknown"
fi
sleep 0.1
# RGA版本
if [ -f "/sys/kernel/debug/rkrga/driver_version" ]; then
rga_version=$(cat /sys/kernel/debug/rkrga/driver_version | awk '{print $NF}')
else
rga_version="unknown"
fi
sleep 0.1
}
# 获取CPU频率(只获取一次)
get_cpu_freqs() {
cpu_freqs=()
#sleep 0.5
for i in {0..7}; do
if [ -f "/sys/devices/system/cpu/cpu$i/cpufreq/scaling_cur_freq" ]; then
freq=$(cat /sys/devices/system/cpu/cpu$i/cpufreq/scaling_cur_freq)
#echo "/sys/devices/system/cpu/cpu$i/cpufreq/scaling_cur_freq -> "$((freq))
cpu_freqs[$i]=$((freq)) # 转换为kHz
#sleep 0.5
else
cpu_freqs[$i]="unknown"
fi
done
}
# 计算CPU使用率
# 计算CPU使用率
get_cpu_usage() {
# 第一次读取
local cpu_stat1
cpu_stat1=$(cat /proc/stat | grep '^cpu')
sleep 0.1
# 第二次读取
local cpu_stat2
cpu_stat2=$(cat /proc/stat | grep '^cpu')
# 处理每个CPU核心
for i in {0..7}; do
line1=$(echo "$cpu_stat1" | grep "^cpu$i")
line2=$(echo "$cpu_stat2" | grep "^cpu$i")
if [ -n "$line1" ] && [ -n "$line2" ]; then
# 解析CPU时间
read -r cpu user1 nice1 system1 idle1 iowait1 irq1 softirq1 steal1 guest1 guest_nice1 <<< "$line1"
read -r cpu user2 nice2 system2 idle2 iowait2 irq2 softirq2 steal2 guest2 guest_nice2 <<< "$line2"
# 计算总时间差
total1=$((user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 + steal1))
total2=$((user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + steal2))
total_diff=$((total2 - total1))
# 计算空闲时间差
idle_diff=$((idle2 - idle1))
# 计算使用率
if [ $total_diff -ne 0 ]; then
usage=$((100 - (idle_diff * 100) / total_diff))
cpu_usage[$i]=$usage
else
cpu_usage[$i]=0
fi
else
cpu_usage[$i]=0
fi
done
# 计算总体CPU使用率(使用cpu0的数据作为总体)
line1=$(echo "$cpu_stat1" | grep '^cpu ')
line2=$(echo "$cpu_stat2" | grep '^cpu ')
if [ -n "$line1" ] && [ -n "$line2" ]; then
read -r cpu user1 nice1 system1 idle1 iowait1 irq1 softirq1 steal1 guest1 guest_nice1 <<< "$line1"
read -r cpu user2 nice2 system2 idle2 iowait2 irq2 softirq2 steal2 guest2 guest_nice2 <<< "$line2"
total1=$((user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 + steal1))
total2=$((user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + steal2))
total_diff=$((total2 - total1))
idle_diff=$((idle2 - idle1))
if [ $total_diff -ne 0 ]; then
overall_cpu_usage=$((100 - (idle_diff * 100) / total_diff))
else
overall_cpu_usage=0
fi
else
overall_cpu_usage=0
fi
}
# 获取内存信息
get_memory_info() {
if [ -f "/proc/meminfo" ]; then
mem_total=$(grep MemTotal /proc/meminfo | awk '{print $2}')
mem_free=$(grep MemFree /proc/meminfo | awk '{print $2}')
mem_available=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
mem_buffers=$(grep Buffers /proc/meminfo | awk '{print $2}')
mem_cached=$(grep '^Cached' /proc/meminfo | awk '{print $2}')
# 转换为MiB
mem_total_mib=$((mem_total / 1024))
mem_free_mib=$((mem_free / 1024))
mem_available_mib=$((mem_available / 1024))
buff_cache_mib=$(((mem_buffers + mem_cached) / 1024))
# 计算已使用内存
mem_used_mib=$((mem_total_mib - mem_free_mib - buff_cache_mib))
# 计算内存使用率
if [ $mem_total_mib -ne 0 ]; then
mem_usage=$((mem_used_mib * 100 / mem_total_mib))
else
mem_usage=0
fi
else
mem_total_mib=0
mem_free_mib=0
mem_used_mib=0
buff_cache_mib=0
mem_available_mib=0
mem_usage=0
fi
# 获取交换分区信息
if [ -f "/proc/meminfo" ]; then
swap_total=$(grep SwapTotal /proc/meminfo | awk '{print $2}')
swap_free=$(grep SwapFree /proc/meminfo | awk '{print $2}')
swap_total_mib=$((swap_total / 1024))
swap_free_mib=$((swap_free / 1024))
swap_used_mib=$((swap_total_mib - swap_free_mib))
if [ $swap_total_mib -ne 0 ]; then
swap_usage=$((swap_used_mib * 100 / swap_total_mib))
else
swap_usage=0
fi
else
swap_total_mib=0
swap_free_mib=0
swap_used_mib=0
swap_usage=0
fi
}
# 获取GPU信息
get_gpu_info() {
if [ -f "/sys/devices/platform/fb000000.gpu/devfreq/fb000000.gpu/load" ]; then
gpu_load_line=$(cat /sys/devices/platform/fb000000.gpu/devfreq/fb000000.gpu/load)
gpu_load=$(echo $gpu_load_line | cut -d'@' -f1)
gpu_freq=$(echo $gpu_load_line | cut -d'@' -f2 | sed 's/Hz//')
else
gpu_load=0
gpu_freq="unknown"
fi
}
# 获取NPU信息
get_npu_info() {
if [ -f "/sys/kernel/debug/rknpu/load" ]; then
npu_load=$(sudo cat /sys/kernel/debug/rknpu/load 2>/dev/null | sed 's/NPU load://')
if [ $? -ne 0 ]; then
npu_load=" Core0: N/A, Core1: N/A, Core2: N/A,"
fi
else
npu_load=" Core0: N/A, Core1: N/A, Core2: N/A,"
fi
npu_load="${npu_load#"${npu_load%%[![:space:]]*}"}"
}
# 获取RGA信息
get_rga_info() {
if [ -f "/sys/kernel/debug/rkrga/load" ]; then
rga_load=$(sudo cat /sys/kernel/debug/rkrga/load 2>/dev/null | grep "load = " | awk '{print $3}' | tr '\n' ' ')
if [ $? -eq 0 ]; then
# 解析RGA核心负载
rga_cores=()
while read -r line; do
if echo "$line" | grep -q "load = "; then
core_load=$(echo "$line" | awk '{print $3}' | sed 's/%//')
rga_cores+=("$core_load")
fi
done <<< "$(sudo cat /sys/kernel/debug/rkrga/load 2>/dev/null)"
if [ ${#rga_cores[@]} -ge 3 ]; then
rga_load_formatted=" Core0: ${rga_cores[0]}%, Core1: ${rga_cores[1]}%, Core2: ${rga_cores[2]}%,"
else
rga_load_formatted=" Core0: N/A, Core1: N/A, Core2: N/A,"
fi
else
rga_load_formatted=" Core0: N/A, Core1: N/A, Core2: N/A,"
fi
else
rga_load_formatted=" Core0: N/A, Core1: N/A, Core2: N/A,"
fi
rga_load_formatted="${rga_load_formatted#"${rga_load_formatted%%[![:space:]]*}"}"
}
# 获取温度
# RK3588的芯片有7路TS-ADC分别对应:芯片中心位置、A76_0/1、A76_2/3、DSU 、A55_0/1/2/3、PD_CENTER、 NPU、GPU。
# (1)芯片中心位置温度:soc-thermal
# (2)CPU大核A76_0/1 即CPU4和CPU5的温度:
# (3)CPU大核A76_2/3 即CPU6和CPU7的温度:
# (4)CPU小核A55_0/12/3 即CPU0、CPU1、CPU2、CPU3的温度
# (5)PD_CENTER的温度:
# (6)GPU的温度
# (7) NPU的温度
get_temp_info() {
soc_thermal=`cat /sys/class/thermal/thermal_zone0/temp`
soc_thermal_interger=${soc_thermal:0:2}
soc_thermal_decimal=${soc_thermal:2:3}
soc_thermal_float="soc_temp="${soc_thermal_interger}"."${soc_thermal_decimal}
CPU_A76_01=`cat /sys/class/thermal/thermal_zone1/temp`
CPU_A76_01_interger=${CPU_A76_01:0:2}
CPU_A76_01_decimal=${CPU_A76_01:2:3}
CPU_A76_01_float="CPU_A76_01_temp ="${CPU_A76_01_interger}"."${CPU_A76_01_decimal}
CPU_A76_23=`cat /sys/class/thermal/thermal_zone2/temp`
CPU_A76_23_interger=${CPU_A76_23:0:2}
CPU_A76_23_decimal=${CPU_A76_23:2:3}
CPU_A76_23_float="CPU_A76_23_temp ="${CPU_A76_23_interger}"."${CPU_A76_23_decimal}
CPU_A55_0123=`cat /sys/class/thermal/thermal_zone3/temp`
CPU_A55_0123_interger=${CPU_A55_0123:0:2}
CPU_A55_0123_decimal=${CPU_A55_0123:2:3}
CPU_A55_0123_float="CPU_A55_0123_temp="${CPU_A55_0123_interger}"."${CPU_A55_0123_decimal}
PD_CENTER=`cat /sys/class/thermal/thermal_zone4/temp`
PD_CENTER_interger=${PD_CENTER:0:2}
PD_CENTER_decimal=${PD_CENTER:2:3}
PD_CENTER_float="PD_CENTER_temp="${PD_CENTER_interger}"."${PD_CENTER_decimal}
GPU=`cat /sys/class/thermal/thermal_zone5/temp`
GPU_interger=${GPU:0:2}
GPU_decimal=${GPU:2:3}
GPU_float="GPU_temp="${GPU_interger}"."${GPU_decimal}
NPU=`cat /sys/class/thermal/thermal_zone6/temp`
NPU_interger=${NPU:0:2}
NPU_decimal=${NPU:2:3}
NPU_float="NPU_temp="${NPU_interger}"."${NPU_decimal}
}
# 显示信息
display_info() {
clear
echo "System Monitor - Refresh interval: ${interval}s"
echo "================================================"
echo ""
echo "CPU load: ${overall_cpu_usage}% ${soc_thermal_float} ${PD_CENTER_float}"
printf "MiB Mem :\t%2d%% %8.1f total, %8.1f free, %8.1f used, %8.1f buff/cache\n" \
$mem_usage $mem_total_mib $mem_free_mib $mem_used_mib $buff_cache_mib
printf "MiB Swap:\t%2d%% %8.1f total, %8.1f free, %8.1f used. %8.1f avail Mem\n" \
$swap_usage $swap_total_mib $swap_free_mib $swap_used_mib $mem_available_mib
echo ""
# 显示每个CPU核心
for i in {0..7}; do
printf "cpu%d load(%d): %d%%\n" $i ${cpu_freqs[$i]} ${cpu_usage[$i]}
done
echo ""
echo "${CPU_A55_0123_float}"
echo "${CPU_A76_01_float}"
echo "${CPU_A76_23_float}"
# echo ""
# echo "${CPU_A76_01_float} ${CPU_A76_23_float} ${CPU_A55_0123_float}"
echo ""
echo "GPU load(${gpu_freq}Hz): ${gpu_load}% ${GPU_float}"
echo ""
echo "NPU load($npu_version): ${npu_load} ${NPU_float}"
echo ""
echo "RGA load($rga_version): ${rga_load_formatted}"
echo ""
}
# 初始化
echo "Initializing system monitor..."
get_versions
# get_cpu_freqs
# 主循环
while true; do
get_cpu_freqs
get_cpu_usage
get_memory_info
get_gpu_info
get_npu_info
get_rga_info
get_temp_info
display_info
sleep $interval
done
可能存在中文半角问题 执行如下指令
sed -i 's/\r$//' system_monitor.sh
执行脚本(默认2.5秒)
chmod +x ./system_monitor.sh
sudo ./system_monitor.sh
sudo ./system_monitor.sh 1
执行上述指令时,每次都需要输入密码,比较麻烦,可以使用expect来输入密码
先安装 sudo apt install expect
system_expect.sh 脚本如下
#!/usr/bin/expect
spawn sudo /home/orangepi/project/system_monitor.sh
expect {
#"yes/no" {send "yes\r";exp_continue}
"password for orangepi:" {send "orangepi\n"}
}
interact
#interact会进入交互的界面
# 比如 检测 到有 password for orangepi 出现时,就send内容 此处输入密码 orangepi 和 换行,完成输入
# exp_continue即连续输入
参考如下
参考 https://zhuanlan.zhihu.com/p/678024036
参考指令如下
root@orangepi5ultra:~/project/00_qtgui# cat /sys/kernel/debug/rkrga/driver_version
RGA multicore Device Driver: v1.3.0
root@orangepi5ultra:~/project/00_qtgui# cat /sys/kernel/debug/rknpu/version
RKNPU driver: v0.9.6
root@orangepi5ultra:~/project/00_qtgui# cat /sys/devices/platform/fb000000.gpu/devfreq/fb000000.gpu/load
0@300000000Hz
root@orangepi5ultra:~/project/00_qtgui# sudo cat /sys/kernel/debug/rknpu/load
NPU load: Core0: 0%, Core1: 0%, Core2: 0%,
root@orangepi5ultra:~/project/00_qtgui# sudo cat /sys/kernel/debug/rkrga/load
num of scheduler = 3
================= load ==================
scheduler[0]: rga3_core0
load = 0%
-----------------------------------
scheduler[1]: rga3_core1
load = 0%
-----------------------------------
scheduler[2]: rga2
load = 0%
-----------------------------------
root@orangepi5ultra:~/project/00_qtgui#
root@orangepi5ultra:~/project/00_qtgui# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
816000
root@orangepi5ultra:~/project/00_qtgui# cat /sys/devices/system/cpu/cpu7/cpufreq/scaling_cur_freq
408000
root@orangepi5ultra:~/project/00_qtgui# cat /proc/stat
cpu 34768 9362 88729 10988988 641 0 3242 0 0 0
cpu0 8040 602 17512 1345528 153 0 1800 0 0 0
cpu1 4968 673 11119 1376185 31 0 136 0 0 0
cpu2 3566 531 8276 1383854 17 0 27 0 0 0
cpu3 2561 456 6688 1386970 23 0 20 0 0 0
cpu4 5732 2887 31574 1339939 92 0 25 0 0 0
cpu5 4936 787 3949 1385064 127 0 1211 0 0 0
cpu6 3384 2907 1447 1388600 101 0 8 0 0 0
cpu7 1576 515 8159 1382845 93 0 10 0 0 0
intr 52560433 0 8721793 9927895 0 0 97752 2285567 0 0 0 0 0 0 17526079 812971 0 385529 13155 1 31336 0 0 0 0 1 2 2 735018 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 83193 0 0 0 0 0 0 0 0 0 0 0 673 0 4992268 124097 0 0 5 0 0 0 62 0 0 2711640 538 0 0 0 0 135131 143 167 37 0 0 0 0 0 0 0 0 0 0 0 0 7210 30 0 3089042 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2570 95 0 0 0 0 0 0 0 0 0 0 0 0 386129 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490302
ctxt 59733290
btime 1762753593
processes 80185
procs_running 1
procs_blocked 0
softirq 8695314 2511 1143064 4 690591 51175 0 3802442 2106484 36292 862751
root@orangepi5ultra:~/project/00_qtgui#
root@orangepi5ultra:~/project/00_qtgui#

浙公网安备 33010602011771号