1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun#/******************************************************************/ 3*4882a593Smuzhiyun#/* Copyright (C) ROCK-CHIPS . All Rights Reserved. */ 4*4882a593Smuzhiyun#/******************************************************************* 5*4882a593Smuzhiyun#File : flash_stress_test.sh 6*4882a593Smuzhiyun#Desc : flash write and read stress test tools 7*4882a593Smuzhiyun#Author : ZYF 8*4882a593Smuzhiyun#Date : 2020-07-16 9*4882a593Smuzhiyun#Notes : 10*4882a593Smuzhiyun# Revision Data Author Note. 11*4882a593Smuzhiyun# 1.00 2017/05/05 Zhaoyifeng 1.First version 12*4882a593Smuzhiyun# 1.10 2020/06/28 Dingqiang Lin(jon.lin@rock-chips.com) 1.Simplify test_log 2.Add more introduction 13*4882a593Smuzhiyun# 1.20 2020/07/16 Hans Yang 1.use /dev/urandom to generate test data 14*4882a593Smuzhiyun#Introduction. 15*4882a593Smuzhiyun#********************************************************************/ 16*4882a593Smuzhiyun# usage�� 17*4882a593Smuzhiyun# sudo flash_stress_test.sh dirnum testcount 18*4882a593Smuzhiyun# example �� 19*4882a593Smuzhiyun# count for script command: 20*4882a593Smuzhiyun# SLC Nand 128MB, 100K P/E cycles, normaly we test 5K P/E ���� 128MB * 5000 21*4882a593Smuzhiyun# src file size 5MB, totle test data 128MB * 5000, testcount = 128MB * 5000 / 5MB * 5(dirnum) = 20600 22*4882a593Smuzhiyun# command: 23*4882a593Smuzhiyun# sudo flash_stress_test.sh 5 20000 24*4882a593Smuzhiyun# available space need: 25*4882a593Smuzhiyun# src file size: 5MB 26*4882a593Smuzhiyun# des file size: 5MB * dirnum = 25MB 27*4882a593Smuzhiyun# log file size: 189B(log item size) * 20000 = 3691KB 28*4882a593Smuzhiyun# total: about 34MB 29*4882a593Smuzhiyun# result analyze: 30*4882a593Smuzhiyun# success: 31*4882a593Smuzhiyun# 1. shell progress stop; 32*4882a593Smuzhiyun# 2. print "-------copy and check success------------" 33*4882a593Smuzhiyun# fail: 34*4882a593Smuzhiyun# 1. shell progress stop; 35*4882a593Smuzhiyun# 2. any printing with "error" tag 36*4882a593Smuzhiyun# 37*4882a593Smuzhiyun#********************************************************************/ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyuntest_dir=/data/rockchip-test/flash_test 40*4882a593Smuzhiyunsource_dir=$test_dir/src_test_data 41*4882a593Smuzhiyundest_dir=$test_dir/des_test_data 42*4882a593Smuzhiyunmd5_dir=$test_dir/md5_data 43*4882a593Smuzhiyun 44*4882a593Smuzhiyunusage() 45*4882a593Smuzhiyun{ 46*4882a593Smuzhiyunecho "Usage: flash_stress_test.sh [dirnum] [looptime]" 47*4882a593Smuzhiyunecho "flash_stress_test.sh 5 20000" 48*4882a593Smuzhiyun} 49*4882a593Smuzhiyun 50*4882a593Smuzhiyuntest_max_count=200 51*4882a593Smuzhiyuntest_max_dir=5 52*4882a593Smuzhiyunif [ $1 -ne 0 ] ;then 53*4882a593Smuzhiyun test_max_dir=$1 54*4882a593Smuzhiyunfi 55*4882a593Smuzhiyun 56*4882a593Smuzhiyunif [ $2 -ne 0 ] ;then 57*4882a593Smuzhiyun test_max_count=$2 58*4882a593Smuzhiyunfi 59*4882a593Smuzhiyun 60*4882a593Smuzhiyunecho "Test Max dir Num = ${test_max_dir}" 61*4882a593Smuzhiyunecho "Test Max count = ${test_max_count}" 62*4882a593Smuzhiyun 63*4882a593Smuzhiyuncount=0 64*4882a593Smuzhiyundir_loop=0 65*4882a593Smuzhiyunrm -rf $test_dir/test_log.txt 66*4882a593Smuzhiyunmkdir -p $dest_dir 67*4882a593Smuzhiyunmkdir -p $md5_dir 68*4882a593Smuzhiyunmkdir -p $source_dir 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun#generate 5MB random file 71*4882a593Smuzhiyunrm -rf $source_dir/* 72*4882a593Smuzhiyunfile_path=$source_dir 73*4882a593Smuzhiyunfile_size=(512 1024 3456 512 1024 3456) 74*4882a593Smuzhiyunfile_radio=(5 5 5 5 5 5) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyunfunction random() 77*4882a593Smuzhiyun{ 78*4882a593Smuzhiyun min=$1 79*4882a593Smuzhiyun max=$2 80*4882a593Smuzhiyun num=`date +%s` 81*4882a593Smuzhiyun ((value=$num%($max-$min)+$min+1)) 82*4882a593Smuzhiyun echo $value 83*4882a593Smuzhiyun} 84*4882a593Smuzhiyun 85*4882a593Smuzhiyunfile_size_count=${#file_size[*]} 86*4882a593Smuzhiyunfile_radio_count=${#file_radio[*]} 87*4882a593Smuzhiyun 88*4882a593Smuzhiyunif [ $file_size_count=$file_radio_count ] 89*4882a593Smuzhiyunthen 90*4882a593Smuzhiyun for ((i=0;i <$file_size_count;i++)) 91*4882a593Smuzhiyun do 92*4882a593Smuzhiyun for ((n=0;n <${file_radio[$i]};n++)) 93*4882a593Smuzhiyun do 94*4882a593Smuzhiyun if [ $i==0 ] 95*4882a593Smuzhiyun then 96*4882a593Smuzhiyun rand=$(random 0 ${file_size[$i]}) 97*4882a593Smuzhiyun else 98*4882a593Smuzhiyun rand=$(random ${file_size[$i-1]} ${file_size[$i]}) 99*4882a593Smuzhiyun fi 100*4882a593Smuzhiyun dd if=/dev/urandom of=$file_path/test.$i.$rand.bin bs=$rand count=1024 101*4882a593Smuzhiyun done 102*4882a593Smuzhiyun echo =========== 103*4882a593Smuzhiyun done 104*4882a593Smuzhiyunfi 105*4882a593Smuzhiyun 106*4882a593Smuzhiyuncd $source_dir 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun#find ./ -type f -print0 | xargs -0 md5sum | sort > $md5_dir/source.md5 109*4882a593Smuzhiyunmd5sum ./* > $md5_dir/source.md5 110*4882a593Smuzhiyuncd / 111*4882a593Smuzhiyunwhile [ $count -lt $test_max_count ]; do 112*4882a593Smuzhiyun echo $count 113*4882a593Smuzhiyun echo $count >> $test_dir/test_log.txt 114*4882a593Smuzhiyun dir_loop=0 115*4882a593Smuzhiyun while [ $dir_loop -lt $test_max_dir ]; do 116*4882a593Smuzhiyun echo "$count test $source_dir to $dest_dir/${dir_loop}" 117*4882a593Smuzhiyun rm -rf $dest_dir/$dir_loop 118*4882a593Smuzhiyun if [ $? == 0 ]; then 119*4882a593Smuzhiyun echo "$count clean $dest_dir/${dir_loop} success" 120*4882a593Smuzhiyun echo "$count clean ${dir_loop}" >> $test_dir/test_log.txt 121*4882a593Smuzhiyun else 122*4882a593Smuzhiyun echo "$count clean $dest_dir/${dir_loop} error" 123*4882a593Smuzhiyun echo "$count clean $dest_dir/${dir_loop} error" >> $test_dir/test_log.txt 124*4882a593Smuzhiyun exit 0 125*4882a593Smuzhiyun fi 126*4882a593Smuzhiyun #sync 127*4882a593Smuzhiyun #sleep 1 128*4882a593Smuzhiyun #start copy data 129*4882a593Smuzhiyun echo "$count $dir_loop start copy data" 130*4882a593Smuzhiyun cp -rf $source_dir $dest_dir/$dir_loop 131*4882a593Smuzhiyun if [ $? == 0 ]; then 132*4882a593Smuzhiyun echo "$count cp $source_dir to $dest_dir/${dir_loop} success" 133*4882a593Smuzhiyun echo "$count cp ${dir_loop}" >> $test_dir/test_log.txt 134*4882a593Smuzhiyun else 135*4882a593Smuzhiyun echo "$count cp $source_dir to $dest_dir/${dir_loop} error" 136*4882a593Smuzhiyun echo "$count cp $source_dir to $dest_dir/${dir_loop} error" >> $test_dir/test_log.txt 137*4882a593Smuzhiyun fi 138*4882a593Smuzhiyun #sync 139*4882a593Smuzhiyun #sleep 1 140*4882a593Smuzhiyun dir_loop=$(($dir_loop+1)) 141*4882a593Smuzhiyun done 142*4882a593Smuzhiyun dir_loop=0 143*4882a593Smuzhiyun sync && echo 3 > /proc/sys/vm/drop_caches 144*4882a593Smuzhiyun sleep 5 145*4882a593Smuzhiyun sync 146*4882a593Smuzhiyun echo 3 > /proc/sys/vm/drop_caches 147*4882a593Smuzhiyun sleep 5 148*4882a593Smuzhiyun while [ $dir_loop -lt $test_max_dir ]; do 149*4882a593Smuzhiyun #calc dir md5 150*4882a593Smuzhiyun echo "$count calc $dest_dir/${dir_loop} md5 start" 151*4882a593Smuzhiyun echo "$count calc $dest_dir/${dir_loop} md5 start" >> $test_dir/test_log.txt 152*4882a593Smuzhiyun cd $dest_dir/${dir_loop} 153*4882a593Smuzhiyun #find ./ -type f -print0 | xargs -0 md5sum | sort > $md5_dir/dest${dir_loop}.md5 154*4882a593Smuzhiyun md5sum ./* > $md5_dir/dest${dir_loop}.md5 155*4882a593Smuzhiyun cd / 156*4882a593Smuzhiyun #cmp with src md5 157*4882a593Smuzhiyun diff $md5_dir/source.md5 $md5_dir/dest${dir_loop}.md5 158*4882a593Smuzhiyun if [ $? == 0 ]; then 159*4882a593Smuzhiyun echo "$count check source to $dest_dir/${dir_loop} success" 160*4882a593Smuzhiyun echo "$count check ${dir_loop}" >> $test_dir/test_log.txt 161*4882a593Smuzhiyun rm $md5_dir/dest${dir_loop}.md5 162*4882a593Smuzhiyun rm -rf $dest_dir/$dir_loop 163*4882a593Smuzhiyun else 164*4882a593Smuzhiyun echo "$count check source to $dest_dir/${dir_loop} error" 165*4882a593Smuzhiyun echo "$count check source to $dest_dir/${dir_loop} error" >> $test_dir/test_log.txt 166*4882a593Smuzhiyun exit 0 167*4882a593Smuzhiyun fi 168*4882a593Smuzhiyun dir_loop=$(($dir_loop+1)) 169*4882a593Smuzhiyun done 170*4882a593Smuzhiyun count=$(($count+1)) 171*4882a593Smuzhiyun #if test fail, we can save file for debug 172*4882a593Smuzhiyun #rm -rf $test_dir/$dest_dir/* 173*4882a593Smuzhiyun echo ----------------------------------------- 174*4882a593Smuzhiyun echo "-------========You can see the result at and $test_dir/test_log.txt file=======------------" 175*4882a593Smuzhiyun echo ----------------------------------------- >> $test_dir/test_log.txt 176*4882a593Smuzhiyundone 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun echo "-------copy and check success------------" 179*4882a593Smuzhiyun echo "-------copy and check success------------" >> $test_dir/test_log.txt 180*4882a593Smuzhiyun echo "-------========You can see the result at and $test_dir/test_log.txt file=======------------" 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun 186