A userspace utility for testing the memory subsystem for faults. It's portable and should compile and work on any 32- or 64-bit Unix-like system. (Yes, even weird, proprietary Unices, and even Mac OS X.) For hardware developers, memtester can be told to test memory starting at a particular physical address as of memtester version 4.1.0.
操作步骤如下:
[root@localhost ~]# wget
http://pyropus.ca/software/memtester/old-versions/memtester-4.2.0.tar.gz
[root@localhost ~]# tar -xvf memtester-4.2.0.tar.gz [root@localhost ~]# cd memtester-4.2.0 [root@localhost ~]# make && make install [root@localhost memtester-4.2.0]# vi README Using memtester
Usage is simple for the basic case. As root, run the resulting memtester binary with the following commandline:
memtester <memory> [runs]
An optional "-p physaddr" argument available to cause memtester to test
memory starting at a specific physical memory address (by mmap'ing /dev/mem starting at an offset of `physaddr`, which is given in hex). #以上是节选,直接跟要测试的内存的大小就可以,默认单位是M,也可以手动指定为B, K, M, or G; -p参数是指定内存物理地址的。 For example, if you want to test a bank of RAM or device which is 64kbytes in size and starts at physical
address 0x0C0000, you would run memtester as follows:
memtester -p 0x0c0000 64k [runs]
[root@localhost memtester-4.2.0]# memtester 256 memtester version 4.2.0 (32-bit) Copyright (C) 2010 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).
pagesize is 4096
pagesizemask is 0xfffff000 want 256MB (268435456 bytes)
got 256MB (268435456 bytes), trying mlock ...locked. Loop 1:
Stuck Address : ok Random Value : ok Compare XOR : ok Compare SUB : ok Compare MUL : ok Compare DIV : ok Compare OR : ok Compare AND : ok Sequential Increment: ok Solid Bits : ok Block Sequential : ok Checkerboard : ok Bit Spread : ok Bit Flip : ok Walking Ones : ok Walking Zeroes : ok 8-bit Writes : ok 16-bit Writes : ok
注:测试结果仅仅截取了一部分。我测试的过程中,使用的机器内存为1G,swap分区为4G。首次测试时,将测试的内存大小指为1G,机器死机。个人认为是由于memtester将 内存全部占用导致的。
运行memteste非常简单,作为root ./ memtester <memory> [runs] <memory>:内存大小,单位M [runs]:运行次数
这样我们就可以对单颗CPU的机器进行测试,查看内存是否足够稳定。 但如果我有多颗CPU和较大的memory呢?最简单的方法是多开几个终端,同时运行memtester,每个CPU分配同样大小的内存。 还有一种方法可以使用Baif编写的一个脚本memtester-multi.sh,位置放在memtester-4.0.7下就可以了。 这个脚本只在linux下有效! #!/bin/sh
# Memory Tester Scripts
# by Baif
# version = date
VERSION="Fri Oct 19 11:56:57 CST 2007"
# trap for irruptions
MEMTESTER=${PWD}/memtester PPIDKILL=$$ SIDKILL=$$
trap "pkill -9 -P ${PPIDKILL};kill -9 $$" INT trap "pkill -9 -P ${PPIDKILL};kill -9 $$" KILL
cat <<-EOF_vpps >&2
Version: ${VERSION} PID: $$
PPIDKILL: ${PPIDKILL} SIDKILL: ${PPIDKILL}
EOF_vpps
CORE_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)) # 95%
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=0 RUN_LOOPS=-1
RUN_DURATION_TIME_FLAG=0 RUN_LOOPS_FLAG=0 DDPERCOPY_TIME=6s
LOGDIR=/tmp/memtester-log-${$} mkdir -p ${LOGDIR}
show_help () {
cat <<-EOFshow_HELP >&2
Version: ${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 go
The option -t and -l are exclusive, which means tests could work only with 1. duration mode or 2. loops mode
RUN 4 copies memtester with in 24 hours, to test total 4000 MB memory:
$(basename ${0}) -t 24h -c 4 -m 4000
RUN 2 copies memtester with in 1 hours, to test total 4000 MB memory:
$(basename ${0}) -t 1h -c 4 -m 4000
RUN 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.
EOFshow_HELP
exit 0 }
while getopts :c:m:t:l:r:p:hHVvx OPTION do
case ${OPTION} in c)
#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 222
RUN_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 223 RUN_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..." esac done #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 225
MEM_PER_COPY=$((MEM_TOTAL_TOBETESTED/MEMTESTERCOPY))