There is a dd test that floats around the PostgreSQL lists, so I wrote this simple script to automate it - use at your own risk!
#!/bin/bash
# do something which parses command line parameters
DEFAULT_BLOCK=8 DEFAULT_PATH=/data/tmp DEFAULT_FILE=ddfile
helpme() { echo "Usage: $0 [RAM=x] [PATH=/foo/bar] [FILE=foo] [BLOCKSIZE=X]" echo "Runs a dd test on disk subsystem to benchmark I/O speed" echo " BLOCKSIZE - given in K. Should be no need to change" echo " default is 8 which is what PostgreSQL uses" echo " RAM - must be specified in Gigs" echo " default is to use output of 'free' command" echo " PATH - where do you want the files created? i.e. which filesystem do you want tested?" echo " default is $DEFAULT_PATH" echo " FILE - file name to create in test. Really makes no difference." echo " default is $DEFAULT_FILE" exit 1 }
default_ram() { MYB=`free | grep Mem: | awk '{print $2}'` ((MYG=MYB/1000/1000)) export MYGIGS=$MYG echo "RAM not specified - assuming ${MYB}/${MYGIGS}G" }
default_path() { export MYPATH=$DEFAULT_PATH echo "PATH not specified - using default $MYPATH" }
default_file() { export MYFILE=$DEFAULT_FILE echo "FILE not specified - using default $MYFILE" }
default_block() { export MYBLOCK=$DEFAULT_BLOCK echo "BLOCKSIZE not specified - using default $MYBLOCK" }
RAMGIVEN=0 PATHGIVEN=0 FILEGIVEN=0 BLOCKGIVEN=0
while [ $# -gt 0 ] do MYVAR=`echo $1 | awk -F= '{print $1}'` MYVAL=`echo $1 | awk -F= '{print $2}'`
case $MYVAR in BLOCKSIZE) MYBLOCK=$MYVAL BLOCKGIVEN=1 ;;
RAM) MYGIGS=$MYVAL RAMGIVEN=1 ;;
PATH) MYPATH=$MYVAL PATHGIVEN=1 ;;
FILE) MYFILE=$MYVAL FILEGIVEN=1 ;;
-h|-help|--h|--help) helpme ;;
*) echo "ERROR : unknown parameter [${MYVAR}]" ;; esac
shift done
[[ $RAMGIVEN -eq 0 ]] && default_ram [[ $PATHGIVEN -eq 0 ]] && default_path [[ $FILEGIVEN -eq 0 ]] && default_file [[ $BLOCKGIVEN -eq 0 ]] && default_block
PATH_EXISTS=0 [[ -d $MYPATH ]] && PATH_EXISTS=1
echo "[$MYGIGS][$MYPATH][$MYFILE][$PATH_EXISTS]"
mkdir -p $MYPATH pushd $MYPATH
df .
FREESPACE=`df . | tail -1 | awk '{print $4}'`
BLOCKSPERGIG=125000
((ONCERAM=BLOCKSPERGIG*MYGIGS)) ((TWICERAM=2*BLOCKSPERGIG*MYGIGS)) ((THRICERAM=3*BLOCKSPERGIG*MYGIGS*MYBLOCK))
echo "Have:$FREESPACE, Need:$THRICERAM (3x RAM)"
if [ $THRICERAM -ge $FREESPACE ] then echo "ERROR: not enough room on disk" echo "Have:$FREESPACE, Need:$THRICERAM (3x RAM)" exit 2 fi
DDCOM="dd if=/dev/zero of=${MYFILE} bs=8k count=${TWICERAM} && sync" echo $DDCOM
time sh -c "$DDCOM" DDCOM="dd if=/dev/zero of=${MYFILE}2 bs=8K count=${ONCERAM}" echo $DDCOM $DDCOM
DDCOM="dd if=${MYFILE} of=/dev/null bs=8k" echo $DDCOM time $DDCOM
rm -f ${MYFILE} rm -f ${MYFILE}2 [[ $PATH_EXISTS -eq 0 ]] && rmdir $MYPATH
popd