天天看點

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",更多精彩文章第一時間釋出!