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#
posted @ 2025-11-10 18:47  小城熊儿  阅读(346)  评论(0)    收藏  举报