Linux.之系统性能监控脚本, CPU、内存、DDR、CMA、ISP、MPP、ION、DRM、进程

专用的系统性能监控脚本

作用:每隔一段时间,把 CPU、内存、DDR、CMA、ISP、MPP、ION、DRM、进程... 全部信息抓一遍,用于定位:

runtime_monitor.sh

c 复制代码
#!/bin/sh
get_cpu_usage() {
        #脚本功能描述:依据/proc/stat文件获取并计算CPU使用率
        #CPU时间计算公式:CPU_TIME=user+system+nice+idle+iowait+irq+softirq
        #CPU使用率计算公式:cpu_usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
        #默认时间间隔
        TIME_INTERVAL=5
        time=$(date "+%s")
        LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
        LAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}')
        LAST_USER_BUSY=$(echo $LAST_CPU_INFO | awk '{print $1}')
        LAST_SYS_BUSY=$(echo $LAST_CPU_INFO | awk '{print $3}')
        LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
        LAST_CPU_USAGE=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3}')
        sleep ${TIME_INTERVAL}
        NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
        NEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')
        NEXT_USER_BUSY=$(echo $NEXT_CPU_INFO | awk '{print $1}')
        NEXT_SYS_BUSY=$(echo $NEXT_CPU_INFO | awk '{print $3}')
        NEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
        NExT_CPU_USAGE=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3}')

        #系统空闲时间
        SYSTEM_IDLE=$(echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}')
        #系统使用时间
        SYSTEM_BUSY=$(echo ${NEXT_SYS_BUSY} ${LAST_SYS_BUSY} | awk '{print $1-$2}')
        #用户使用时间
        USER_BUSY=$(echo ${NEXT_USER_BUSY} ${LAST_USER_BUSY} | awk '{print $1-$2}')
        #用户+系统+nice时间
        TOTAL_BUSY=$(echo ${NExT_CPU_USAGE} ${LAST_CPU_USAGE} | awk '{print $1-$2}')
        #CPU总时间
        TOTAL_TIME=$(echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}')

        #CPU总时间百分比
        CPU_USAGE=$(echo ${TOTAL_BUSY} ${TOTAL_TIME} | awk '{printf "%.2f", $1/$2*100}')
        #用户时间百分比
        CPU_USER_USAGE=$(echo ${USER_BUSY} ${TOTAL_TIME} | awk '{printf "%.2f", $1/$2*100}')
        #系统时间百分比
        CPU_sys_USAGE=$(echo ${SYSTEM_BUSY} ${TOTAL_TIME} | awk '{printf "%.2f", $1/$2*100}')

        echo "CPU Usage:${CPU_USAGE}%" $time
        echo "CPU UserUsage:${CPU_USER_USAGE}%" $time
        echo "CPU SysUsage:${CPU_sys_USAGE}%" $time
}

get_ion_info() {
        if [ -f "/sys/kernel/debug/ion/heaps/cma" ]; then
                echo "CMA:"
                cat /sys/kernel/debug/ion/heaps/cma
        else
                echo "ion's cma heap read failed"
        fi

        if [ -f "/sys/kernel/debug/ion/heaps/vmalloc" ]; then
                echo "Vmalloc:"
                cat /sys/kernel/debug/ion/heaps/vmalloc
        else
                echo "ion's vmalloc heap read failed"
        fi
}

get_drm_info() {
        if [ -f "/sys/kernel/debug/dri/0/mm_dump" ]; then
                echo "DRM:"
                cat /sys/kernel/debug/dri/0/mm_dump
        else
                echo "drm read failed"
        fi
}

do_exit() {
        echo "do_exit"
        exit 0
}

show_usage() {
        echo ""
        echo "Usage: $0 [-i seconds] [-p \"pid list\"]..."
        echo "  -i \t\tinterval(second),default value is 30"
        echo "  -p \t\tpid list"
        echo ""
        echo "example: $0 -i 30 -p \"233 513 679\""
}

trap 'onCtrlC' INT SIGTERM SIGINT SIGQUIT SIGTRAP SIGABRT SIGKILL SIGSTOP SIGHUP SIGSEGV SIGTSTP

function onCtrlC() {
        echo "Ctrl+C is captured"
        echo "exit..."
        log "cvr_auto_test's pid = $$"
        kill -9 $$
        exit
}

echo ""
echo "Memory Monitor Version: "$version
echo "[Kernel]: "$(cat /proc/version)
echo ""
echo "========== /proc/cmdline =========="
cat /proc/cmdline
echo "========== /proc/cpuinfo =========="
cat /proc/cpuinfo
echo ""
echo "========== /proc/misc =========="
cat /proc/misc
echo "========== /proc/iomem =========="
cat /proc/iomem
echo "========== cat /proc/modules =========="
cat /proc/modules
echo "========== cat /proc/rk_cma/rk-dma-heap-cma =========="
cat /proc/rk_cma/rk-dma-heap-cma
INTERVAL_S=90 # record every 90 seconds defaultly
PIDs=""

