2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Android内存压力测试工具(memtester移植)

Android内存压力测试工具(memtester移植)

时间:2019-06-25 08:52:34

相关推荐

Android内存压力测试工具(memtester移植)

该文章转载于:

android用memtester内存压力测试_W歹匕示申W的博客-CSDN博客

Android内存压力测试工具(memtester移植)_甜牛奶蛋糕的博客-CSDN博客_android 内存压力测试

DRR参考配置OK之后,首先需要的是对DDR进行压力测试保证DDR的稳定性,否则DDR出问题之后,很容易引起奇奇怪怪的问题,很难分析问题原因

memtester说明:

memtester主要用于测试内存稳定性

官网:https://pyropus.ca./software/memtester/old-versions/

版本:memtester-4.3.0.tar.gz(目前最新版本-.10.21)

官方已经预编译了大部分Linux系统的二进制文件,可以直接使用,现在我们将它移植到Android系统中。

移植

首先我们看看Makefile文件它在Linux系统是怎么编译的,这里移植memtester-4.3.0.tar.gz压缩包里的文件不需要任何修改。

memtester: \$(OBJECTS) memtester.c tests.h tests.c tests.h conf-cc Makefile load extra-libs./load memtester tests.o `cat extra-libs`

从上面的Makefile可以知道,要编译memtester需要编译memtester.c和tests.c以及相关的头文件,所以我们可以写出下面的Android.mk文件。

​LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES := memtester.c tests.cLOCAL_C_INCLUDES := $(LOCAL_PATH)LOCAL_MODULE := memtesterinclude $(BUILD_EXECUTABLE)

memtester-4.3.0.tar.gz解压到system/core/目录下,并命名为memtester目录,并把Android.mk放到同一目录。文件如下显示。

~/project$ tar -zxvf memtester-4.3.0.tar.gz -C AndroidO_8827LGO_1207/system/core/~/project$ cd AndroidO_8827LGO_1207/system/core/memtester~/project/AndroidO_8827LGO_1207/system/core/memtester$tree.├── Android.mk├── BUGS├── CHANGELOG├── conf-cc├── conf-ld├── COPYING├── extra-libs.sh├── find-systype.sh├── make-compile.sh├── Makefile├── make-load.sh├── make-makelib.sh├── memtester.8├── memtester.c├── memtester.h├── README├── README.tests├── sizes.h├── tests.c├── tests.h├── trycpp.c├── types.h└── warn-auto.sh

先编译成模块进行测试:

~/project/AndroidO_8827LGO_1207/system/core/memtester$ mm -j8........5 warnings generated.[100% 6/6] Install: out/target/product/petrel-p1/system/bin/memtestermake: Leaving directory '/home/lemon/Develop/OrangePi_Lite2/android'#### make completed successfully ####

然后就可以通过

adb push memtester /system/bin/adb shell "chmod 777 /system/bin/memtester"adb shell memtester

最后添加到device.mk中,系统全编译时打包到系统,所以还需要在device.mk里面进行定义

PRODUCT_PACKAGES += memtester

测试

使用方法:Usage: memtester [-p physaddrbase [-d device]] [B|K|M|G] [loops],比如memtester 5M 1,对应测试1次5M内存

PS C:\Users\zhaojr\Documents\adb> ./adb rootadbd is already running as rootPS C:\Users\zhaojr\Documents\adb> ./adb remountremount succeededPS C:\Users\zhaojr\Documents\adb> ./adb shell8227LGO_demo:/ # memtester memtester version 4.3.0 (32-bit)Copyright (C) 2001- Charles Cazabon.Licensed under the GNU General Public License version 2 (only).pagesize is 4096pagesizemask is 0xfffff000need memory argument, in MBUsage: memtester [-p physaddrbase [-d device]] <mem>[B|K|M|G] [loops]

查看系统空闲内存,还有251M

8227LGO_demo:/ # free -hfree -htotal used freesharedbuffersMem: 443M 432M 11M 328K 576K-/+ buffers/cache: 431M 12MSwap: 329M 73M 256M8227LGO_demo:/ #

演示:memtester 5M 1,这里只是演示,测试1次5M内存,实际项目中这两个参数应尽可能大,才能覆盖整块内存,才能达到压力测试的结果,测试时失败有相应的log,我这里比较难复现就不贴了。

8227LGO_demo:/ # memtester 5M 1 memtester version 4.3.0 (32-bit)Copyright (C) 2001- Charles Cazabon.Licensed under the GNU General Public License version 2 (only).pagesize is 4096pagesizemask is 0xfffff000want 5MB (5242880 bytes)got 5MB (5242880 bytes), trying mlock ...locked.Loop 1/1:Stuck Address : ok Random Value : okCompare XOR : okCompare SUB : okCompare MUL : okCompare DIV : okCompare OR : okCompare AND : okSequential Increment: okSolid Bits : ok Block Sequential : ok Checkerboard : ok Bit Spread : ok Bit Flip : ok Walking Ones : ok Walking Zeroes : ok Done.8227LGO_demo:/ #

