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",更多精彩文章第一时间发布!

原文地址:https://www.cnblogs.com/liushengchieh/p/10514978.html

时间: 2024-08-03 01:53:51

Shell脚本 | 性能测试之CPU占有率的相关文章

[Android Pro] Android应用性能测试之CPU和内存占用(转载)

首先稍做分析一下测试环境:我们知道CPU和内存占用是一个实时变化的状态,而市面上还没有具体的哪款android应用能做到实时监控CPU和内存占用并使用log日志保存.考虑到android的底层框架是基于Linux的平台,所有我们可以通过Linux的资源监控命令来实现对android平台的资源实时监控. 要做到上边的测试环境的实现,需要具备以下几点: 1.被测试的手机具备root权限:因为涉及到底层的linux命令,需要读取或执行相应的文件.至于如何root你的手机,不同型号的手机root的方法不

Android应用性能测试之CPU和内存占用

最近发现自己学的很多东西没有做好积淀的工作,也萌生了写一些东西的念头.本人也没有写博客的习惯,下边就写一下手机端的性能测试. 最近公司,要我们从事对竞品的性能测试,我负责CPU和内存的性能测试,下面就和大家来分享一下android应用程序的CPU和内存的性能测试. 首先稍做分析一下测试环境:我们知道CPU和内存占用是一个实时变化的状态,而市面上还没有具体的哪款android应用能做到实时监控CPU和内存占用并使用log日志保存.考虑到android的底层框架是基于Linux的平台,所有我们可以通

shell脚本之获取CPU使用率

今天一个同事要测试OJ项目,同时我这边也需要知道他在压测过程中, CPU的使用率怎么样,虽说可以用top实时查看,但是进程太多了,我不需要获取那么多信息,我仅仅只要知道当前压测过程中CPU实时的使用率是多少,然后根据这个使用率,当达到一定的使用率时,我后台调用对应的接口开启服务器,将负载转移到另外一台服务器上.这算是一种动态的负载均衡或者用一句名词来说,这就是弹性伸缩的一种体现. 将下面cpu.sh 加入crontab中每秒或者每分钟定时执行,同时你还需要建立对应的日志文件,因为有助于你实时查看

shell脚本每隔2s获取某个进程的cpu和mem数据并保存到csv文件

shell脚本每隔2s获取某个进程的cpu和mem数据并保存到csv文件 shell脚本如下echo "%CPU,%MEM" > cpu_test.csvpid=1 #Can be change by yourselfwhile true do top -bn1 -n 1 -p $pid | tail -1 | awk '{ print $9,$10 }' | sed 's/ /,/' >> cpu_test.csv sleep 2 #delay timedone 脚

【shell脚本实例】一个恶作剧—— kill掉占用CPU较高的matlab进程

我们实验室有台服务器,博士们在服务器上跑MATLAB,基本都是4核都是超过95%的CPU占用,想了个恶作剧的shell 定时kill掉MATLAB程序,是不是很邪恶啊,哈哈~~~  不过我只是干过一次,因为老伯们也不容易啊,屌丝何苦为难屌丝... 废话不多说了上脚本! ? 1 2 3 找出CPU占用超过90%的MATLAB进程,grep -v 去掉"grep"进程 pids=`ps aux|grep "MATLAB"|grep -v "grep"

使用自动化shell脚本查找CPU使用的详细线程信息

项目加了些拦截器代码后,CPU报警,显示CPU使用率超过100%: 想要查找到底是哪些代码消耗的资源过多,从网上找到一篇博文,转载如下: http://blog.csdn.net/guixunlong/article/details/8450897 在知道哪个Java进程CPU占用率过高以后: 1.使用命令 jstack PID 命令打印出CPU占用过高进程的线程栈,例如jstack 12012 > 12012.txt 2.使用top -H -p PID 命令查看对应进程是哪个线程占用CPU过高

找出1小时内占用cpu最多的10个进程的shell脚本

cpu时间是一项重要的资源,有时,我们需要跟踪某个时间内占用cpu周期最多的进程. 在普通的桌面系统或膝上系统中,cpu处于高负荷状态也许不会引发什么问题.但对于需要处理大量请求的服务器来讲,cpu是极其重要的资源. 通过监视某个时期内cpu的使用情况,我们可以找出长期占用cpu的进程并对其进行优化,或调试其它相关问题. 在linux系统中,ps命令用于收集系统中进程的详细信息.这些信息包括cpu使用情况.正在执行的命令.内存使用.进程状态等.记录在一个小时内占用过的cpu的进程,然后通过恰当地

shell脚本统计多个CPU利用率

本节主要内容:top命令统计CPU的利用率 一,问题分析 MySQL在Linux下是多线程的,而且只能将多个线程分布到一个CPU上.因此,使用小型服务器,或者PC SERVER,多个CPU利用率并不高.基本上有1~2个在使用. 本节分享下统计CPU的利用率的方法,供大家学习参考. 相关阅读:查看Linux系统资源占用(top.free.uptime)top命令显示内容的详细解释 二,shell脚本实现 1.输入 top  -bn1  (b控制输出格式为文本格式,非交互格式) [[email pr

一个统计 CPU 内存 硬盘 使用率的shell脚本

一个统计 CPU 内存 硬盘 使用率的shell脚本,供大家学习参考 #!/bin/bash #This script is use for describle CPU Hard Memery Utilization total=0 idle=0 system=0 user=0 nice=0 mem=0 vmexec=/usr/bin/vmstat which sar > /dev/null 2>&1 if [ $? -ne 0 ] then ver=`vmstat -V | awk