while getopts "i:p:o:" arg; do
        case $arg in
        i)
                INTERVAL_S=$OPTARG
                ;;
        p)
                PIDs=$OPTARG
                ;;
        ?)
                show_usage
                exit 1
                ;;
        esac
done

while true; do

        echo "========== uptime =========="
        uptime
        echo "========== /proc/loadavg =========="
        cat /proc/loadavg
        echo "========== get_cpu_usage =========="
        get_cpu_usage
        echo "========== /proc/stat =========="
        cat /proc/stat
        echo "========== /proc/swaps =========="
        cat /proc/swaps
        echo "========== df -h =========="
        df -h
        echo "========== mount =========="
        mount
        echo "========== free -m =========="
        free -m
        echo "========== top =========="
        top -b -n 1
        echo "========== rockit node =========="
        cat /dev/mpi/vsys
        cat /dev/mpi/vmcu
        cat /dev/mpi/valloc
        cat /dev/mpi/vlog
        cat /dev/mpi/vrgn
        echo "========== mpp node =========="
        cat /proc/vcodec/enc/venc_info
        echo "========== cif node =========="
        cat /proc/rkcif-mipi-lvds
        echo "========== /proc/meminfo =========="
        cat /proc/meminfo
        echo "========== cat dev/mpi/vsys =========="
        cat /dev/mpi/vsys
        echo "========== cat /dev/mpi/vlog =========="
        cat /dev/mpi/vlog
        echo "========== cat dev/mpi/vsys =========="
        cat /dev/mpi/vsys
        echo "========== cat /proc/vcodec/enc/venc_info =========="
        cat /proc/vcodec/enc/venc_info
        echo "========== cat /proc/rk_dmabuf/sgt =========="
        cat /proc/rk_dmabuf/sgt
        echo "========== cat /proc/rk_dmabuf/dev =========="
        cat /proc/rk_dmabuf/dev
        echo "========== cat /proc/rkcif-mipi-lvds =========="
        cat /proc/rkcif-mipi-lvds
        echo "========== cat /proc/rkisp-vir0 =========="
        cat /proc/rkisp-vir0

        echo "========== sysrq meminfo =========="
        if [ -f "/proc/sysrq-trigger" ]; then
                echo 'm' >/proc/sysrq-trigger
                dmesg | tail -n 50 | grep -A50 "Show Memory"
        fi
        echo "========== dumpsys meminfo =========="
        dumpsys meminfo -a
        echo "========== procrank =========="
        procrank
        echo "========== ps -T =========="
        ps -T
        echo "========== /proc/buddyinfo =========="
        cat /proc/buddyinfo
        echo "========== /proc/pagetypeinfo =========="
        cat /proc/pagetypeinfo
        echo "========== /proc/vmallocinfo =========="
        cat /proc/vmallocinfo
        echo "========== /proc/vmstat =========="
        cat /proc/vmstat
        echo "========== /proc/zoneinfo =========="
        cat /proc/zoneinfo
        #zj add b
        #echo "========== /sys/kernel/ion/total_heaps_kb =========="
        #cat /sys/kernel/ion/total_heaps_kb
        #zj add e
        if [ -d "/sys/kernel/debug/ion" ]; then
                echo "========== ION Memory =========="
                get_ion_info
        fi

        echo "========== /proc/rk_dma_heap/dma_heap_info =========="
        if [ -f "/proc/rk_dma_heap/dma_heap_info" ]; then
                cat /proc/rk_dma_heap/dma_heap_info
        fi

        if [ -d "/sys/kernel/debug/dri" ]; then
                echo "========== DRM Memory =========="
                get_drm_info
        fi

        if [ -f "/sys/kernel/debug/dma_buf/bufinfo" ]; then
                echo "========== DMA Buf =========="
                cat /sys/kernel/debug/dma_buf/bufinfo
        fi

        echo "========== /proc/zoneinfo =========="
        cat /proc/zoneinfo
        echo "========== lsof =========="
        lsof
        echo "========== du -abc =========="
        du -abc /
        echo "========== /proc/interrupts =========="
        cat /proc/interrupts

        #for PID in ${PIDs[@]}
        #do
        #       echo "========== showmap $PID =========="
        #showmap $PID
        #done
        sleep $INTERVAL_S

done

do_exit
# 



相关推荐
Championship.23.2435 分钟前
Linux 3.0 锁机制与故障排查详解
linux·运维·服务器
天疆说1 小时前
Zotero Connector 在 Edge 里找不到桌面 Zotero(Linux / Zotero 9.0.6 / Edge 150)
linux·前端·edge
风123456789~3 小时前
【Linux专栏】ls 排除某个文件
linux·运维·服务器
IT曙光3 小时前
ubuntu apt-get离线源制作
linux·ubuntu
其实防守也摸鱼3 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚4 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
玖玥拾5 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
土星云SaturnCloud5 小时前
边缘计算驱动绿氢生产过程智能寻优:电解槽级实时优化技术解析
服务器·人工智能·ai·边缘计算
Darkwanderor5 小时前
对Linux的进程控制的研究
linux·运维·c++
Web极客码6 小时前
突破并发瓶颈:云端高性能架构如何赋能海外 AI Agent 矩阵的高效产出
服务器·人工智能·架构