Android APK的应用

主文件:package com.example.ddr;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager.NameNotFoundException;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;public class MainActivity extends Activity {private static final String TAG = null;private static TextView test_result = null;static String test_setText = "";static int Testing_times = 0;String asdddd1 = "screencap -p /sdcard/screen1.png";String asdddd2 = "screencap -p /sdcard/screen2.png";String dir = "/data/data/com.example.ddr/files/"; Context ctxDealFile = null;String oldPath1 = "file:///android_asset/memtester";String oldPath2 = "file:///memtester";String newPath1 = Environment.getRootDirectory().getPath();//"system/";//"system/bin/";String MemtesterFileName = "/data/memtester_result.txt";String simpleMemtester_1 = "memtester -b -g -f 1190400--1190400 64M 1";String complexMemtester_1 = "memtester -b -j 0 -k 4 -g -l 40 -a 64M";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);test_result = (TextView)findViewById(R.id.Memtester_01);System.out.println("csh ddr star");Memtester(simpleMemtester_1);Memtester(complexMemtester_1);//ReadTxtFile(MemtesterFileName);//copyFile(oldPath2,newPath1);/*String uiFileName = "memtester";try {ctxDealFile = this.createPackageContext("com.example.ddr",Context.CONTEXT_IGNORE_SECURITY);} catch (NameNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} deepFile(ctxDealFile, uiFileName);*/}public void deepFile(Context ctxDealFile, String path) {try {String str[] = ctxDealFile.getAssets().list(path);if (str.length > 0) {System.out.println("csh deepFile 1");File file = new File("/system/" + path);file.mkdirs();for (String string : str) {path = path + "/" + string;System.out.println("zhoulc:\t" + path);// textView.setText(textView.getText()+"\t"+path+"\t");deepFile(ctxDealFile, path);path = path.substring(0, path.lastIndexOf('/'));}} else {System.out.println("csh deepFile 2");InputStream is = ctxDealFile.getAssets().open(path);//FileOutputStream fos = new FileOutputStream(new File(getFilesDir().getAbsolutePath()+"/memtester"));FileOutputStream fos = ctxDealFile.openFileOutput(path, ctxDealFile.MODE_WORLD_READABLE |ctxDealFile.MODE_WORLD_WRITEABLE);byte[] buffer = new byte[1024];int count = 0;while (true) {count++;int len = is.read(buffer);if (len == -1) {break;}fos.write(buffer, 0, len);}is.close();fos.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}Process p;Process p2;try {p = Runtime.getRuntime().exec("chmod 777 " + dir + path);p.waitFor();p2 = Runtime.getRuntime().exec("cp /data/data/com.example.ddr/files/memtester > /data/data/com.example.ddr/files/memtester2");p2.waitFor();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void Memtester(String command){Runtime r = Runtime.getRuntime();Process p;Testing_times ++;try {p = r.exec(command);BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));String inline;while ((inline = br.readLine()) != null) {System.out.println(inline);}br.close();p.waitFor();ReadTxtFile(MemtesterFileName);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*public void Memtester2(String command){DataOutputStream os = null;Process p;try{p =Runtime.getRuntime().exec(isRoot?COMMAND_SU:COMMAND_SH);os = new DataOutputStream(p.getOutputStream());for (String command:commands){if(command==null){continue;}//donnotuseos.writeBytes(commmand),avoidchinesecharseterroros.write(command.getBytes());os.writeBytes(COMMAND_LINE_END);os.flush();try{}catch(Exception e){e.printStackTrace();}}*/public static String ReadTxtFile(String strFilePath){String path = strFilePath;String content = "";File file = new File(path);if (file.isDirectory()){Log.d("TestFile", "The File doesn't not exist.");}else{try {InputStream instream = new FileInputStream(file); if (instream != null) {InputStreamReader inputreader = new InputStreamReader(instream);BufferedReader buffreader = new BufferedReader(inputreader);String line;while (( line = buffreader.readLine()) != null) {content += line + "\n";//if(inline.equals("SUCCESS")){if(line.indexOf("SUCCESS")!=-1){test_setText += Testing_times + " : " + "SUCCESS \n";test_result.setText(test_setText);}else{test_setText += Testing_times + " : " + "FAIL \n";test_result.setText(test_setText);}}instream.close();}}catch (java.io.FileNotFoundException e) {Log.d("TestFile", "The File doesn't not exist.");} catch (IOException e) {Log.d("TestFile", e.getMessage());}}return content;} /*private void simpleMemtester(){Log.d(TAG, "do simple memory test");openCmdList1.clear();try {openCmdList1.add("memtester -b -g -f 1190400--1190400 64M 1");exec(openCmdList1);memoryTestResult();} catch (Exception e) {e.printStackTrace();}}private void complexMemtester(){Log.d(TAG, "do complex memory test");openCmdList1.clear();try {openCmdList1.add("memtester -b -j 0 -k 4 -g -l 40 -a 64M");exec(openCmdList1);memoryTestResult();} catch (Exception e) {e.printStackTrace();}}*/@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}}

APK预置到代码里面给个系统权限:

Android.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_CERTIFICATE := platformLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_SDK_VERSION := currentLOCAL_PACKAGE_NAME := ddrinclude $(BUILD_PACKAGE)# Use the following include to make our test apk.include $(call all-makefiles-under,$(LOCAL_PATH))配置文件配置手机UID权限:<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.example.memtester_ckt"android:versionCode="1"android:versionName="1.0"android:sharedUserId="android.uid.system"><uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="21" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

把文件用android代码预置到手机system/bin下面,也就给手机配置了脚本环境:

CSH_DDR_PATH := packages/apps/ddr/assetsPRODUCT_COPY_FILES := $(CSH_DDR_PATH)/memtester:system/bin/memtester $(PRODUCT_COPY_FILES)

linux嵌入式环境下的使用:

#!/bin/sh# Memory Tester Scripts# by KaKa# version = dateVERSION="Fri Oct 19 11:56:57 CST "# trap for irruptionsMEMTESTER=${PWD}/memtesterPPIDKILL=$$SIDKILL=$$trap "pkill -9 -P ${PPIDKILL};kill -9 $$" INTtrap "pkill -9 -P ${PPIDKILL};kill -9 $$" KILLcat <<-EOF_vpps >&2Version: ${VERSION}PID: $$PPIDKILL: ${PPIDKILL}SIDKILL: ${PPIDKILL}EOF_vppsCORE_NUM=$(grep -i ^processor /proc/cpuinfo|wc -l)MEMTESTERCOPY=${CORE_NUM}MEM_TOTAL_K=$(awk '/^MemTotal/{print $2}' /proc/meminfo)MEM_RESERVE_PERCENTAGE=$((1000*50/1024))MEM_RESERVED=$((MEM_TOTAL_K/1024*MEM_RESERVE_PERCENTAGE/1000))MEM_TOTAL_TOBETESTED=$((MEM_TOTAL_K/1024-MEM_RESERVED))MEM_PER_COPY=$((MEM_TOTAL_TOBETESTED/MEMTESTERCOPY))RUN_DURATION_TIME=0RUN_LOOPS=-1RUN_DURATION_TIME_FLAG=0RUN_LOOPS_FLAG=0DDPERCOPY_TIME=6sLOGDIR=/tmp/memtester-log-${$}mkdir -p ${LOGDIR}show_help () {cat <<HELPEOF >&2Version: ${VERSION}Usage: $(basename ${0})-r Directory: the root location of memtester binary file-c NUMBER: the copies of memtester should be run-m NUMBER: how many memory should be tested totally (in MB)-t TIME: duration mode, how long will the tests go-l NUMBER: loops mode,how many loops will each memtester should goThe option -t and -l are exclusive, which means tests could workonly with 1. duration mode or 2. loops modeRUN 4 copies memtester with in 24 hours, to test total 4000 MB memory:$(basename ${0}) -t 24h -c 4 -m 4000RUN 2 copies memtester with in 1 hours, to test total 4000 MB memory:$(basename ${0}) -t 1h -c 4 -m 4000RUN 4 copies memtester with in 2 loops, to test total 3600 MB memory:$(basename ${0}) -l 2 -c 4 -m 3600-V/-h/-H: show this info.HELPEOFexit 0}while getopts :c:m:t:l:r:p:hHVvx OPTIONdocase ${OPTION} inc)#echo "-c ${OPTARG}"MEMTESTERCOPY=${OPTARG};;m)#echo "-m ${OPTARG} MB"MEM_TOTAL_TOBETESTED=${OPTARG}MEM_RESERVED=$((MEM_TOTAL_K/1024-MEM_TOTAL_TOBETESTED));;t)#echo "-t ${OPTARG}"[ 0 -ne ${RUN_LOOPS_FLAG} ] && echo "-t and -l are exclusive." && exit 222RUN_DURATION_TIME=${OPTARG}RUN_DURATION_TIME_FLAG=1;;l)#echo "-l ${OPTARG}"[ 0 -ne ${RUN_DURATION_TIME_FLAG} ] && echo && echo "-t and -l are exclusive." && show_help && echo && exit 223RUN_LOOPS=${OPTARG};RUN_LOOPS_FLAG=1;;d)#echo "-r ${OPTARG}"MEMTESTER=${OPTARG}/memtester;;p)#echo "-p ${OPTARG}"MEMTESTER=${OPTARG};;V|h|H)show_help;;v)set -v;;x)set -x;;?)echo "Error...";echo "?Unknown args..."exit 224;;*)#echo "*Unknown args..."esacdone#exit[ 0 -eq ${RUN_DURATION_TIME_FLAG} ] && [ 0 -eq ${RUN_LOOPS_FLAG} ] &&echo && echo "Please specified which mode should we run... -t or -l" &&show_help && echo && exit 225MEM_PER_COPY=$((MEM_TOTAL_TOBETESTED/MEMTESTERCOPY))echo "Mem total: " $((MEM_TOTAL_K/1024)) MBecho "Core total: "${CORE_NUM}echo "Memtester copys: " ${MEMTESTERCOPY}echo "Mem per copy: "${MEM_PER_COPY}echo "Mem total to used: "${MEM_TOTAL_TOBETESTED} MBif [ ${MEM_RESERVED} -lt 1 ]; thenecho "Mem reserved: -- No more memory reserved..."else echo "Mem reserved: "${MEM_RESERVED} MBfi#exit# GOGOGOif [ 0 -ne ${RUN_DURATION_TIME_FLAG} ]; thenecho "Run within a duration: ${RUN_DURATION_TIME}"elif [ 0 -ne ${RUN_LOOPS_FLAG} ]; thenecho "Run within a loop: ${RUN_LOOPS}"fiecho "Working directory: " $PWDecho "Memtester: " ${MEMTESTER}echo "LOGs directory: " $LOGDIRechoecho -n "Jobs started at date: "date #+%Y/%m/%d\ %H:%Mecho#exit######################### Run testing within a duration time.if [ 0 -ne ${RUN_DURATION_TIME_FLAG} ]; then# prepareing the sleeping killerssleep ${RUN_DURATION_TIME}echo -n "End of testing(TIMEOUT)... "echo "KILL CHILD" && kill -9 $(pgrep -P ${PPIDKILL} memtester) && echo"Childen processes - KILLED."# attention to how the memtesters are forked...echo "KILL PARENT" && kill $$ && echo "KILLED." &echo "Finished the memtester"echo -n "Jobs finished at date: "date #+%Y/%m/%d\ %H:%Mfi &echo -n "Waiting (PID: $$) for ${MEMTESTERCOPY}memtesters(${MEM_PER_COPY}MB for each). "if [ 0 -ne ${RUN_DURATION_TIME_FLAG} ]; thenecho -n "For time: ${RUN_DURATION_TIME} "fiif [ 0 -ne ${RUN_LOOPS_FLAG} ]; thenecho -n "For loops: ${RUN_LOOPS} "fiecho "..."while truedoMEMTESTER_NUM=0echo -n "{"while [ ${MEMTESTER_NUM} -lt ${MEMTESTERCOPY} ]doecho -n " ${MEMTESTER_NUM} "if [ 0 -ne ${RUN_DURATION_TIME_FLAG} ]; thenRUN_LOOPS=0fi${MEMTESTER} ${MEM_PER_COPY} ${RUN_LOOPS} 2>&1 >> ${LOGDIR}/${MEMTESTER_NUM}.log &# set loops = 0 to make memtester run loop infinitely...# .pogo version will run only one loop by defaultsleep ${DDPERCOPY_TIME}MEMTESTER_NUM=$(expr $MEMTESTER_NUM + 1)doneecho -n "}"wait[ 0 -ne ${RUN_LOOPS_FLAG} ] && break# memtesters' loops...done########################echoecho -n "End of testing(Excution ended)... "pkill -9 -P ${PPIDKILL}kill $$echo "Finished the memtester"echo -n "Jobs finished at date: "date #+%Y/%m/%d\ %H:%M

运行这个脚本:

sh memory.sh -c <number> -l <number> -m <memory>

-c:运行几个memtester

-l:运行几次

-m:测试多大的内存,直接填测试总数即可,程序会自动分配个平均值给每个memtester,这样省去我们自己的计算,也不用多开几个终端了,单位MB,例如我有一个四核CPU,32G 内存的机器,就可以这样运行:

sh memory.sh -c 4 -l 1 -m 3100

大家可以看这个脚本中还可以限定时间,例如我想运行24个小时

sh memory.sh -t 24h -c 4 -m 3100

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。