Shell脚本 | 性能测试之CPU占有率详解程序员

Android 是一个基于 Linux 内核的移动操作系统,Linux 的 CPU 占有率的计算方式也可以应用到 Android App 上。

今天分享的这个脚本的功能,是在多核情况下计算进程的 CPU 占有率。详细的算法,有一篇别人写的关于 Linux 环境下计算进程和线程的 CPU 占有率的文章,推荐一读,链接附在文末。

这里就简单说下计算步骤吧:
1.获取测试设备的 CPU 核心数
2.计算进程的 CPU 使用时间
3.计算总的 CPU 使用时间
4.进程的 CPU 使用率 = (进程的 CPU 使用时间 / 总的 CPU 使用时间) * CPU 核心数 * 100

代码如下:

#!/usr/bin/env bash 
# 创建输出文件夹和临时文件夹 
function init_data() { 
    if [[ ! -d ${OUTPUT} ]]; then 
        mkdir -p ${OUTPUT} 
    fi 
    if [[ ! -d ${TEMP_FILE} ]]; then 
        mkdir -p ${TEMP_FILE} 
    fi 
} 
# 通过adb shell ps命令获取进程号 
function get_pid() { 
    adb shell ps | grep ${1} | tr -d $'/r' | awk '{print $2}' | head -n 1 
} 
# 通过adb shell cat /proc/cpuinfo命令计算出CPU核心数 
function get_cpu_ker() { 
    adb shell cat /proc/cpuinfo | grep "processor" > ${TEMP_FILE}/processor_count 
    cpu_ker_count=`awk 'END{print NR}' ${TEMP_FILE}/processor_count` 
    echo ${cpu_ker_count} 
} 
# 通过adb shell cat /proc/<pid>/stat命令计算出进程CPU时间 
function process_cpu_time() { 
    adb shell cat /proc/${1}/stat > ${TEMP_FILE}/process_cpu_time 
    utime=$(cat ${TEMP_FILE}/process_cpu_time | awk '{print $14}') 
    stime=$(cat ${TEMP_FILE}/process_cpu_time | awk '{print $15}') 
    cutime=$(cat ${TEMP_FILE}/process_cpu_time | awk '{print $16}') 
    cstime=$(cat ${TEMP_FILE}/process_cpu_time | awk '{print $17}') 
    result=`expr ${utime} + ${stime} + ${cutime} + ${cstime}` 
    echo ${result} 
} 
# 通过adb shell cat /proc/stat命令计算出总CPU时间 
function total_cpu_time() { 
    adb shell cat /proc/stat > ${TEMP_FILE}/total_cpu_time 
    cat ${TEMP_FILE}/total_cpu_time | grep "cpu" | head -n 1 > ${TEMP_FILE}/total_cpu 
    user=$(cat ${TEMP_FILE}/total_cpu | awk '{print $2}') 
    nice=$(cat ${TEMP_FILE}/total_cpu | awk '{print $3}') 
    system=$(cat ${TEMP_FILE}/total_cpu | awk '{print $4}') 
    idle=$(cat ${TEMP_FILE}/total_cpu | awk '{print $5}') 
    iowait=$(cat ${TEMP_FILE}/total_cpu | awk '{print $6}') 
    irq=$(cat ${TEMP_FILE}/total_cpu | awk '{print $7}') 
    softirq=$(cat ${TEMP_FILE}/total_cpu | awk '{print $8}') 
    result=`expr ${user} + ${nice} + ${system} + ${idle} + ${iowait} + ${irq} + ${softirq}` 
    echo ${result} 
} 
# 计算进程的CPU占有率 
function get_cpu_rate() { 
    process_cpu_time1=`process_cpu_time ${1}` 
    total_cpu_time1=`total_cpu_time` 
    sleep 1s 
    process_cpu_time2=`process_cpu_time ${1}` 
    total_cpu_time2=`total_cpu_time` 
    process_cpu_time3=$(( ${process_cpu_time2} - ${process_cpu_time1} )) 
    total_cpu_time3=$(( ${total_cpu_time2} - ${total_cpu_time1} )) 
    cpu_rate=$(bc <<< "scale=3;(${process_cpu_time3}/${total_cpu_time3})*${2}*100") 
    result=$(echo "scale=0;${cpu_rate}/1" | bc -l) 
    echo ${result} 
} 
# 获取脚本所在的路径 
WORKSPACE=`pwd` 
# 输出文件夹 
OUTPUT=${WORKSPACE}/output_cpu 
# 临时文件夹 
TEMP_FILE=${OUTPUT}/temp 
# 创建文件夹 
init_data 
# 获取应用包名 
PACKAGE_NAME=${1} 
# 获取进程号 
pid=`get_pid ${PACKAGE_NAME}` 
# 获取CPU核心数 
cpu_ker=`get_cpu_ker` 
# CPU占有率 
rate=`get_cpu_rate ${pid} ${cpu_ker}` 
echo ${rate} 
# 返老还童 
rm -r output_cpu

参考链接:
Linux环境下进程的CPU占用率


欢迎关注微信公众号”测试开发Stack”,更多精彩文章第一时间发布!

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/3072.html

(0)
上一篇 2021年7月16日 01:38
下一篇 2021年7月16日 01:38

相关推荐

发表回复

登录后才能评论