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
# 



相关推荐
nxb5566 小时前
haproxy算法,ip透传,自定义haproxy错误页面
运维·服务器
Nebula嵌入式7 小时前
【C语言】09-深入解析main函数
linux·c语言·开发语言·嵌入式
Dxy12393102168 小时前
Linux 编译安装 Python 3.12.10(多版本共存,不破坏系统Python)
linux·运维·python
xz驱动分享9 小时前
Linux DMA 子系统学习笔记
linux·dma·rk3588·嵌入式软件
w678200710 小时前
Prisma不能优雅的支持DTO,试试Vona ORM吧
linux·运维·ubuntu
Darkwanderor10 小时前
Linux系统编程实战项目:模拟实现shell
linux·c++
便利店102411 小时前
TCP 为什么有时故意跑不快?拥塞控制与滑动窗口一次讲清
服务器·网络协议·tcp·拥塞控制
杨某不才12 小时前
如何能让Linux服务器对shell 终端 + sftp 文件传输长期保活
linux·运维·服务器
vance0412 小时前
免费Cloudflare隧道隐藏公网IP
linux·tcp/ip·github
杨云龙UP12 小时前
生产环境Oracle表空间扩容实战:使用Toad for Oracle图形界面新增Datafile(ASM+OMF)
linux·运维·数据库·oracle·表空间·asm 存储管理·toad